从带有语法的文件创建 C++ 解析器的最佳方法是什么?

有帮助吗?

解决方案

您可能还想查看这些链接:

其他提示

这在很大程度上取决于语法。我倾向于喜欢递归下降解析器,它通常是手工编写的(尽管可以根据语法描述生成一个解析器)。

如果您要使用解析器生成器,那么确实有两个不错的选择:Byacc 和 Antlr。如果您想要与 yacc(合理)兼容的东西,Byacc(到目前为止)是您的最佳选择。如果您从头开始,既没有现有代码,也没有使用与 yacc 兼容的经验,那么 Antlr 几乎肯定是您的最佳选择。

既然已经提到了,我还要谈谈 Bison。我会像躲避瘟疫一样躲避野牛。布鲁克斯关于“计划扔掉一个”的建议也适用于此。Robert Corbett(Byacc 的作者)编写了 Bison,作为他对解析器生成器的第一次尝试。不幸的是,他没有把它扔掉,而是把它交给了 GNU。在营销击败技术卓越的经典案例中,Bison 被广泛使用(甚至被那些不太了解的人推荐),而 Byacc 仍然相对默默无闻。

编辑:我不想这样做,但既然也有人提到了,我也会对 Boost.spirit 发表评论。虽然这可能是模板元编程最酷的例子,但它有几个问题,导致我建议不要尝试认真使用它。

  1. 它的编译时间可能会令人难以忍受——10 分钟是常见的,更大/更复杂的语法可能需要更长的时间(假设它不会使编译器崩溃)。
  2. 如果您犯了任何错误,它可能并且经常会产生非常长的错误消息,而这些消息几乎无法破译。无论如何,来自模板密集型代码的错误消息是出了名的糟糕,而 Spirit 对系统的压力几乎超过了其他任何事情。

相信我:事实上,你可以写出像 Spirit 这样的东西,这正好处于令人印象深刻和令人惊叹的边界之间——但只有当我确定我正在处理的语法是(并且将永远保留)时,我仍然只会使用它 相当 小而简单。

柔性野牛. 。Lex&Yacc 确实考虑了 c++ 的存在。

让你看着 Lex和Yacc 的?从链接的文档的部分5引述如下:

  

我让一个C优选方式++解析器   是拥有莱克斯生成纯C   文件,并让YACC生成C ++   码。当那么你的链接   应用程序,你可能会碰到一些   问题,因为C ++代码由   默认情况下将无法找到C ^   功能,除非你告诉它   这些功能是为extern “C”。

我用野牛,发现例子正好适合我的水平。能够创建一个简单的计算器吧,当然也可以做更多的事情。

计算器耗时1 + 2 * 3例如建成了语法树。该文件没有描述然而如何建立树,我花了一点时间来解决。

如果我再次去我会考虑“ANTLR”,因为它看起来很好,很好的支持。

马丁。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top