从具有语法的文件在C ++中创建解析器的最佳方法是什么?
答案 0 :(得分:18)
您也可以查看以下链接:
答案 1 :(得分:9)
这在很大程度上取决于语法。我倾向于喜欢递归下降解析器,它通常是手工编写的(尽管可以从语法描述中生成一个)。
如果您打算使用解析器生成器,那么确实有两个不错的选择:Byacc和Antlr。如果你想要(合理地)与yacc兼容的东西,Byacc(到目前为止)是你的最佳选择。如果你从头开始,既没有现有的代码也没有使用与yacc兼容的东西的经验,那么Antlr几乎肯定是你最好的选择。
既然已经提到了,我还会谈谈Bison。我会像瘟疫那样避免野牛。布鲁克斯对“计划扔掉一个人”的建议适用于此。 Robert Corbett(Byacc的作者)将Bison写成了他在解析器生成器上的第一次尝试。不幸的是,他把它交给了GNU,而不是扔掉它。在市场营销方面取得卓越技术的经典案例中,Bison被广泛使用(甚至被那些不太了解的人推荐),而Byacc仍然相对模糊。
编辑:我讨厌这样做,但既然已经提到过,我也会评论Boost.spirit。虽然这可能是模板元编程最酷的例子,但它有一些问题导致我建议不要试图将其严格使用。
相信我:事实上,你可以写出像灵一样的东西,正好在令人印象深刻和令人惊叹的边界上 - 但如果我确定我正在处理的语法是(并且会永远保持)相当小而简单。
答案 2 :(得分:8)
答案 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',因为它看起来很好并得到很好的支持。
马丁。