Бизон приоритет бесполезен? это не работает

Я объявил такой приоритет для 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 не имеет терминалов, следовательно, приоритет не применяется.

Другие вопросы по тегам