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

关于Boost Spirit选择操作符的技术咨询:test_parser匹配失败问题

Boost Spirit选择操作符(|)解析失败的原因与解决方法

问题原因

Boost Spirit的|是有序选择解析器,但默认行为是:当第一个分支成功匹配部分输入后,即使后续无法完成全输入匹配,也不会自动回溯到输入起始位置尝试下一个分支。

拿你的代码来说:

test_parser("Hello", string("Hell") | string("Hello"));

第一个分支string("Hell")会先匹配输入的前4个字符"Hell",此时输入指针已经移动到第5个字符"o"的位置。但test_parser要求完全匹配整个输入,第一个分支匹配后剩下的"o"没有对应解析规则,所以第一个分支整体失败。而Spirit默认不会回溯到输入开头去尝试第二个分支string("Hello"),导致整个解析返回fail。

解决方法

有几种常见的处理方式:

  • 调整分支顺序,把更长的匹配放在前面:
    因为有序选择会优先尝试第一个分支,把string("Hello")放在前面,它会直接匹配整个输入,解析成功:

    test_parser("Hello", string("Hello") | string("Hell"));
    
  • 使用hold[]指令强制回溯:
    hold[]会让Spirit在尝试当前分支失败后,回溯到分支开始前的输入位置,再尝试下一个分支。修改后的代码:

    test_parser("Hello", hold[string("Hell")] | string("Hello"));
    

    这样第一个分支尝试后会回溯到输入开头,第二个分支就能完整匹配"Hello"。

内容的提问来源于stack exchange,提问作者福岡仁

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 15:55:56