3

我对 C++ 和 boost::spirit 很陌生。尝试通过构建一个只有 || 的简单表达式树来学习两者 和 && 使用 PEG。我已经从文档中的 mini-xml 教程构建了许多代码部分。

这是代码,它适用于简单的字符串,如“1 || 0”、“1 && 0”、“1 || 1 && 0”……但对于“(1 || 1)”则失败。我不太明白为什么它无法打印,即使它说解析成功。

另外,请进一步指导我如何使这段代码从长远来看更直观和可维护。

4

2 回答 2

4

启用 Spirit 调试支持将有助于:

a) 添加定义

#define BOOST_SPIRIT_QI_DEBUG

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

BOOST_SPIRIT_DEBUG_NODE(r);

适用于所有规则(此处r)。结果,解析器将在运行时打印一个执行树,向您显示使用什么输入执行了哪些规则以及已填充了哪些属性值(有关更多详细信息,请参见此处)。

作为一般说明(这可能不适用于您,因为您似乎正在尝试构建 AST),Spirit 的解析器已完全归因。这意味着您通常不需要任何语义操作来处理属性(请参阅此处此处此处以获得简要介绍)。

于 2011-03-14T12:23:34.187 回答
0

我不知道为什么您的特定 Spirit 代码不起作用,但鉴于您“对 C++ 非常陌生”并询问如何使您的代码从长远来看更易于维护,我的回答是:

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

Boost Spirit 是一个很好的工具,可以用来展示 C++ 的某些特性能走多远。如果您的目标是直观且可维护的代码,则它对您没有特别的帮助,特别是如果您还不是 C++ 专家(这根本不会打击您)。

于 2011-03-14T03:30:40.420 回答