从具有语法的文件中创建 C++ 解析器的最佳方法是什么?
6 回答
这在很大程度上取决于语法。我倾向于喜欢递归下降解析器,它们通常是手工编写的(尽管可以从语法描述中生成一个)。
如果要使用解析器生成器,确实有两个不错的选择:Byacc 和 Antlr。如果您想要与 yacc (合理)兼容的东西,那么 Byacc 是(到目前为止)您的最佳选择。如果您是从头开始,既没有现有代码也没有经验支持使用与 yacc 兼容的东西,那么 Antlr 几乎肯定是您的最佳选择。
既然已经提到了,我还要谈谈 Bison。我会像瘟疫一样避免野牛。布鲁克斯关于“计划扔掉一个”的建议在这里适用。Robert Corbett(Byacc 的作者)写了 Bison 作为他对解析器生成器的第一次尝试。不幸的是,他没有把它扔掉,而是把它交给了 GNU。在营销击败技术卓越的经典案例中,Bison 被广泛使用(甚至被那些不了解的人推荐),而 Byacc 仍然相对晦涩难懂。
编辑:我讨厌这样做,但由于它也被提及,我也会评论 Boost.spirit。虽然这可能是最酷的模板元编程示例,但它有几个问题导致我建议不要尝试将其投入使用。
- 使用它的编译时间可能会令人痛苦——10 分钟很常见,而更大/更复杂的语法可能需要更长的时间(假设它不会使编译器崩溃)。
- 如果你犯了任何错误,它可能并且经常会产生非常长的错误消息,几乎不可能破译。无论如何,来自大量模板代码的错误消息都是出了名的糟糕,Spirit 对系统的压力几乎超过了其他任何事情。
相信我:你可以写出像 Spirit 这样的东西,这正好在令人印象深刻和令人惊叹之间的边界上——但我仍然只会在我确定我正在处理的语法是(并且将永远保持)的情况下使用它相当小而简单。
你看过Lex 和 Yacc吗?引用链接文档的第 5 节:
我制作 C++ 解析器的首选方法是让 Lex 生成一个纯 C 文件,并让 YACC 生成 C++ 代码。然后,当您链接您的应用程序时,您可能会遇到一些问题,因为默认情况下 C++ 代码将无法找到 C 函数,除非您告诉它这些函数是 extern "C"。
创建解析器的最好方法是使用 lex 和 yacc。
我用过bison,发现这些例子正好适合我的水平。能够用它创建一个简单的计算器,当然它可以做更多的事情。
计算器以 1+2*3 为例,构建了一个语法树。然而,文档没有描述如何构建树,这花了我一点时间来解决。
如果我再去一次,我会考虑“antlr”,因为它看起来不错并且得到了很好的支持。
马丁。