9

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

4

6 回答 6

18

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

于 2009-12-03T22:38:18.150 回答
9

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

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

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

编辑:我讨厌这样做,但由于它也被提及,我也会评论 Boost.spirit。虽然这可能是最酷的模板元编程示例,但它有几个问题导致我建议不要尝试将其投入使用。

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

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

于 2009-12-03T22:59:01.463 回答
8

flexbison。Lex&Yacc 表兄弟确实考虑了 c++ 的存在。

于 2009-12-03T22:42:01.563 回答
3

你看过Lex 和 Yacc吗?引用链接文档的第 5 节:

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

于 2009-12-03T22:42:13.337 回答
2

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

于 2009-12-03T22:42:19.767 回答
2

我用过bison,发现这些例子正好适合我的水平。能够用它创建一个简单的计算器,当然它可以做更多的事情。

计算器以 1+2*3 为例,构建了一个语法树。然而,文档没有描述如何构建树,这花了我一点时间来解决。

如果我再去一次,我会考虑“antlr”,因为它看起来不错并且得到了很好的支持。

马丁。

于 2009-12-03T22:44:12.773 回答