哪个词法分析器/解析器生成器对于 C 或 C++ 来说是最好的(最容易使用、最快的)?我现在正在使用 flex 和 bison,但 bison 只处理 LALR(1) 语法。我正在解析的语言实际上并不需要无限前瞻,但无限前瞻会使解析变得容易得多。我应该尝试 Antlr 吗?可可/R?猎鹿犬?还有什么?
7 回答
2015 年 1 月 5日更新:
我的原始答案指向一个现已删除的问题:
在你推荐什么解析器生成器中已经有很多关于这个问题的好答案
因此,我从archive.org 上的已删除答案中获取了项目列表,其中至少有 1 票:
我自己已经完成了几个 flex/bison 系统,但现在我会用sqlite 的Lemon替换它们,因为它是一个工具,可重入和线程安全,并且具有基于流/拉的模型。
坏消息是大多数真正的计算机语言不是“LALR(1)”,这意味着你必须求助于相当多的黑客才能让 YACC 解析真正的语言。
如果您正在设计 DSL,则可以使用任何 LALR 解析器生成器而不会遇到很多麻烦,因为您可以在解析器生成器发出声音时更改 DSL 的语法。出于同样的原因,LL 解析器生成器也大多在这里工作,但缺少左递归可能是一个真正的痛苦。
如果您喜欢自己的语法,那么 GLR 解析器就是不折不扣的赢家。我们在DMS Software Reengineering Toolkit中使用它们,并为包括 C++ 在内的 30 多种语言构建了生产质量解析器,C++ 有一个民间定理说它几乎不可能解析。民间定理是由使用 LL 和 LALR 解析器来尝试处理 C++ 的人们开始的。GLR 很容易做到。
ANTLR 使用 'backtrack' 选项使无限前瞻变得非常容易。它还可能符合您的“最容易使用、最快”的标准,因为它具有 ANTLRWORKS,可让您可视化和调试语法。
另一个优点是,它内置了对构建 AST 的支持,这使得构建 AST 变得非常容易,而这在 bison 中是缺失的。
出版了两本书——“ANTLR: Definitive guide”和“Language design patterns”,它是可用的工具之一。您还有一个非常活跃的邮件列表。
我不知道您到底在寻找什么,但我认为 Boost Xpressive值得一看...
不完全是解析器生成器,而是处理语法的好工具,我觉得它可以处理奇怪的语法。
我一直在使用 GOLD 解析系统 ( http://www.devincook.com/goldparser ),结果非常好。我的项目很小,是一个 C 语言的 NC 文件解析系统。但我认为该工具也可以处理更复杂的项目。
最新的野牛声称可以通过(实际上)同时进行多个解析来进行无限前瞻。如果您已经对野牛进行了投资,那么可能值得尝试一下,而不是切换到另一个包。
http://www.gnu.org/software/bison/manual/bison.html#GLR-Parsers
不过,我自己并没有使用过这个功能。
至于其他系统,我使用过 ANTLR。我不是特别喜欢它(文档不是很好,必须手动考虑语法以适应运算符优先级),但它确实有效,而且很多人都发誓它当然值得一看。
LRSTAR 9.1可以生成 LR(1) 和 LR(*) 解析器。它是一个基于 C++ 的系统,对 Windows 和 Visual Studio 很友好。它创建了表驱动的解析器和表驱动的词法分析器,它们体积小且编译速度快。LRSTAR 解析器可以自动构建 AST。