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

Dam*_*sou 3 smalltalk pharo petitparser

我想要一个只识别0到32767之间的数字的解析规则.我尝试过类似的东西:

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

但我不知道该怎么写??? 我想过返回一个PPFailure,但这需要知道流的位置.

Luk*_*gli 7

如您所料,您可以使操作返回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 ] ]
Run Code Online (Sandbox Code Playgroud)