提升精神字符串属性兼容性

时间:2013-05-24 19:38:56

标签: c++ boost-spirit

标题可能没有很好地表达。请评论正确的技术术语。

今天我注意到了以下情况。给定

const std::string in( "QWERT" );
std::string out;

boost::spirit::qi::parse( in.begin(), in.end(),
    +boost::spirit::qi::char_, out );

boost::spirit::qi::parse( in.begin(), in.end(),
    +boost::spirit::qi::char_[ boost::phoenix::ref( out ) =
        boost::spirit::_1 ] );

boost::spirit::qi::parse( in.begin(), in.end(),
    boost::spirit::as_string[ +boost::spirit::qi::char_ ]
        [ boost::phoenix::ref( out ) = boost::spirit::_1 ] );

第一个parse按预期将字符串QWERT提取到out。第二个只产生字符串T

我假设生成的凤凰函数在char_(每个字符)的每个匹配上被调用,这意味着对out的五个赋值,最后一个是T

这是预期的行为吗? (请指出升级文档中的相关部分。)

目前(我在语法中使用此作为规则)我通过第三个parse中的表达式修复此问题,这看起来有点尴尬。

1 个答案:

答案 0 :(得分:4)

这是C++ operator precedence引起的预期行为。你的第二个语法被评估为:

+ ( boost::spirit::qi::char_[ boost::phoenix::ref( out ) = boost::spirit::_1 ] )

你所期待的是:

(+boost::spirit::qi::char_)[ boost::phoenix::ref( out ) = boost::spirit::_1 ]

第二行实际上不起作用,因为(+ boost :: spirit :: qi :: char_)的类型为std::vector<char>,所以你需要将该向量转换为字符串,就像你的第三个语法确实