Бизон /Yacc уменьшите уменьшить конфликт для конкретного примера грамматики
У меня есть проект парсера для моего класса компиляторов. Я не смог разрешить конфликт уменьшить / уменьшить для одного из правил.
Графическое представление этого правила грамматики доступно по этой ссылке (извините, я не могу опубликовать изображение здесь из-за политик stackru):
Графическое представление правила грамматики type
Где все овалы являются терминальными символами.
Поскольку это правило выглядит немного сложным, я попытался разбить его на более мелкие части. Вот моя попытка построить грамматику:
type : id_or_int brackets_or_end
;
id_or_int : IDnum
| INTnum
;
brackets_or_end : brackets remainingpartboe
|
;
brackets : LBRACnum RBRACnum brackets
|
;
remainingpartboe: DOTnum type
|
;
Обратите внимание, что терминалы - это слова, оканчивающиеся на суффикс num, например, DOTnum. Остальные нетерминалы.
Бизон сообщает о следующем конфликте
mj-parser.y: conflicts: 1 reduce/reduce
mj-parser.y:122.18: warning: rule useless in parser due to conflicts:
brackets_or_end: /* empty */
Обратите внимание, что вышеприведенная ошибка бизона относится ко второму варианту создания правила brackets_or_end.
Пожалуйста, помогите в разрешении этого конфликта, предложив другой способ написания грамматики. Кстати, я посмотрел на подробный вывод Bison, но это не сильно помогло.
Спасибо -sas
1 ответ
(Ответ в ответе на вопрос. Преобразован в вики-ответ сообщества. См. Вопрос без ответов, но проблема решена в комментариях (или расширена в чате))
@BobDalgleish написал:
Обратите внимание, что у вас есть два нетерминала, которые могут быть пустыми в одном и том же производственном дереве. Таким образом, пустая строка может быть уменьшена до скобок или brackets_or_end. Это не сработает.
ОП написал:
Ты абсолютно прав, Боб. Спасибо за подсказку: скобки не должны иметь эпсилон-сокращения. Это удалит конфликт уменьшения-уменьшения.