首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用C++ boost::spirit PEG语法生成表达式

使用C++ boost::spirit PEG语法生成表达式
EN

Stack Overflow用户
提问于 2011-03-14 07:30:08
回答 2查看 970关注 0票数 3

我对C++ & boost::spirit非常陌生。尝试通过仅使用||和&&使用PEG构建一个简单的表达式树来学习这两种方法。我已经根据文档中的mini-xml教程构建了代码的许多部分。

这是code,它适用于简单的字符串,如"1 || 0","1 && 0","1 || 1 && 0“...但因"(1 || 1)“而失败。我不太明白为什么它不能打印,即使它显示解析成功。

另外,请进一步指导我如何使此代码更直观和可维护的长期运行。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-14 20:23:34

启用Spirit调试支持将有所帮助:

a)添加定义

代码语言:javascript
复制
#define BOOST_SPIRIT_QI_DEBUG

和b)在语法的构造函数中添加a)

代码语言:javascript
复制
BOOST_SPIRIT_DEBUG_NODE(r);

用于所有规则(此处为r)。因此,解析器将在运行时打印一个执行树,显示使用哪些输入执行了哪些规则,以及填充了哪些属性值(有关更多详细信息,请参阅here )。

作为一般说明(这可能不适用于您,因为您似乎正在尝试构建一个AST),精神的解析器是完全属性的。这意味着您通常不需要任何语义操作来处理属性(有关详细介绍,请参阅hereherehere )。

票数 4
EN

Stack Overflow用户

发布于 2011-03-14 11:30:40

我不知道为什么你的特定的精神代码不能工作,但考虑到你是“非常新手C++”,并询问如何使你的代码更容易维护从长远来看,我的答案是:

不要使用Boost精灵。使用易于理解的解析器生成器,比如ANTLR (v2可以生成C++代码;v3不能,所以使用v2),或者lex & yacc或类似的代码。

Boost Spirit是一个很好的工具,可以展示一个人可以在多大程度上发挥C++的某些特性。如果您的目标是直观和可维护的代码,那么它对您没有特别的帮助,特别是如果您还不是C++方面的专家(这对您没有任何影响)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5293255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档