2016-02-08 3 views
3

Я не понимаю разницы между этими двумя операторами. Возьмем пример разбора входных данных, например "AA,BB,CC,DD", в вектор строк.Boost.Spirit: Разница между операторами «% =» и «=»

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(',')) тот же. Итак, что в случае использования оператора %=?

+0

Это faq http://stackoverflow.com/search?q=user%3A85371+automatic+propagation+assignment - см. Также http://boost-spirit.com/home/2010/01/15/how- do-rules-propagate-attributes /, http://boost-spirit.com/home/articles/attribute_handling/attribute-propagation-and-attribute-compatibility/ :) – sehe

ответ

4

Хорошо, я нашел его в повышающей документации 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(','))` 

затем меняя оператора %= бы разницу.

+0

Молодцы. Это не мешает документировать его еще раз в (надеюсь) поиске Q & A – sehe

Смежные вопросы