3

0から32767までの数値のみを認識する解析ルールが必要です。次のようなものを試しました。

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

しかし、私は???のために何を書くべきかわかりません。PPFailureを返すことを考えましたが、これにはストリームの位置を知る必要があります。

4

1 に答える 1

7

ご想像のとおり、アクションでPPFailureを返すようにすることができます。一般に、これは適切なスタイルではありませんが(構文分析と意味分析を組み合わせたもの)、役立つ場合があります。PetitParserのテストには、いくつかの例があります。PPXmlGrammar>>#elementとで見られる良い使い方PPSmalltalkGrammar>>#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 ] ]
于 2013-03-12T23:24:10.260 に答える