1

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

提前致谢,

4

1 回答 1

1

您的问题是操作员的贪婪*和船长的使用的结合。您需要记住这alnum是 a PrimitiveParser,这意味着在每次尝试此解析器之前,Spirit 都会预先跳过,因此您的解析器的行为是:

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

lexeme您可以使用指令(准系统 x3 文档qi 文档)轻松避免此问题。像这样的东西应该工作:

alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];
于 2016-08-02T09:01:19.237 回答