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

5

我知道LEX/YACC不能用于C++,但我还没有找到一个好的、简明扼要的解释原因的说明。我也想知道是否可以使用LEX/YACC来解析Objective C,或者这种语言是否存在同样的问题。(注意,我的意思是ObjC,而不是Obj-C++。)谢谢。


https://dev59.com/sHI-5IYBdhLWcg3wN1lD - Matt Ball
3
这个工具不适合这项工作。YACC是一种LALR解析器,而C++ 实际上需要一种递归下降解析器。你可能可以用锤子拧螺丝,但结果不会很好看,而且需要额外付出很多努力。 - David Schwartz
1
@DavidSchwartz:C++并不需要递归下降解析器。它可以使用几乎任何解析器技术来实现。问题是,“需要多少修改?”。 - Ira Baxter
1
@DavidSchwartz:你是在(错误地)断言C++ 需要 递归下降。用递归下降做并不漂亮。GLR解决方案更漂亮、更容易,而且没有任何黑客行为。 - Ira Baxter
1个回答

2
当然可以使用lex和yacc来解析C++,但是还需要很多其他的机制。曾经,gcc使用了基于yacc的解析器,但是它被手动构建的递归下降解析器所取代,这被认为更容易维护,也使得生成有意义的语法错误更简单。clang出于同样的原因使用了手动构建的递归下降解析器。
Bison可以构建GLR解析器,这使得探索可供选择的解析变得更加容易(这对于消歧规则是必要的)。关于C++的GLR解析,请参见Ira Baxter在Are GCC and Clang parsers really handwritten?中的回答。
此外,请查看Matthew Slattery在同一问题的回答中提供的链接,特别是在gcc wiki上找到了2008年替换旧的yacc解析器所感知到的成本和收益的总结。

1
当gcc的人说某个东西更容易维护时,应该带着一颗大钠盐颗粒来接受这种说法。 - Kaz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接