Бизон приоритет бесполезен? это не работает
Я объявил такой приоритет для bison
:
%left '+' '-'
%left '*' '/'
Рекурсивные правила арифметики:
exp: exp binary_op exp { .. }
| literal_exp { .. }
| ID { .. }
binary_op: '+' { .. }
| '-' { .. }
| '*' { .. }
| '/' { .. }
У меня есть арифметическое выражение: 10 * 3 + 5
Моя программа рассчитывает сумму, и это 80! Я до сих пор не знаю, почему не работает приоритет.
1 ответ
Решение
Это должно работать, если вы определяете выражения следующим образом:
exp: exp '+' exp { .. }
exp '-' exp { .. }
exp '*' exp { .. }
exp '/' exp { .. }
| literal_exp { .. }
| ID { .. }
Приоритет работает только тогда, когда операторы присутствуют в качестве терминалов в правиле.
Смотрите документацию о том, как работает приоритет:
каждое правило получает свой приоритет от последнего терминального символа, упомянутого в компонентах
Ваше правило для exp не имеет терминалов, следовательно, приоритет не применяется.