我有一个提升::精神::气的规则:
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;
答案 0 :(得分:3)
是的,重新排序是正确的解决方案。
Boost Spirit会产生所谓的LL parsers
,这意味着
它从左到右解析输入,并构造句子的Leftmost derivation(因此LL,与LR解析器比较)
简单来说,它匹配第一个可能的令牌,并且不会回溯,除非规则失败。您可以在nonEscaped
规则的末尾“断言”各种类型的后置条件,请参阅
使用语义操作:
_pass
bool
(false为失败)然而,在实践中,这将导致次优解析器(不必要的回溯,例如)
HTH