为什么此解析器在属性中保留'b'
?即使选项不匹配?Boost Spirit可选解析器和回溯
using namespace boost::spirit::qi;
std::string str = "abc";
auto a = char_("a");
auto b = char_("b");
qi::rule<std::string::iterator, std::string()> expr;
expr = +a >> -(b >> +a);
std::string res;
bool r = qi::parse(
str.begin(),
str.end(),
expr >> lit("bc"),
res
);
它解析成功,但资源是"ab"
。
如果仅用expr解析"abac"
,则选项匹配且属性为"aba"
。
与"aac"
相同,选项不会开始匹配,属性为"aa"
。
但与"ab"
,属性是"ab"
,即使b回溯,并且,例如,与下一个分析器匹配。
UPD
随着expr.name("expr");
和debug(expr);
我
<expr>
<try>abc</try>
<success>bc</success>
<attributes>[[a, b]]</attributes>
</expr>
嗯,我已经取代'auto's与规则。 – 2014-10-03 20:27:34
但是,我不明白,你使用二进制减号?那是不同的语言,不是吗? – 2014-10-03 20:28:35
@MikhailCheshkov我只是注意到这个错字。 **更新了答案。请原谅我的错误:/ – sehe 2014-10-03 20:34:12