我刚刚开始使用精神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中包含的灵性版本。
提前谢谢你,
Sen
发布于 2016-08-02 09:01:19
您的问题是操作符*的贪婪和使用skipper的结合。您需要记住,alnum是一个PrimitiveParser,这意味着每次尝试这个解析器之前,精神都会跳过,所以解析器的行为是:
alpha解析a。alnum跳过空间,然后解析6。alnum跳过空间,然后解析l。alnum解析i。alnum解析l。alnum跳过空间,然后解析8。alnum尝试并未能解析更多。这就完成了带解析属性6literal8的kleene运算符。"literal"尝试并失败了解析。phrase_parse调用返回false。您可以使用lexeme指令(赤骨x3文档,齐博士)轻松地避免这个问题。类似于这的东西应该可以工作:
alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];https://stackoverflow.com/questions/38714468
复制相似问题