2016-08-02 56 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];