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

Why can't LEX/YACC be used to parse C++ for a compiler?

本文关键字:编译器 C++ YACC 不能 LEX 为什么      更新时间:2023-10-16

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

当然可以使用lex和yacc来解析c++,但是您还需要许多其他机制。gcc曾经使用基于yacc的解析器,但它被手工构建的递归下降解析器所取代,该解析器被认为更容易维护,并且更容易生成有意义的语法错误。Clang使用一个手工构建的递归下降解析器,原因大致相同。

Bison可以构建GLR解析器,这使得探索替代解析(消除歧义规则所必需的)变得容易得多。参见Ira Baxter对"GCC和Clang解析器真的是手写的吗?"关于c++的GLR解析。

关于gcc和clang的一些背景知识,请参见Matthew Slattery的回答中的链接;特别是,在gcc wiki上可以找到2008年替换gcc中旧的yacc解析器的成本和收益摘要(链接复制自Matthew Slattery)。