Boost.Spirit:运算符“%=”和“=”的区别
Boost.Spirit: Difference between operators "%=" and "="
我不明白这两个运算符之间的区别。让我们举一个例子,将 "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(','))
的结果是一样的。那么使用运算符 %=
是什么情况?
好的,我在 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.
所以如果 start
规则包含语义动作 ex.
*(char_[boost::phoenix::ref(my_string) = _1] - qi::lit(','))`
然后将运算符更改为 %=
会有所不同。
我不明白这两个运算符之间的区别。让我们举一个例子,将 "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(','))
的结果是一样的。那么使用运算符 %=
是什么情况?
好的,我在 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.
所以如果 start
规则包含语义动作 ex.
*(char_[boost::phoenix::ref(my_string) = _1] - qi::lit(','))`
然后将运算符更改为 %=
会有所不同。