Разобрать двоичные суммы / продукты легко, но у меня проблемы с определением грамматики, которая разбирает
a + b * c + d + e
в
sum(a, prod(b, c), d, e)
Моя первоначальная (наивная) попытка вызвала 61 конфликт сдвига / уменьшения.
Я использую java cup (но я полагаю, что решение для любого другого генератора парсера было бы легко перевести).
Следующая грамматика 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 находится дальше всего в дереве и (используя соответствующую "прогулку" по вашему дереву) будет оцениваться первым.
mul_exp
, а входные данные a + b * (c + d) + e анализируются как:
a + b * (c + d) + e
альтернативный текст http://img688.imageshack.us/img688/2207/89332200.png
Изображения были созданы с помощью ANTLRWorks .
РЕДАКТИРОВАТЬ:
Такой инструмент, как ANTLRWorks делает отладку грамматики на одном дыхании!Например, если я нажимаю на правило atom в приведенной выше грамматике, автоматически генерируется следующее и отображается в нижней части экрана:
atom
альтернативный текст http://img340.imageshack.us/img340/6793/53395907.png
КонечноЭто правило совсем не сложно, но когда вы начинаете работать с более сложными правилами, их чертовски легко визуализировать.
HTH.