我刚刚开始使用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)*的贪婪和使用船长的结合。您需要记住alnumPrimitiveParser,这意味着在每次尝试使用此解析器之前,Spirit都会预先跳过,因此解析器的行为为:

  • alpha解析a
  • kleene运算符启动。
  • alnum跳过空格,然后解析6
  • alnum跳过空格,然后解析l
  • alnum解析i
  • ...
  • alnum解析l
  • alnum跳过空格,然后解析8
  • alnum尝试并且无法解析更多内容。这样就完成了kleene运算符的解析属性6literal8
  • "literal"尝试解析失败。
  • 序列运算符失败,并且phrase_parse的调用返回false

  • 您可以使用lexeme指令(barebones x3 docsqi docs)轻松避免此问题。像this这样的东西应该可以工作:
    alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];
    

    09-04 07:39