2017-02-03 27 views
1

Когда я пытаюсь запустить этот код на pharo, мои ответы несколько отключены. Я пытаюсь оценить 1-2 + 3, но по какой-то причине он делает 1- (2 + 3), и я не понимаю, почему это так. Спасибо за ваше время.Оценщик PetitParser не работает должным образом

number := #digit asParser plus token trim ==> [ :token | token inputValue asNumber ]. 

term := PPUnresolvedParser new. 
prod := PPUnresolvedParser new. 
term2 := PPUnresolvedParser new. 
prod2 := PPUnresolvedParser new. 
prim := PPUnresolvedParser new. 

term def: (prod , $+ asParser trim , term ==> [ :nodes | nodes first + nodes last ])/term2. 

term2 def: (prod , $- asParser trim , term ==> [ :nodes | nodes first - nodes last ])/ prod. 

prod def: (prim , $* asParser trim , prod ==> [ :nodes | nodes first * nodes last ])/ prim. 

prod2 def: (prim , $/ asParser trim , prod ==> [ :nodes | nodes first/nodes last ])/ prim. 

prim def: ($(asParser trim , term , $) asParser trim ==> [ :nodes | nodes second ])/number. 

start := term end. 

start parse: '1 - 2 + 3' 

ответ

2

Рассмотрим определение term

term 
    def: prod , $+ asParser trim , term 
     ==> [:nodes | nodes first + nodes last] 
     /term2. 

/ term2 часть представляет собой OR между

prod , $+ asParser trim, term ==> [something] 

и

term2 

Ле t умственно разобрать '1 - 2 + 3' согласно term.

Мы сначала прочитали $1 и должны решить между двумя вариантами выше. Первый будет терпеть неудачу, если prod не потребляет '1 - 2'. Но это невозможно, потому что

prod 
    def: prim , $* asParser trim , prod 
     ==> [:nodes | nodes first * nodes last] 
     /prim. 

prim 
    def: $(asParser trim , term , $) asParser trim 
     ==> [:nodes | nodes second] 
     /number 

и нет $* или $( идет, и '1 - 2' не разбирается #number.

Таким образом, мы пытаемся с term2, которая определяется аналогичным образом

term2 
    def: prod , $- asParser trim , term 
     ==> [:nodes | nodes first - nodes last] 
     /prod. 

так что теперь у нас есть OR между двумя вариантами.

Как и выше, первый вариант выходит из строя, поэтому мы затем попробуем prod, затем prim и, наконец, number. number анализатора начинается с

#digit asParser plus 

потребляющего цифру $1 и производит целое число 1.

Мы вернулись в term2. Мы потребляем ' - ' и оставляем '2 + 3'; который согласно term производит 5. Итак, мы получаем 1 - 5 = -4.


SHORT ОБЪЯСНЕНИЕ

Для term разобрать, как (1 - 2) + 3, prod должен потреблять 1 - 2, который делает не потому, что prod не предполагает $-.

 Смежные вопросы

  • Нет связанных вопросов^_^