为什么编译器不能使用 LEX/YACC 来解析 C++?

Pop*_*ppy 5 c++ compiler-construction yacc bison

我知道这是有原因的,但我还没有找到一个好的、简洁的解释来解释为什么 LEX/YACC 不能用于 C++。我也有兴趣知道 LEX/YACC 是否可以用来解析 Objective C,或者该语言是否遇到同样的问题。(请注意,我指的是 ObjC,而不是 Obj-C++。)谢谢。

ric*_*ici 2

当然可以使用 lex 和 yacc 来解析 c++,但您还需要很多其他机制。曾经,gcc 使用基于 yacc 的解析器,但它被替换为手工构建的递归下降解析器,该解析器被认为更易于维护,并且使得生成有意义的语法错误更简单。出于同样的原因,clang 使用手工构建的递归下降解析器。

Bison 可以构建 GLR 解析器,这使得探索替代解析变得更加容易(对于消歧规则来说是必需的)。请参阅 Ira Baxter 对“ GCC 和 Clang 解析器真的是手写的吗?”的回答。有关 C++ GLR 解析的一些见证。

另请参阅 Matthew Slattery 对同一问题的回答中的链接,了解有关 gcc 和 clang 的一些背景信息;特别是,在gcc wiki上可以找到 2008 年替换 gcc 中旧的 yacc 解析器的成本和收益摘要(链接从 Matthew Slattery 复制)。