2016-02-08 116 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

這是一個常見問題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

幹得好。它不會在一個(希望)可搜索的問答中再次記錄它 – sehe