从Spirit X3开始

时间:2016-08-02 07:39:14

标签: c++ boost-spirit-x3

我刚刚开始使用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版本。

提前致谢,

1 个答案:

答案 0 :(得分:1)

你的问题是运营商*的贪婪和船长的使用的结合。您需要记住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];