2

Ich lerne, wie man PetitParser auf Pharo, Smalltalk benutzt und ich benutze ein Lehrbuch, um es zu lernen. Im Lehrbuch wird das folgende Skript angegeben.PetitParser arithmetisches Skript aus dem Lehrbuch funktioniert nicht. Es sagt, ParseOn ist nicht?

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'. 

jedoch, wenn ich versuche, es auf dem Spielplatz zu drucken i erhalten MessageNotUnderstood: Empfänger von "parseOn:" ist gleich Null. Was habe ich falsch gemacht?

+1

Was ist 'Nummer'? Ich sehe es nicht im Snippet definiert. –

+0

Sie haben Recht, danke. Wenn Sie diese Frage mit demselben Code betrachten könnten, fügte ich auch eine Divisions- und Multiplikationsmethode hinzu. http://stackoverflow.com/questions/42034072/petitparser-evaluator-not-working-properly –

Antwort

2

Wenn Sie die Definition number hinzufügen, erzeugt der Parser das gewünschte Ergebnis. Der folgende Code tut das und ist ansonsten identisch mit Ihnen (außer für die Formatierung)

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' 
Verwandte Themen