为什么 yacc 和 lex 是分开的?
我的意思是为什么 C 程序员不把它们设计在一起?
例如,我们可以一起制作lex-yacc工具吗?
将它们分开是因为它们在单独使用时也很有用。他们的维护者不想通过将其合并到一个工具中来限制他们。
例如,我曾经使用 Lex 编写过一个对字符串进行非转义的函数。它不处理任何类型的结构化数据,也不需要解析器来配合它。
对于Yacc来说,它并不真正需要Lex。它可以采用任何返回
int
的函数。
在某些语言中,很容易找到标记,并且您不需要 Lex 创建的整个复杂状态机。
或者您可能想首先解析一些不是文本的数据源。 (例如,令牌是通过某种算法生成的。)
另一个原因是这两个程序是由不同的作者在不同的时间独立开发的。 我认为 Lex 的语法是基于 Yacc 的,当时 Yacc 已经或多或少地完成了。 后来它们一起使用成为了一个既定的行业标准,并且它们的开发人员试图保持它们的语法有些相似。然而,创建一个统一的工具会带来一系列版权和所有权问题。
如果有人试图在这一点上改变任何东西,当然会存在向后兼容性问题。