Существует два типа конфликтов: уменьшение / уменьшение и сдвиг / уменьшение. Когда возникает какой-либо конфликт, это потому, что создаваемая вами грамматика неоднозначна. Ваш сдвиг / уменьшение появляется потому, что Бьяк не знает, следует ли ему уменьшить правило «тело» и перейти в состояние 36 (, например «Я нашел это правило, введите данные для следующего!» ) ИЛИ если он сместит (потребит / примет) другой токен и продолжит поиск правила для принятия ( вроде "Я не нашел полное правило, но предоставлю больше информации, возможно, тогда я ).
Byacc всегда создает однозначный синтаксический синтаксический анализатор. Как? Когда возникает конфликт (сомнение), он просто выбирает его. Который из? Для уменьшения / уменьшения он выбирает первый, который появится в файле. Для сдвига / уменьшения по умолчанию всегда выбирается смещение. Так что ... по умолчанию вы получите желаемое поведение.
Тем не менее, это хорошая идея иметь однозначную грамматику. Для этого вам придется разрешить конфликт. Это означает, что вам нужно найти способ избежать этой нерешительности Бьякка. Я надеюсь, что кто-то еще может помочь вам с этим, я не эксперт. Я знаю, что вы можете достичь этого, уменьшив количество правил и удалив пустые правила, такие как:
A: /* empty */
| a
;