2

J'apprends à utiliser PetitParser sur Pharo, Smalltalk et j'utilise un manuel pour l'apprendre. Dans le manuel, le script suivant est donné. CependantLe script arithmatique PetitParser du manuel ne fonctionne pas. Il ne cesse de dire que ParseOn est 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'. 

, lorsque je tente d'imprimer dans la cour de récréation i get MessageNotUnderstood: récepteur de "parseOn:" est nul. Qu'est-ce que j'ai fait de mal?

+1

Qu'est-ce que 'number'? Je ne le vois pas défini dans l'extrait. –

+0

vous avez raison, merci. Si vous pouviez regarder cette question, même code mais j'ai ajouté une méthode de division et de multiplication. http://stackoverflow.com/questions/42034072/petitparser-evaluator-not-working-properly –

Répondre

2

Si vous ajoutez la définition de number, l'analyseur produit le résultat souhaité. Le code suivant fait cela et est par ailleurs identique au vôtre (sauf pour le formatage)

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'