Boost.Spirit没有解析整个输入

时间:2012-01-12 08:19:49

标签: c++ 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;

1 个答案:

答案 0 :(得分:3)

是的,重新排序是正确的解决方案。

Boost Spirit会产生所谓的LL parsers,这意味着

  

它从左到右解析输入,并构造句子的Leftmost derivation(因此LL,与LR解析器比较)

简单来说,它匹配第一个可能的令牌,并且不会回溯,除非规则失败。您可以在nonEscaped规则的末尾“断言”各种类型的后置条件,请参阅

使用语义操作:

  • 在语义操作中分配_pass
  • 使用语义动作函数对象,返回bool(false为失败)

然而,在实践中,这将导致次优解析器(不必要的回溯,例如)

HTH