【发布时间】:2026-01-30 00:05:02
【问题描述】:
为什么这个解析器在属性中保留'b',即使选项不匹配?
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
);
解析成功,但是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>
【问题讨论】:
-
X3 中的行为发生了变化,其中可选解析器总是创建一个临时解析器。
标签: c++ boost boost-spirit boost-spirit-qi