我知道有一个老问题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
您将如何编写代码来检测此类(附加逗号)类型的错误?
您可以使用否定前瞻解析器。我不记得 Smalltalk 中的 API,但在 Dart(原始 Smalltalk 实现的直接移植)中,您会这样写:
final grammar = char('(')
& number
& char(',').not('please remove the extra comma from your input')
& char(')');
如果数字后跟逗号,则返回错误消息,否则让下一个解析器处理序列中的其余部分。