- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •5. Минимизация детерминированного конечного автомата.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •7. Контекстно-свободные грамматики для регулярных языков.
- •9. Исключение левой рекурсии.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •10. Левая факторизация.
- •11. Построение множества first
- •12. Построение множества follow
- •14. Построение таблицы разбора для ll(1) – грамматики
- •15. Алгоритм работы таблично управляемого анализатора для ll(1) – грамматики.
- •16. Грамматики простого предшествования. Использование отношения предшествования операторов
- •17. Построение отношения предшествования операторов исходя из их ассоциативности и приоритета. Алгоритм разбора для грамматик простого предшествования.
- •18. Синтаксический анализ снизу – вверх. Основа. Подрезка основы.
- •19. Разбор методом «сдвиг – свертка» (shift – reduce) на основе стека.
- •20. Активный префикс. Обосновать, что основа всегда формируется в вершине стека.
- •22. Алгоритм вычисления замыкания множества ситуаций (Closure).
- •23. Каноническая совокупность множеств ситуаций.
- •24. Переходы в slr (1) анализаторе. Функция goto. Допустимая ситуация.
- •25. Алгоритм заполнения таблиц разбора для slr (1) анализатора.
- •26. Алгоритм lr – разбора.
- •33. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
- •34. Синтезируемые атрибуты. Их обработка в алгоритме сдвиг–свертка.
- •35. Построение абстрактного синтаксического дерева.
- •36. Наследуемые атрибуты. Граф зависимостей.
- •42. Генератор компиляторов уасс. Использование неоднозначных грамматик.
- •43. Автомат с магазинной памятью. Графическое представление автомата с магазинной памятью. Вычислительный процесс в мп – автомате.
- •44. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.
- •35. Типы и проверка типов.
- •27. Lr(1) анализ. Lr(1)-ситуация. Замыкание множества ситуаций. Определение переходов.
- •30. Lr(1) анализ. Заполнение таблиц lr-разбора
- •31. Lalr(1) – грамматики. Построение lalr(1) – таблиц разбора.
22. Алгоритм вычисления замыкания множества ситуаций (Closure).
Для заданного множества ситуаций I грамматики G, замыкание этого множества Closure(I):
Базовый случай: все ситуации I Î closure(I).
Общий случай (шаг индукции): если ситуация [ A → α • B β ] Î closure(I), правило может начать ожидать свою основу B → γ (существует такая продукция), то добавим ситуацию [ B → • γ ] Î closure(I).
Этот процесс выполняется до тех пор, пока что-то можно добавить в множество closure(I).
Пример:
Для пополненной грамматики:
E’ → E
E → E + T | T
T → T * F | F
F → ( E ) | id
Если вначале множество I содержит 1 ситуацию:
Построим closure(I), где I = {[E’ → •E]}:
closure(I) будет содержать:
[E’ → • E]
[E → • E + T]
[E → • T]
[T → • T * F]
[T → • F]
[F → •( E )]
[F → • id]
23. Каноническая совокупность множеств ситуаций.
Основная идея SLR-метода состоит в том, чтобы вначале построить на базе грамматики детерминированный конечный автомат для распознавания активных префиксов. Группируем пункты в множества, которые приводят к состояниям SLR-анализатора. Пункты могут рассматривается как состояния недетерминированного конечного автомата, распознающего активные префиксы.
Операция замыкания. Если I- множество пунктов грамматики G, то closure(I) – множество пунктов, построенное из I по следующим правилам: 1) В замыкание closure(I) заносится множество ситуаций I. 2) Если ситуация [AB] уже принадлежит closure(I) и есть продукция B, то добавляем в closure(I) ситуацию [B].Применяем это правило до тех пор, пока не внесем все возможные пункты в closure(I)
Наличие AB в closure(I) указывает, что в некоторый момент в процессе синтаксического анализа мы полагаем, что можем встретить во входном потоке подстроку, выводимую из B. Но если имеется продукция B, то, естественно, мы также можем встретить в этот момент строку, выводимую из , поэтому включаем B в closure(I)
Любое множество можно разделить на два класса: 1) Базисные пункты включающие начальный пункт S’ -> *S и все пункты, у которых точки расположены не у левого края. 2) Небазисные пункты, у которых точки расположены слева.
Переходы по функции (goto (I,x)) представляет собой множество ситуаций, в которые можно перейти из множества ситуаций I по грамматическому символу х, то есть по терминалу или нетерминалу. При выполнении функции (goto (I,x)) строят замыкание множества состояний вида [Ax], если в I есть ситуация [Ax], то есть точка переходит за символ х в ситуациях. После этого строиться замыкание этого множества.
Используя функции closure(I) и goto(I,x) можно построить каноническую совокупность всех возможных множеств ситуаций дополненной грамматики. Для этого строят замыкание для ситуации [SS]. После этого в цикле находят все множества ситуаций, в которые можно перейти из уже найденного множества по любому грамматическому символу. Цикл завершается, когда нельзя ничего нового добавить в каноническую совокупность.
24. Переходы в slr (1) анализаторе. Функция goto. Допустимая ситуация.
Переход представляет собой множество ситуаций, в которые можно перейти из множества ситуаций I по грамматическому символу х, то есть по терминалу или нетерминалу. При выполнении функции (goto (I,x)) строят замыкание множества состояний вида [Ax], если в I есть ситуация [Ax], то есть точка переходит за символ х в ситуациях. С помощью этих переходов строится таблица goto.
Функция goto (I, X), где I - множество ситуаций, X - символ грамматики. goto (I, X) определяется как замыкание множества ситуаций , принадлежащих I. Функция возвращает новое состояние конечного автомата.
Ситуация A->β1*β2 называется допустимой для активного префикса αβ1 если существует порождение S’ =>R* αAq =>R αβ1β2γ. Ситуация может быть допустимой для многих активных префиксов.
Главная теорема LR-разбора: Множество допустимых ситуаций активного префикса γ – в точности то множество ситуаций, которые допустимы из начального состояния по пути, помеченному γ в детерминированном конечном автомате, построенному из канонической совокупности множеств ситуаций и переходов, определенных функцией goto.
Определение переходов
Определим функцию переходов Goto(I,x), где I-множество ситуаций, X-грамм символ. Строит то же множество ситуаций в которые можно перейти из заданного множества по символу X. Функция Goto строит замыкания вида:
[ A → α X • β ] если ситуация [ A → α • X β ] Î closure(I). Если в I есть ситуация в которой следует заданный символ X, она превращается в (2).
I={[E’→E*], [E→E*+T]}
Построим результат Goto(I,+):
[E→*E+T]
[T →*T•F]
[T →*F]
[F →*(E)]
[F →*id].
