我刚刚开始使用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版本。
提前致谢,
森
答案 0 :(得分:1)
你的问题是运营商*
的贪婪和船长的使用的结合。您需要记住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];