2016-08-02 55 views
1

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

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; 
} 

我见过这个问题与我如何编写语法有关。如果我用这个替换它,它返回“真”

alpha >> -alnum >> "literal" >> *alnum 

我使用包括在Boost 1.61.0中的Spirit版本。

由于提前,

+0

在这里,您可以在线测试代码:http://coliru.stacked-crooked.com/a/0ce333c6e9f75f66 – Sen

回答

0

你的问题是运营商*的贪婪和使用一个船长的组合。你需要记住,alnumPrimitiveParser,这意味着每当这个解析器尝试的时间之前,将灵前跳,所以你的解析器的行为是:

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

可以使用lexeme指令(barebones x3 docsqi docs)很容易地避免这个问题。像this的东西应该工作:

alpha >> lexeme[*alnum] >> "literal" >> lexeme[*alnum];