2

私はPharo、SmalltalkでPetitParserを使用する方法を学習しており、それを学ぶために教科書を使用しています。教科書には、以下のスクリプトが書かれています。私は遊び場でそれを印刷しようとすると、教科書のPetitParserの算術スクリプトが機能していません。それはParseOnがnillだと言い続ける?

term := PPDelegateParser new. 
prod := PPDelegateParser new. 
prim := PPDelegateParser new. 
term setParser: (prod , $+ asParser trim , term ==> [ :nodes | nodes first + nodes last ])/prod. 
prod setParser: (prim , $*asParser trim , prod ==> [ :nodes | nodes first*nodes last ])/prim. 
prim setParser: ($(asParser trim , term , $) asParser trim ==> [ :nodes | nodes second ])/number. 
start := term end. 
start parse:'1+2*3'. 

は、しかし、私はMessageNotUnderstoodを得る:「parseOn:」の受信機はnilです。 どうしたのですか?

+1

「数値」とは何ですか?私はスニペットで定義されているとは思わない。 –

+0

あなたは正しいです、よかったです。あなたはこの質問を見ることができれば、同じコードだけど、私は除算と乗算の方法を追加しました。 http://stackoverflow.com/questions/42034072/petitparser-evaluator-not-working-properly –

答えて

2

numberという定義を追加すると、パーサーは目的の結果を生成します。次のコードはこれを行い、そうでなければあなたと同じです(書式を除く)

number := #digit asParser plus token trim 
    ==> [:token | token inputValue asNumber]. 
term := PPDelegateParser new. 
prod := PPDelegateParser new. 
prim := PPDelegateParser new. 
term 
    setParser: prod , $+ asParser trim , term 
     ==> [:nodes | nodes first + nodes last] 
     /prod. 
prod 
    setParser: prim , $* asParser trim , prod 
     ==> [:nodes | nodes first * nodes last] 
     /prim. 
prim 
    setParser: $(asParser trim , term , $) asParser trim 
     ==> [:nodes | nodes second] 
     /number. 
start := term end. 
^start parse: '1+2*3' 
関連する問題