我刚刚开始使用Spirit X3,但我的第一个测试有一个小问题。您知道为什么此函数返回“false”吗?
bool parse()
{
std::string rc = "a 6 literal 8";
auto iter_begin = rc.begin();
auto iter_end = rc.end();
bool bOK= phrase_parse( iter_begin, iter_end,
// ----- start parser -----
alpha >> *alnum >> "literal" >> *alnum
// ----- end parser -----
, space);
return bOK && iter_begin == iter_end;
}
我已经看到问题与我的语法编写方式有关。如果我用这个替换它,则返回“true”
alpha >> -alnum >> "literal" >> *alnum
我正在使用Boost 1.61.0中包含的Spirit版本。
提前致谢,
森
最佳答案
您的问题是运算符(operator)*
的贪婪和使用船长的结合。您需要记住alnum
是PrimitiveParser
,这意味着在每次尝试使用此解析器之前,Spirit都会预先跳过,因此解析器的行为为:
alpha
解析a
。 alnum
跳过空格,然后解析6
。 alnum
跳过空格,然后解析l
。 alnum
解析i
。 alnum
解析l
。 alnum
跳过空格,然后解析8
。 alnum
尝试并且无法解析更多内容。这样就完成了kleene运算符的解析属性6literal8
。 "literal"
尝试解析失败。 phrase_parse
的调用返回false
。 您可以使用
lexeme
指令(barebones x3 docs,qi docs)轻松避免此问题。像this这样的东西应该可以工作:alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];