Старая версия Bison на сервере моей школы говорит, что у вас 241 сдвиг / уменьшение конфликтов. Одним из них является висячий оператор if / else. Установка "OptElse" НЕ решает эту проблему. Вам просто нужно записать IfStmt и IfElseStmt, а затем использовать опции% nonassoc и% prec в зубре, чтобы исправить это.
Ваши выражения - это проблема почти всех остальных 240 конфликтов. Вам нужно либо форсировать правила приоритетов (грязная и ужасная идея), либо разбить ваши арифметические выражения на такие вещи, как:
AddSubtractExpr: AddSubtractExpr PLUS MultDivExpr | ....
;
MultDivExpr: MultiDivExpr TIMES Factor | ....
;
Factor: Variable | LPAREN Expr RPAREN | call | ...
;
Поскольку Bison создает анализатор снизу вверх, что-то вроде этого даст вам правильный порядок операций. Если у вас есть копия первого издания Книги Дракона, вы должны взглянуть на грамматику в Приложении А. Я считаю, что во 2-м издании также есть похожие правила для простых выражений.