C++创建一个解析器。

9

如何用C++从语法文件创建解析器是最佳方法?


5
“file with grammar”的格式是什么? - CB Bailey
2
https://dev59.com/x3VD5IYBdhLWcg3wXaed 是关于编译器和解释器的规范问题。那里有许多好的链接。如果想要手动构建递归下降方法,请查看Crenshaw教程。 - dmckee --- ex-moderator kitten
6个回答

18

我赞同。Boost文档真的很有帮助。 - anno
2
如果您计划使用一个相当大的编译器,我建议不要使用 boost::spirit - 使用 boost::spirit 构建的解析器的编译时间往往会变得非常长,即使是非常小的更改也会让人感到非常痛苦(因为整个过程都是用模板完成的)。 - a_m0d

10

这取决于语法的复杂程度。我倾向于使用手写的递归下降分析器(recursive descent parsers),尽管也有可能从语法描述中生成一个递归下降分析器。

如果你要使用解析器生成器,那么有两个非常好的选择:Byacc和Antlr。如果你想要一个(相当)兼容yacc的东西,Byacc是(远远)最好的选择;如果你从头开始,既没有现有的代码,也没有使用与yacc兼容性更高的经验,那么Antlr几乎肯定是您最好的选择。

因为提到了Bison,我也会谈一些它的问题。我会像避开瘟疫一样避开Bison。Brooks 的建议“计划扔掉一个”在这里适用。Robert Corbett(Byacc 的作者)将 Bison 作为他的第一个解析器生成器。不幸的是,他把它交给了 GNU 而不是扔掉。在市场营销胜过技术卓越的经典案例中,虽然 Byacc 相对较为鲜为人知,但 Bison 被广泛使用(甚至被一些不了解情况的人推荐)。

还提到了 Spirit。我发现早期版本令人沮丧(编译时间慢,即使是小错误也会导致大量的模板错误消息)。我听说新版本有所改进,但是我最近没有试过它,因此无法对最近的版本做出任何有意义的评价。


8

flexbison。它们是Lex&Yacc的近亲,考虑了c++的存在。


3

你看过Lex and Yacc吗?引用链接文档的第5部分:

我喜欢生成一个普通 C 文件的方式来制作 C++ 解析器,并让 YACC 生成 C++ 代码。当您链接应用程序时,可能会遇到一些问题,因为默认情况下 C++ 代码无法找到 C 函数,除非您告诉它这些函数是 extern "C"。


Lex和Yacc已被Flex和Bison所取代。 - Martin York

2
创建解析器的最佳方式是使用lex和yacc。

3
没有人能回答“最好”的问题,但你非常接近了——lex&yacc的表亲flex&bison确实考虑了C++。 - Michael Krelin - hacker
我原以为这个问题是关于如何在C++中手写解析器的。 - Dima

2
我用过bison,发现它的例子非常适合我的水平。我能够用它创建一个简单的计算器,当然它还可以做更多的事情。
例如,计算器可以处理1+2*3,并构建出一个语法树。然而,文档没有描述如何构建这棵树,所以我花了一点时间来弄清楚。
如果我再来一次,我会研究一下“antlr”,因为它看起来很好,而且受到了良好的支持。
马丁。

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