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

如何在Pharo中用PetitParser/PetitParser2正确处理解析错误?

用PetitParser检测多余逗号的解析错误

之前StackOverflow上的旧问题《How can a PetitParser parse rule signal an error?》中,Lukas Renggli提到:通常这不是好风格(混合了语法与语义分析)。下面通过具体实例演示如何正确处理这类解析错误。

待处理的错误输入

我们需要解析的错误输入如下:

(0.53,00)
     ^

其中^指向的多余逗号需要被检测到,并给出提示:请移除输入中的多余逗号。

原有语法与Token定义

原有的基础语法和Token规则如下:

主语法规则

^ openParenthesis, number, closeParenthesis

Token定义

openParenthesis
    ^ $( asPParser

number
    ^ wholeNumber plus, dot optional, wholeNumber optional

closeParenthesis
    ^ $) asPParser

wholeNumber 
   ^#digit asPParser plus trim

解决方案:添加错误检测分支

我们可以在语法规则中添加一个错误分支,专门捕获多余的逗号并抛出明确错误,同时不违反“语法与语义分离”的原则。

步骤1:添加逗号的Token规则

首先新增逗号的解析规则,和其他Token保持一致的格式:

comma
    ^ $, asPParser trim

步骤2:修改主解析规则

调整主规则,让number之后可以匹配预期的closeParenthesis,或者捕获意外的comma并抛出错误:

^ openParenthesis, 
  number, 
  (closeParenthesis / (comma ==> [ :node | 
      PPFailure message: '请移除输入中的多余逗号' at: self position ])),
  closeParenthesis

代码解释

  • 当解析器在number之后匹配到closeParenthesis时,流程正常进行,完成整个括号内数字的解析;
  • 如果匹配到comma,则通过==>转换块生成一个PPFailure实例,传入错误提示消息和当前的解析位置,这样就能精准定位到多余逗号的位置并给出清晰提示;
  • 这种方式只是在语法层面检测不符合预期的Token,没有混入语义分析逻辑,符合PetitParser的最佳实践。

内容的提问来源于stack exchange,提问作者tukan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 15:53:20