2013-05-07 75 views
3

我知道有一个原因,但我还没有找到一个很好的,简明的解释,为什么LEX/YACC不能用于C++。 我也很想知道LEX/YACC是否可以用来解析客观C,或者该语言是否遭受同样的问题。 (请注意,我的意思是ObjC,而不是Obj-C++。) 谢谢。为什么不能使用LEX/YACC来为编译器解析C++?

+0

http://stackoverflow.com/q/1961604/139010 – 2013-05-07 03:04:21

+3

这只是工作的错误工具。 YACC是[LALR解析器](http://en.wikipedia.org/wiki/LALR_parser),C++确实需要[递归下降解析器](http://en.wikipedia.org/wiki/Recursive_descent_parser)。你或许可以用锤子把螺丝钉拧进去,但结果不会很好,而且会花费很多额外的工作。 – 2013-05-07 03:14:32

+0

@DavidSchwartz:C++不需要*递归下降解析器。它几乎可以用任何解析器技术来实现。问题是,“多少黑客?”。 – 2013-05-07 07:08:21

回答

2

当然可以使用lex和yacc来解析C++,但是你也需要很多其他的机器。有一段时间,gcc使用了一个基于yacc的解析器,但它被一个手工构建的递归下降解析器所取代,这个解析器被认为更容易维护,并且这使得生成有意义的语法错误更简单。 clang使用手工构建的递归下降解析器的原因大同小异。

Bison可以构建GLR解析器,这使得探索替代解析(消歧规则所必需)变得更容易。请参阅Ira Baxter对Are GCC and Clang parsers really handwritten?的回答,以获取关于C++的GLR解析的一些证词。

另请参阅Matthew Slattery对gcc和clang某些背景的同一问题的回答中的链接;特别是,在2008年发现的用于替换gcc中的旧yacc解析器的成本和收益摘要见gcc wiki(从Matthew Slattery复制的链接)。

+0

当海湾合作委员会的人说容易维护的东西时,应该采用大量的钠颗粒。 – Kaz 2013-06-09 05:07:41