就像许多其他问题一样,我正在尝试使用 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
调用,两者将是兼容的,从静态分析的角度来看,这肯定是这种情况,但数据并没有被保留。
我在某处或某处缺少参考(&)名称吗?