3

标题可能表达得不太好。请评论正确的技术术语。

今天我注意到以下内容。给定

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第二个只产生 string T

我假设生成的 phoenix 函数在每次匹配char_(即每个字符)时被调用,这意味着对 的五个分配out,最后一个是T

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

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

4

1 回答 1

4

由于C++ 运算符优先级,这是预期的行为。您的第二个语法被评估为:

+ ( 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_) 是 type std::vector<char>,因此您需要将该向量转换为字符串,就像您的第三个语法一样。

于 2013-05-24T19:51:18.590 回答