C++创建一个解析器

Szy*_*ski 9 c++ grammar parsing

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

Kea*_*eks 18

您还可以查看以下链接:

  • 如果您计划使用任何合适大小的编译器,我建议不要使用 `boost::spirit` - 使用 `boost::spirit` 构建的解析器的编译时间往往会变得非常大,甚至使非常小的更改成为 PITA(因为整个事情都是用模板完成的) (2认同)

Jer*_*fin 9

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

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

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

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

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

相信我:事实上,你可以写出像灵一样的东西,正好在令人印象深刻和惊人之间的边界 - 但我仍然只使用它,如果我确定我正在处理的语法是(并将永远保留)非常小而简单.


Mic*_*ker 8

弹性野牛.Lex&Yacc堂兄弟考虑到了c ++的存在.