我正在尝试使用C ++中的boost spirit编写解析器。我希望以类对象的形式输出此解析器。我了解了语义动作,但是不确定如何在这些动作中创建类对象。
我还读到“ boost phoenix”是一个用于语义动作的好库。但是,没有找到将其用于促进精神的广泛示例。
任何帮助或指导将不胜感激。谢谢。
答案 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"?
如果您
然后我建议使用更传统的解析器生成器,该生成器通常需要更多的工作。
好吧,如果您很讨厌并且需要快速使事情正常运行的能力,那是“不错的”,但请记住,它不是核心语言支持,因此对您的编译器造成了沉重负担,并且有局限性。
我想说Spirit X3's semantic actions是一种更好的方法,您可以使用所有C ++ 14语言,而无需库英雄。这减少了学习难度,并允许您使用现有代码而无需例如包装为多态可调用对象,并使用BOOST_PHOENIX_ADAPT_ *等进行适应。
只是为了好玩,这是一个X3解析器,我在单个头文件中为X3实现了Phoenix的基本子集:https://github.com/sehe/expression-parsers/tree/x3-c++17
我想,如果您在此站点上搜索(我的)答案,那是自助餐。当然,您总是可以发表自己的具体问题。