Набор граматических правил неоднозначен, если входная строка может интерпретироваться по-разному. Например, правило:

expr: expr'-'expr

естественный путь записи арифметического выражения, как двух выражений со знаком минус между ними. К сожалению, данное правило не указывает способа обработки более сложных конструкций. Например, если на входе будет

expr-expr-expr

правило позволяет интерпретировать ввод как

(expr-expr)-expr
так и как
expr-(expr-expr)

Первый случай - левая ассоциативность, второй - правая. Yacc при попытке построения распознавателя такие случаи обнаруживает. Полезно рассмотреть действия, выполняемые распознавателем при обнаружении подобных конструкций. При чтении второго выражения строка expr-expr удовлетворяет правой части приведенного правила.Таким образом, можно выполнить свертку. После нее на входе остается expr (левая часть правила). Затем читается оставшаяся часть выражения -expr, после чего снова выполняется свертка. В результате получается левоассоциативная интерпретация.
И наоборот, при чтении expr-expr можно было бы отложить немедленное применение правила и читать дальше до обнаружения expr-expr-expr. тогда свертнуты будут два последних символа, что приведет к правой ассоциативности. Таким обазом, прочитав expr-expr, распознаватель может выполнить два равноправных действия, свертку и сдвиг, и не существует способа выбрать одно из них. Может случиться, что нужно будет выбирать между двумя правомочными свертками, это называется конфликтом свертка-свертка. Заметьте, что конфликтов сдвиг-сдвиг не существует. При обнаружении приведенных конфликтов yacc все равно строит распознаватель. Это выполняется на основе одного из возможных вариантов. Правило, описывающее какие действия предпринимать в данной ситуации, называется правилом однозначности. По умолчанию применяются два правила однозначности:

1. В конфликте сдвиг-свертка предрочтение отдается сдвигу.
2. В конфликте свертка-свертка предпочтение отдается первой встреченной свертке.

Первое правило говорит о том, что применение свертки откладывается в пользу сдвига. Правило 2 дает пользователю негибкий метод управления, поэтому рекомендуется избегать подобных конфликтов.
Конфликты могут возникать либо вследствие ошибок во входной спецификации, либо потому, что для обработки корректных правил нужен распознаватель более сложный, нежели генерируемый yacc. К конфликтам может привести использование действий внутри правил, если действие применяется до того, как распознаватель выявит правило. В этом случае применение правил однозначности неуместно и ведет к некорректному распознавателю. По этой причине yacc всегда сообщает количество разрешенных по двум правилам конфликтов.
В общем случае, если возможно применить правила однозначности, всегда можно переписать грамматику так, чтобы конфликты не возникали. По этой причине, большинство генераторов рассматривали конфликт как неустранимую ошибку. По нашему мнению, перепись грамматики выглядит неестественно и приводит к медленным распознавателям. Таким образом, yacc всегда строит распознаватель, даже при наличии конфликтов. Как пример мощности правил однозначности, рассмотрим фрагмент программы с конструкцией if-then-else:

stat: IF'('cond')' stat
                         | IF'('cond')'stat ELSE stat
               ;

Здесь IF и ELSE лексемы, cond - нетерминал, описывающий условные выражения, stat - нетерминал, описывающий операторы. Первое правило назовем простым, второе составным. Эти правила приводят к неоднозначностям, так как входная строка вида

IF (C1) IF (C2) S1 ELSE S2

может структурироваться двумя путями:

IF (C1) {
          IF (C2) S1
} ELSE S2
либо
IF (C1) {
          IF (C2) S1
ELSE S2 }

Второй вариант наиболее распространен. Каждый ELSE связывается с последним IF, непосредственно предшествующим ELSE. Рассмотрим ситуацию, когда на входе IF (C1) IF(C2) S1, и распознаватель ищет ELSE. Можно сразу выполнить свертку по правилу для простого оператора и получить IF (C1) stat, а затем прочесть оставшийся ввод ELSE S2 и выполнить свертку по правилу составного оператора. С другой стороны, ELSE может быть сдвинут, прочитан S2, а правая часть

IF (C1) IF (C2) S1 ELSE S2

будет свернута по правилам составного оператора. Это ведет ко второму варианту группирования, что наиболее желательно.
Конфликты сдвиг-свертка возникают только при чтении определенного входного символа, ELSE и уже распознанной конструкции, как например

IF (C1) IF (C2) S1

В общем случае, конфликтов может быть много, и каждый из них будет связан со входным символом и набором уже прочитанных строк. Прочитанные строки характеризуются состояниями распознавателя.
Сообщения о конфликтах лучше всего разбирать по выходному файлу y.output. Возможный пример выдачи приведен ниже:

23: shift/reduce conflict (shift 45, reduce 18)
on ELSE
state 23
           stat: IF (cond) stat_ (18)
           stat: IF (cond) stat_ELSE stat
           ELSE shift 45                   . reduce 18

Первая строка описывает конфликт, определяя состояние и входной символ. Далее идет обычное описание состояния, в котором указано активное правило и действия. Вспомните, что символ подчеркивания отмечает уже прочитанные правила. Распознаватель может выполнить два возможных действия. Если входной символ ELSE, можно выполнить сдвиг в состояние 45. В состоянии 45 будет следующая строка:

stat: IF (cond) stat_ELSE stat

Заметьте, что в этом состоянии ELSE всегда сдвигается. В состоянии 23 альтернативное действие, описываемое `.' выполняется в том случае, если входной символ явно в правилах не указан. В этом случае, если входной символ не есть ELSE распознаватель выполняет свертку по правилу 18.

stat: IF'('cond')' stat

Не забудьте, что числа после команд свдига указывают на состояния, а числа после команд свертки относятся к правилам. В файле y.output после сворачиваемых правил указываются их номера. В каждом состоянии можно выполнить только одну свертку, которая и служит действием по умолчанию. Пользователь, столкнувшийся с неожиданными конфликтами, по-видимому, захочет заглянуть в файл y.output, чтобы убедиться в приемлемости действий по умолчанию. В серьезных случаях ему понадобится значительно больше информации, чем приводится в этом документе. В этом случае лучше обратиться к приведенному списку литературы или помощи знающего пользователя.