首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从精神X3开始

从精神X3开始
EN

Stack Overflow用户
提问于 2016-08-02 07:39:13
回答 1查看 249关注 0票数 1

我刚刚开始使用精神X3,我有一个与我的第一个测试相关的小问题。你知道为什么这个函数会返回"false“吗?

代码语言:javascript
复制
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“。

代码语言:javascript
复制
alpha >> -alnum >> "literal" >> *alnum

我正在使用Boost 1.61.0中包含的灵性版本。

提前谢谢你,

Sen

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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文档齐博士)轻松地避免这个问题。类似于的东西应该可以工作:

代码语言:javascript
复制
alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38714468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档