gpt4 book ai didi

c++ - Boost.Spirit 没有解析整个输入

转载 作者:搜寻专家 更新时间:2023-10-31 01:55:04 25 4
gpt4 key购买 nike

我有一个 boost::spirit::qi 规则:

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 规则。所以只有第一个空格被匹配。我如何说服 spirit 解析整个输入或尽可能多地解析?

当我将 field 规则中的变体顺序更改为以下时,它就起作用了。但这是正确的解决方案吗?

auto field = escaped | nonEscaped;

最佳答案

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

Boost Spirit 生成所谓的LL 解析器,这意味着

It parses the input from Left to right, and constructs a Leftmost derivation of the sentence (hence LL, compared with LR parser)

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

使用语义 Action :

  • 在语义 Action 中分配给_pass
  • 使用语义 Action 函数对象,返回bool(false 失败)

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

HTH

关于c++ - Boost.Spirit 没有解析整个输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8831909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com