LINUX.ORG.RU

Yacc shift/reduce conflicts


0

1

есть тут одна задачка, парсер яваподобного языка, но в него внесли некоторые поломки. Я с яком никогда не работал и не знаю в какую сторону копать. Вывод при компиляции такой:

$yacc -v parser.y yacc: 19 shift/reduce conflicts, 34 reduce/reduce conflicts.

Файлик вот http://dl.dropbox.com/u/3093821/parser.y

Может кто знает в какую сторону копать?


Одновременно с парсером должен был появиться файлик y.output, в котором расписано в каких состояниях конфликты и сами состояния. Найти проблему просто, починить - не факт :)

alexru ★★★★
()

Если коротко, ваша грамматика неоднозначна и YACC, на основе приоритета и ассоциативности «операторов», не может определить перенос или свертку делать - в 19 случаях, и если свертку, то по какому правилу - в 34 случаях.

Если у вас есть исходная грамматика, до изменений, то запостите её сюда тоже, а сами посмотрите diff. Напишите тест - входную строку на этом языке.

Определите, к каким правилам относятся изменения, в чем они заключаются?

Пробуйте вносить изменения в одно правило за раз, и смотреть на результат. Проверьте свои тесты, если это возможно.

Когда, после очередного изменения, грамматика станет неоднозначной, попробуйте привести примеры строки, для которой существует более одного дерева разбора. Напишите тест - эту строку.

Исправьте грамматику, чтоб это выражение вновь разбиралось однозначным образом. Проверьте ваш тест, если это возможно.

Действуйте примерно таким образом. Даже когда я вручную строил управляющие таблицы для LALR(1) анализаторов, это было эффективнее, чем разбираться по таблице, что же в грамматике не так.

anonymous
()
Ответ на: комментарий от anonymous

Спасибо. Исходного файла нет. Получить рабочую грамматику и есть задача. А вот насчет свертки и переноса я не знал. Сейчас читаю книжки.

demmsnt
() автор топика
Ответ на: комментарий от demmsnt

Я думаю, достаточно просто прочитать мануал по yacc, чтобы понять, как там все работает - стейт-машина у yacc совсем не сложная.

shylent
()
Ответ на: комментарий от demmsnt

В первую очередь прочтите в книге дракона раздел про SLR(1) анализ, и построение управляющей таблицы. Узнайте про SLR(1) пункты. Узнайте, как строится таблица, управляющая SLR(1) анализом.

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

Потом, если понадобится, сделайте то же самое для LALR(1) анализаторов.

anonymous
()
Ответ на: комментарий от annoynimous

Это означает, что по одному символу входного потока нельзя определить, по какому правилу сворачивать, и свидетельствует о том, что грамматика не LALR(1) вида. Необходимо привести её к LALR(1) виду. Скорее всего, эта грамматика даже не LR(1) вида. Вот ещё о чем ТС стоит почитать.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.