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

问题描述 投票:0回答:1

我知道有一个老问题PetitParser 解析规则如何发出错误信号?Lukas Renggli 写道:

总的来说,这不是一个好的风格(混合了句法和语义 分析)

我的问题是如何正确地处理更复杂的示例?

这是我的例子:

我想解析以下术语:

(0.53,00)
     ^

我想告诉用户错误在于

^
指向的位置。 例如:“请从您的输入中删除多余的逗号”

语法是:

^ openParenthesis, number, closeParenthesis

代币:

openParenthesis
    ^ $( asPParser

number
    ^ wholeNumber plus, dot optional, wholeNumber optional

closeParenthesis
    ^ $) asPParser

wholeNumber 
   ^#digit asPParser plus trim

您将如何编写代码来检测此类(附加逗号)类型的错误?

error-handling smalltalk pharo petitparser
1个回答
0
投票

您可以使用否定前瞻解析器。我不记得 Smalltalk 中的 API,但在 Dart(原始 Smalltalk 实现的直接移植)中,您会这样写:

final grammar = char('(') 
    & number 
    & char(',').not('please remove the extra comma from your input') 
    & char(')'); 

如果数字后跟逗号,则返回错误消息,否则让下一个解析器处理序列中的其余部分。

© www.soinside.com 2019 - 2024. All rights reserved.