【发布时间】:2011-06-04 22:28:09
【问题描述】:
就像许多其他问题一样,我正在尝试使用 Boost.Spirit.Qi 将简单的语法解析为结构树。
我将尝试将我正在尝试做的事情提炼为最简单的情况。我有:
struct Integer {
int value;
};
BOOST_FUSION_ADAPT_STRUCT(Integer, (int, value))
稍后,在语法结构内部,我有以下成员变量:
qi::rule<Iterator, Integer> integer;
我用它来定义
integer = qi::int_;
但是,当我尝试实际解析一个整数时,使用
qi::phrase_parse(iter, end, g, space, myInteger);
myInteger.value 在成功解析后总是未初始化。
同样,我也尝试过以下定义(显然不编译的都是错误的):
integer = qi::int_[qi::_val = qi::_1]; //compiles, uninitialized value
integer = qi::int_[qi::_r1 = qi::_1]; //doesn't compile
integer = qi::int_[phoenix::bind(&Integer::value, qi::_val) = qi::_1]; //doesn't
integer = qi::int_[phoenix::at_c<0>(qi::_val) = qi::_1]; //doesn't
很明显,我对 Spirit、Phoenix 或其他东西有误解。我的理解是qi::_1是qi::int_的第一个属性,在这里,应该代表解析的整数,当方括号中的部分作为函数对象执行时。然后我假设函数对象将采用封闭的integer 属性qi::_val 并尝试将解析的整数分配给它。我的猜测是,由于我的BOOST_FUSION_ADAPT_STRUCT 调用,这两者将是兼容的,从静态分析的角度来看确实是这样,但数据并没有被保留。
是否有我在某处遗漏的参考 (&) 名称?
【问题讨论】:
-
我刚刚找到了另一个可以编译的组合,尽管它不会产生初始化数据:我向
Integer添加了一个构造函数,它接受value的值,然后定义了我的integer解析器为integer = qi::long_long[qi::_val = phx::construct<Integer>(qi::_1)]; -
更多调试说明。在我的完整代码中,我实际上有
qi::rule<Iterator, Integer, ascii::space_type> integer;,如果我将Integer替换为Integer(),它看起来会中断,并且所有示例都有尾随(),我忽略了它。因此,rule的模板参数可能被搞砸了。挖掘。
标签: c++ boost-spirit boost-spirit-qi boost-phoenix