2

Я изучаю, как использовать PetitParser на Pharo, Smalltalk, и я использую учебник, чтобы узнать его. В учебнике приведен следующий сценарий.Арифметический скрипт PetitParser из учебника не работает. Он продолжает говорить, что ParseOn - это нуль?

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:» равна нулю. Что я сделал не так?

+1

Что такое 'number'? Я не вижу, чтобы это было определено в фрагменте. –

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