2012-01-12 35 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