Сдвиг/уменьшение конфликтов в грамматике арифметического выражения с n-арными суммами/произведениями

Разбирать двоичные суммы/произведения легко, но у меня возникают проблемы с определением грамматики, которая анализирует

a + b * c + d + e

as

sum(a, prod(b, c), d, e)

Моя первоначальная (наивная) попытка породила 61 конфликт сдвига/уменьшения.

Я использую java cup (но я полагаю, что решение для любого другого генератора парсеров будет легко переведено).


person aioobe    schedule 18.02.2010    source источник
comment
Можем ли мы увидеть код вашей попытки?   -  person Hans W    schedule 18.02.2010


Ответы (1)


Следующая грамматика ANTLR:

parse
  :  exp EOF
  ;

exp
  :  add_exp
  ;

add_exp
  :  mul_exp ('+' mul_exp)* 
  ;

mul_exp
  :  atom ('*' atom)* 
  ;

atom
  :  Number
  |  '(' exp ')'
  ;

Number
  :  'a'..'z'
  ;

анализирует ввод a + b * c + d + e как:

замещающий текст http://img266.imageshack.us/img266/7099/17212574.png< /а>

Как вы можете видеть, mul_exp находится дальше всего в дереве и (используя соответствующий «проход» по вашему дереву) будет оцениваться первым.

и вход a + b * (c + d) + e анализируется как:

замещающий текст http://img688.imageshack.us/img688/2207/89332200.png< /а>

Изображения были сгенерированы с помощью ANTLRWorks.

ИЗМЕНИТЬ:

Такой инструмент, как ANTLRWorks, упрощает отладку грамматики! Например, если я нажму на правило atom в приведенной выше грамматике, автоматически сгенерируется и отобразится в нижней части экрана следующее:

замещающий текст http://img340.imageshack.us/img340/6793/53395907.png< /а>

Конечно, это правило совсем не сложное, но когда вы работаете с более сложными правилами, чертовски легко визуализировать их в таком виде.

ХТН.

person Bart Kiers    schedule 03.05.2010
comment
Красивый ответ. Я сразу вижу, почему это работает. Спасибо! - person aioobe; 03.05.2010
comment
Я не знал об ANTLRWorks .. спасибо и за ссылку. - person aioobe; 03.05.2010