我对C++ & boost::spirit非常陌生。尝试通过仅使用||和&&使用PEG构建一个简单的表达式树来学习这两种方法。我已经根据文档中的mini-xml教程构建了代码的许多部分。
这是code,它适用于简单的字符串,如"1 || 0","1 && 0","1 || 1 && 0“...但因"(1 || 1)“而失败。我不太明白为什么它不能打印,即使它显示解析成功。
另外,请进一步指导我如何使此代码更直观和可维护的长期运行。
发布于 2011-03-14 20:23:34
启用Spirit调试支持将有所帮助:
a)添加定义
#define BOOST_SPIRIT_QI_DEBUG和b)在语法的构造函数中添加a)
BOOST_SPIRIT_DEBUG_NODE(r);用于所有规则(此处为r)。因此,解析器将在运行时打印一个执行树,显示使用哪些输入执行了哪些规则,以及填充了哪些属性值(有关更多详细信息,请参阅here )。
作为一般说明(这可能不适用于您,因为您似乎正在尝试构建一个AST),精神的解析器是完全属性的。这意味着您通常不需要任何语义操作来处理属性(有关详细介绍,请参阅here、here和here )。
发布于 2011-03-14 11:30:40
我不知道为什么你的特定的精神代码不能工作,但考虑到你是“非常新手C++”,并询问如何使你的代码更容易维护从长远来看,我的答案是:
不要使用Boost精灵。使用易于理解的解析器生成器,比如ANTLR (v2可以生成C++代码;v3不能,所以使用v2),或者lex & yacc或类似的代码。
Boost Spirit是一个很好的工具,可以展示一个人可以在多大程度上发挥C++的某些特性。如果您的目标是直观和可维护的代码,那么它对您没有特别的帮助,特别是如果您还不是C++方面的专家(这对您没有任何影响)。
https://stackoverflow.com/questions/5293255
复制相似问题