Boost.Spirit:运算符之间的区别"%="和" ="

时间:2016-02-08 21:18:18

标签: c++ boost boost-spirit-qi

我不明白这两个运营商之间的区别。让我们举个例子将"AA,BB,CC,DD"之类的输入解析为字符串向量。

namespace qi = boost::spirit::qi;
class my_grammar : public qi::grammar<string::const_iterator, string()>
{
public:
  my_grammar() : base_type(start) {
    using qi::_1;
    using qi::char_;
    start = *(char_ - qi::lit(','));
  }
  qi::rule<string::const_iterator, string()> start;
};

据我所知,a %= b相当于a = b[_val = _1]。很清楚。但另一方面,解析器*(char_ - qi::lit(','))具有类型std::string的合成属性,匹配的序列将被分配到该属性。使用start = *(char_ - qi::lit(','))的结果是相同的。那么使用运算符%=的情况是什么?

1 个答案:

答案 0 :(得分:5)

好的,我在增强文档http://www.boost.org/doc/libs/1_60_0/libs/spirit/doc/html/spirit/qi.html中找到了它:

 Note
 r %= p and r = p are equivalent if there are no semantic actions associated with p. 

因此,如果start规则包含语义操作,那么

*(char_[boost::phoenix::ref(my_string) = _1] - qi::lit(','))`

然后将运算符更改为%=会产生影响。