Это не совсем домашнее задание, но оно связано с моей учебой:
Например, грамматика выглядит так:
E -> E + E | E * E | -E | (E) | id
После устранения неоднозначности становится (начиная с оператора с наименьшим приоритетом)
E->-F|F
F->F+G|G
G->G*H|H
H->(E)|id
И после удаления левой рекурсии и левого факторинга (в данном случае не требуется) окончательная грамматика LL1 будет:
E->-F|F
F->GF'
F'->+GF'|e
G->HG'
B->*HG'|e
H->(E)|id
Что дает безошибочную таблицу парсера, которая работает нормально.
Теперь о проблеме, с которой я сталкиваюсь, предположим, что грамматика такая:
E -> E + E | E * E | id = E | (E) | id
Теперь я не могу создать таблицу синтаксического анализа без конфликтов, что означает, что моя последняя грамматика не LL1. Вот шаги:
после устранения неоднозначности:
E->id=F|F
F->F+G|G
G->G*H|H
H->(E)|id
А после удаления левой рекурсии и левого факторинга, грамматика становится:
E->id=F|F
F->GF'
F'->+GF'|e
G->HG'
B->*HG'|e
H->(E)|id
Но в таблице Parser есть конфликт, который я не могу удалить, что означает, что есть какой-то шаг, который я пропустил, или есть некоторая ошибка в шагах, которые я не могу найти. Пожалуйста, скажите мне, что я сделал не так, и как это исправить. Я давно работаю над этой проблемой.