Boost.Spirit:运算符"%="和"="之间的差异

nkd*_*kdm 4 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;
};
Run Code Online (Sandbox Code Playgroud)

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

nkd*_*kdm 6

好的,我在boost文档中找到了它.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. 
Run Code Online (Sandbox Code Playgroud)

因此,如果start规则包含语义动作ex.

*(char_[boost::phoenix::ref(my_string) = _1] - qi::lit(','))`
Run Code Online (Sandbox Code Playgroud)

然后改变运营商%=将有所作为.