Ну, вы просто в значительной степени описали разницу между конфликтами. Что за вопрос?
shift/reduce
конфликт означает, что зубр не знает, что он должен shift
(читать дальше один терминал и поместите его на вершине своего стека) или reduce
(конвертировать несколько терминалов/нетерминалы в стеке в новую Непро- Терминал). shift/reduce
означает I don't know - should I apply a rule now or wait a bit, read some text and apply another rule there?
Такие конфликты обычно разрешаются с помощью операции shift
.
reduce/reduce
конфликт означает, что существует два или более способов уменьшения терминалов/нетерминалов в верхней части стека. reduce/reduce
означает I don't know - should I apply this rule or that rule now?
. Этот конфликт гораздо серьезнее, чем shift/reduce
- грамматика неоднозначна, и что-то действительно не так.
Обычно это лучше не признать свёртка/свёртка, но избежать его. У вас есть четкое представление о том, что вы хотите сделать с самого начала. Периодически пересматривайте свою грамматику. Есть ли шанс, что вы только что изобрели другое правило?
Когда дело доходит до отладки существующих конфликтов, параметр bison -v
создает файл *.output
с очень длинными описаниями всех ваших конфликтов. Это очень трудно прочитать в первый раз, и это требует некоторых знаний о том, как проводится LR1 parsing
, но плюсы чтения его тоже замечательны.