如何用C++从语法文件创建解析器是最佳方法?
boost::spirit
- 使用 boost::spirit
构建的解析器的编译时间往往会变得非常长,即使是非常小的更改也会让人感到非常痛苦(因为整个过程都是用模板完成的)。 - a_m0d这取决于语法的复杂程度。我倾向于使用手写的递归下降分析器(recursive descent parsers),尽管也有可能从语法描述中生成一个递归下降分析器。
如果你要使用解析器生成器,那么有两个非常好的选择:Byacc和Antlr。如果你想要一个(相当)兼容yacc的东西,Byacc是(远远)最好的选择;如果你从头开始,既没有现有的代码,也没有使用与yacc兼容性更高的经验,那么Antlr几乎肯定是您最好的选择。
因为提到了Bison,我也会谈一些它的问题。我会像避开瘟疫一样避开Bison。Brooks 的建议“计划扔掉一个”在这里适用。Robert Corbett(Byacc 的作者)将 Bison 作为他的第一个解析器生成器。不幸的是,他把它交给了 GNU 而不是扔掉。在市场营销胜过技术卓越的经典案例中,虽然 Byacc 相对较为鲜为人知,但 Bison 被广泛使用(甚至被一些不了解情况的人推荐)。
还提到了 Spirit。我发现早期版本令人沮丧(编译时间慢,即使是小错误也会导致大量的模板错误消息)。我听说新版本有所改进,但是我最近没有试过它,因此无法对最近的版本做出任何有意义的评价。
你看过Lex and Yacc吗?引用链接文档的第5部分:
我喜欢生成一个普通 C 文件的方式来制作 C++ 解析器,并让 YACC 生成 C++ 代码。当您链接应用程序时,可能会遇到一些问题,因为默认情况下 C++ 代码无法找到 C 函数,除非您告诉它这些函数是 extern "C"。