使用C ++中的Boost Spirit创建解析器,该C ++使用现有类创建AST

时间:2018-11-07 02:25:24

标签: c++ parsing boost boost-spirit boost-phoenix

我正在尝试使用C ++中的boost spirit编写解析器。我希望以类对象的形式输出此解析器。我了解了语义动作,但是不确定如何在这些动作中创建类对象。

我还读到“ boost phoenix”是一个用于语义动作的好库。但是,没有找到将其用于促进精神的广泛示例。

任何帮助或指导将不胜感激。谢谢。

1 个答案:

答案 0 :(得分:0)

是的。您可以。只需从教程开始:

https://www.boost.org/doc/libs/1_68_0/libs/spirit/doc/html/spirit/qi/tutorials.html

要记住的重要一点是,语义动作不是不是创建AST节点的首选方法。这似乎是来自Flex / Bison样式工具的重复模式。

相反,更喜欢使用自动属性合成和传播。这样,您将获得预期的嵌入式DSL精神。这就是减少工作量和手动出错空间的原因。另请参见Boost Spirit: "Semantic actions are evil"?

如果您

  • 需要控制级别,
  • 绝对需要优化解析器阶段
  • 或有其他原因(例如,需要进行语义分析以消除令牌扫描的歧义)

然后我建议使用更传统的解析器生成器,该生成器通常需要更多的工作。

>另外,我读到“ boost phoenix”是一个用于语义动作的好库。

好吧,如果您很讨厌并且需要快速使事情正常运行的能力,那是“不错的”,但请记住,它不是核心语言支持,因此对您的编译器造成了沉重负担,并且有局限性。

我想说Spirit X3's semantic actions是一种更好的方法,您可以使用所有C ++ 14语言,而无需库英雄。这减少了学习难度,并允许您使用现有代码而无需例如包装为多态可调用对象,并使用BOOST_PHOENIX_ADAPT_ *等进行适应。

  

只是为了好玩,这是一个X3解析器,我在单个头文件中为X3实现了Phoenix的基本子集:https://github.com/sehe/expression-parsers/tree/x3-c++17

>但是,没有找到将其用于促进精神的广泛示例。

我想,如果您在此站点上搜索(我的)答案,那是自助餐。当然,您总是可以发表自己的具体问题。

相关问题