编译器中的 Yacc 和 Lex,“和”?

Yacc and Lex in compiler, "and"?

提问人:irmoah80 提问时间:11/14/2023 更新时间:11/14/2023 访问量:26

问:

为什么 yacc 和 lex 是分开的?

我的意思是,为什么 c 程序员不将它们一起设计?

例如,我们可以一起制作 lex-yacc 工具吗?

Flexbox Bison YACC 莱克斯

评论


答:

0赞 Piotr Siupa 11/14/2023 #1

它们是分开的,因为它们在单独使用时也很有用。他们的维护者不想通过将其合并到一个工具中来限制它们。

例如,我曾经使用 Lex 编写过一个取消转义字符串的函数。它不处理任何类型的结构化数据,也不需要解析器来使用它。

说到 Yacc,它并不需要 Lex。它可以接受任何返回 . 有些语言很容易找到标记,而且你不需要 Lex 创建的整个复杂的状态机。 或者,您可能希望分析一些首先不是文本的数据源。(例如,令牌是由某种算法生成的。int

另一个原因是这两个程序是由不同的作者在不同的时间独立开发的。 我认为 Lex 的语法基于 Yacc,当时 Yacc 或多或少已经完成。 后来,它们一起使用成为一种既定的行业标准,它们的开发人员正试图保持它们的语法有些相似。然而,创建一个统一的工具会带来一大堆版权和所有权问题。

当然,如果有人在这一点上尝试更改任何内容,则存在向后兼容性问题的问题。

评论

0赞 irmoah80 11/15/2023
谢谢,你说“一些首先不是文本的数据源。(例如,代币是由某种算法生成的。 ,你能解释一下吗?
0赞 Piotr Siupa 11/16/2023
例如,您可以在词法分析器和解析器之间放置一些中间人函数,以某种方式更改标记。类似于 C 预处理器。举个更突出的例子,如果你有一个程序生成一些代码,另一个程序读取它,理论上你可以去掉中间人,根本没有真正的代码,只有令牌。