我知道有一个原因,但我还没有找到一个很好的,简明的解释,为什么LEX/YACC不能用于C++。 我也很想知道LEX/YACC是否可以用来解析客观C,或者该语言是否遭受同样的问题。 (请注意,我的意思是ObjC,而不是Obj-C++。) 谢谢。为什么不能使用LEX/YACC来为编译器解析C++?
3
A
回答
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
相关问题
- 1. 为什么编译器不能解析方法覆盖?
- 2. 为什么编译器不能将此调用解析为模板函数?
- 3. 为什么编译器不能解析“a作为u32 <b”或类似的?
- 4. 为什么不能编译?
- 5. 为什么这段代码不能用MS编译器编译?
- 6. 为什么我不能用OpenBSD编译?
- 7. 为什么Jericho解析器不能解析这个HTML代码?
- 8. 为什么C编译器不能捕获这个错误?
- 9. 为什么C++编译器不能推断模板参数?
- 10. C++,为什么编译器不接受此功能
- 11. 为什么不能C#编译器贯彻switch语句
- 12. 什么是一个好的C#编译器 - 编译器/解析器生成器?
- 13. 为什么C++编译器在参数中不使用const时编译失败?
- 14. 为什么来自IBM XL C/C++编译器的警告?
- 15. 为什么使用XML解析器?
- 16. 为什么CMake检查C++编译器?
- 17. 为什么[] mutable {}不能编译?
- 18. 为什么Linq不能编译?
- 19. 为什么我不能编译opencv?
- 20. 为什么这个CRTP不能编译?
- 21. 为什么程序不能编译?
- 22. 为什么不能编译reinterpret_cast?
- 23. 编译器错误:“光标不能解析为一个类型”
- 24. 为什么我不能解析“+1”int?
- 25. 为什么Restkit不能正确解析?
- 26. 为什么Scrapy不能抓取/解析?
- 27. 为什么我的.c编码不能在GCC中编译?
- 28. 编译器为什么不优化?
- 29. 为什么不编译?
- 30. 为什么不编译?
http://stackoverflow.com/q/1961604/139010 – 2013-05-07 03:04:21
这只是工作的错误工具。 YACC是[LALR解析器](http://en.wikipedia.org/wiki/LALR_parser),C++确实需要[递归下降解析器](http://en.wikipedia.org/wiki/Recursive_descent_parser)。你或许可以用锤子把螺丝钉拧进去,但结果不会很好,而且会花费很多额外的工作。 – 2013-05-07 03:14:32
@DavidSchwartz:C++不需要*递归下降解析器。它几乎可以用任何解析器技术来实现。问题是,“多少黑客?”。 – 2013-05-07 07:08:21