为什么GCC从Bison切换到C ++和C的递归下降解析器?


10

是否有需要的语言更改或某种实际的原因,使得Bison不再合适或不理想?

我在Wikipedia上看到它们切换了,参考了GCC 3.4GCC 4.1发行说明。

这些发行说明指出:

手写递归下降C ++解析器已替换了以前的GCC版本中的YACC派生的C ++解析器。新的解析器包含改进的基础结构,这些基础结构可用于更好地解析C ++源代码,扩展的处理以及适当语义分析和解析之间的清晰分隔(如果可能)。新的解析器修复了旧解析器中发现的许多错误。

和:

旧的基于Bison的C和Objective-C解析器已被新的更快的手写递归下降解析器取代

我想知道的是他们遇到了什么实际问题,以及为什么使用Bison不可能/不切实际解决问题


1
最终,当解析器生成器无法满足要求时,经过足够的修改,所有解析器都将变成自制软件
棘手怪胎

1
分享您的研究成果对所有人都有帮助。告诉我们您尝试过的内容以及为什么它不能满足您的需求。这表明您已经花了一些时间来帮助自己,这使我们免于重复显而易见的答案,并且最重要的是,它可以帮助您获得更具体和相关的答案。另请参见“ 如何问”
2014年

1
@gnat我扩展了我的问题
neelsg 2014年

1
与大多数其他编程语言相比,C ++是一种异常复杂的语言。我的直觉是通用解析器可能无法支持自制解析器可以使用的某些优化。

Answers:


16

GCC切换到手写解析,因为使用递归下降技术时错误消息更有意义,如我在此处所述

同样,C ++正在成为一种(从语法上)复杂的语言来进行分析,以至于使用分析器生成器并不值得。

最后,真正的编译器的大部分工作不是解析,而是优化。GCC中端优化过程比其解析复杂得多。

(顺便说一句,您可以自定义GCC,例如使用插件或使用MELT,但是您不能真正扩展它接受的语言的语法-除非添加属性和编译指示)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.