C ++创建一个解析器

时间:2009-12-03 22:37:15

标签: c++ parsing grammar

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

6 个答案:

答案 0 :(得分:18)

答案 1 :(得分:9)

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

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

既然已经提到了,我还会谈谈Bison。我会像瘟疫那样避免野牛。布鲁克斯对“计划扔掉一个人”的建议适用于此。 Robert Corbett(Byacc的作者)将Bison写成了他在解析器生成器上的第一次尝试。不幸的是,他把它交给了GNU,而不是扔掉它。在市场营销方面取得卓越技术的经典案例中,Bison被广泛使用(甚至被那些不太了解的人推荐),而Byacc仍然相对模糊。

编辑:我讨厌这样做,但既然已经提到过,我也会评论Boost.spirit。虽然这可能是模板元编程最酷的例子,但它有一些问题导致我建议不要试图将其严格使用。

  1. 使用它编译时间会让人痛苦 - 10分钟很常见,而更大/更复杂的语法可能需要更长时间(假设它不会使编译器崩溃)。
  2. 如果你犯了任何错误,它可能并且经常会产生几乎无法破译的疯狂长错误信息。无论如何,来自模板密码的错误消息都是非常糟糕的,并且Spirit比其他任何东西更强调系统。

相信我:事实上,你可以写出像灵一样的东西,正好在令人印象深刻和令人惊叹的边界上 - 但如果我确定我正在处理的语法是(并且会永远保持)相当小而简单。

答案 2 :(得分:8)

flexbison。 Lex& Yacc堂兄弟考虑到了c ++的存在。

答案 3 :(得分:3)

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

  

我制作C ++解析器的首选方法   是让Lex生成一个普通的C.   文件,并让YACC生成C ++   码。当你然后链接你的   应用程序,你可能遇到一些   因为C ++代码所带来的问题   默认将无法找到C.   功能,除非你已经告诉过它   这些函数是extern“C”。

答案 4 :(得分:2)

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

答案 5 :(得分:2)

我使用了bison,发现这些示例恰好符合我的关卡。能够用它创建一个简单的计算器,当然它可以做更多。

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

如果我再去一次,我会调查'antlr',因为它看起来很好并得到很好的支持。

马丁。