You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Boost Spirit Qi添加可选整数前缀后空列表解析失败的问题

Boost Spirit Qi添加可选整数前缀后空列表解析失败的问题

你遇到的这个问题是Boost Spirit Qi中期望操作符(>)和可选规则交互导致的典型场景:原本合法的空列表输入,在给测试项加了可选整数前缀后,突然触发了期望异常,要求匹配标识符。

问题根源分析

我们来拆解一下规则的行为差异:

  1. 原来的id > id规则:当解析空输入时,第一个id直接匹配失败,整个test规则会以“匹配失败”结束(不会抛出异常),所以外层的-(test % ',')可以正常回退到“匹配空列表”的逻辑。
  2. 修改后的-qi::int_ > id > id规则:当解析空输入时,可选的-qi::int_会成功匹配(它是可选规则,空输入下会返回成功且不消耗任何字符),接下来的id > id就必须匹配,但此时已经没有输入了。由于前面的-qi::int_已经匹配成功,Spirit的期望操作符(>)会直接抛出expectation_failure异常,而不是让test规则以“匹配失败”结束。这就导致外层的-(test % ',')无法回退到空列表的情况,直接触发了异常。

解决方案

我们可以通过两种方式解决这个问题,根据你是否需要保留期望操作符的严格语义来选择:

方案1:保留期望语义(推荐)

把test规则拆分为两个明确的分支,分别处理“带整数前缀”和“不带整数前缀”的情况:

Rule<Ast::Test> test = (qi::int_ > id > id) | (id > id);

这样修改后:

  • 当有整数前缀时,匹配第一个分支;
  • 没有前缀时,匹配第二个分支;
  • 空输入时,两个分支都会匹配失败,test规则整体以“匹配失败”结束,外层的-(test % ',')就可以正常匹配空列表了。

方案2:简化规则(放弃严格期望语义)

如果你不需要期望操作符的严格校验(即不需要“前面部分匹配成功后,后面部分必须匹配”的强制约束),可以把所有>换成普通的顺序组合>>:

Rule<Ast::Test> test = -qi::int_ >> id >> id;

这种方式更简洁,但会失去期望操作符的异常触发逻辑,匹配失败时只会返回“匹配失败”而非抛出异常。

测试效果

修改后的代码再运行空列表测试时,会正常输出OK,不再触发期望异常。

备注:内容来源于stack exchange,提问作者llm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 10:09:34