gpt4 book ai didi

smalltalk - PetitParser 解析规则如何发出错误信号?

转载 作者:行者123 更新时间:2023-12-01 10:01:38 25 4
gpt4 key购买 nike

我想要一个只识别 0 到 32767 之间的数字的解析规则。我尝试了类似的方法:

integerConstant
^ (#digit asParser min: 1 max: 5) flatten
==> [ :string | | value |
value := string asNumber.
(value between: 0 and: 32767)
ifTrue: [ value ]
ifFalse: [ **???** ]]

但我不知道为 ??? 写什么。我考虑过返回 PPFailure,但这需要知道流位置。

最佳答案

如您所料,您可以让操作返回 PPFailure。虽然总的来说这不是好的风格(混合了句法和语义分析),但有时会有帮助。在 PetitParser 的测试中有几个例子。您可以在 PPXmlGrammar>>#elementPPSmalltalkGrammar>>#number 中看到很好的用法。

PPFailure 的位置只是 PetitParser 提供给它的用户的东西(工具)。它不是用于解析本身的东西,因此如果您觉得懒惰,可以将其设置为 0。或者,您可以使用以下示例获取输入中的当前位置:

positionInInput
"A parser that does not consume anything, that always succeeds and that
returns the current position in the input."

^ [ :stream | stream position ] asParser

integerConstant
^ (self positionInInput , (#digit asParser min: 1 max: 5) flatten) map: [ :pos :string |
| value |
value := string asNumber.
(value between: 0 and: 32767)
ifTrue: [ value ]
ifFalse: [ PPFailure message: value , ' out of range' at: pos ] ]

关于smalltalk - PetitParser 解析规则如何发出错误信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15371334/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com