如何在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
相关产品推荐
相关产品推荐

