2012-01-12 46 views
2

我有一個boost ::精神::齊規則:Boost.Spirit不解析整個輸入

auto dquote = qi::char_('\"'); 
auto comma = qi::char_(','); 
auto newline = qi::char_('\n'); 
auto nonEscaped = *(qi::char_ - newline - comma - dquote); 
auto escaped = *qi::blank >> dquote >> *((qi::char_ - dquote) | (dquote >> dquote)) >> dquote >> *qi::blank; 
auto field = nonEscaped | escaped; 

當我嘗試解析輸入:

string input(" \"e\"\"e\" "); 
qi::phrase_parse(begin(input), end(input), field, qi::char_('\r')); 

輸入不完全由escaped規則匹配,但只應用nonEscaped規則。所以只有第一個空間是匹配的。我如何說服精神分析整個輸入或儘可能地解析?

當我將field規則中變體的順序更改爲以下規則時,它就起作用了。但是,這是正確的解決方案嗎?

auto field = escaped | nonEscaped; 

回答

3

是的,重新排序是正確的解決方案。

升壓精神產生了所謂的LL parsers,這意味着

它分析從左至右的輸入端,並構造句子(因此LL,與LR語法分析程序相比)

Leftmost derivation

簡而言之,它匹配第一個可能的標記並且不會執行回溯,除非規則失敗。你可以「斷言」種在nonEscaped統治結束的崗位條件,請參閱

使用語義動作:

  • 在語義動作分配給_pass
  • 使用語義動作函數對象,返回bool(假失敗)

然而,在實踐中,這將導致次優解析器(不必要的回溯,如)

HTH