
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •10. Левая факторизация.
- •12. Построение множества follow
- •14. Алгоритм работы таблично управляемого анализатора для ll(1) – грамматики.
- •32. Генератор компиляторов уасс. Использование неоднозначных грамматик.
- •18. Разбор методом «сдвиг – свертка» (shift – reduce) на основе стека.
- •24. Алгоритм заполнения таблиц разбора для slr (1) анализатора.
- •28. Построение абстрактного синтаксического дерева.
- •22. Каноническая совокупность множеств ситуаций.
- •34. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.
- •36. Lr(1) анализ. Lr(1)-ситуация. Замыкание множества ситуаций. Определение переходов.
- •16. Построение отношения предшествования операторов исходя из их ассоциативности и приоритета. Алгоритм разбора для грамматик простого предшествования.
- •38. Lalr(1) – грамматики. Построение lalr(1) – таблиц разбора.
- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •5. Минимизация детерминированного конечного автомата.
- •13. Построение таблицы разбора для ll(1) – грамматики
- •7. Контекстно-свободные грамматики для регулярных языков.
- •11. Построение множества first
- •9. Исключение левой рекурсии.
- •15. Грамматики простого предшествования. Использование отношения предшествования операторов
- •21. Алгоритм вычисления замыкания множества ситуаций (Closure).
- •17. Синтаксический анализ снизу – вверх. Основа. Подрезка основы.
- •19. Активный префикс. Обосновать, что основа всегда формируется в вершине стека.
- •27. Синтезируемые атрибуты. Их обработка в алгоритме сдвиг–свертка.
- •23. Переходы в slr (1) анализаторе. Функция goto. Допустимая ситуация.
- •29. Наследуемые атрибуты. Граф зависимостей.
- •25. Алгоритм lr – разбора.
- •33. Автомат с магазинной памятью. Графическое представление автомата с магазинной памятью. Вычислительный процесс в мп – автомате.
- •37. Lr(1) анализ. Заполнение таблиц lr-разбора
- •35. Типы и проверка типов.
- •26. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
Если язык задан регулярными выражениями, то для него можно построить конечный автомат.
КА представляется диаграммой переходов. Узлы - состояния, дуги – переходы, финальное состояние - двойной кружок. Цепочка принимается автоматом, если существует путь из начального состояния в конечное, метки дуг которого, формируют эту цепочку. Автомат называется недетерминированным, если у него есть переходы из одного и того же состояния, помеченные одним и тем же символом, и в нем присутствуют - переходы.
Формально КА определяется пятеркой <S, , , s0, F>,
S – конечное множество состояний;
– конечное множество входных символов (алфавит);
d – отношение переходов, это подмножество S на Σ, к которому добавлена пустая строка; s ×( {})×s
s0 – начальное состояние; s0 S
F S – множество финальных состояний.
Для каждой пары (начальное состояние и входной символ) можно определить множество конечных состояний.
Считая функцией, через (s,а) будем обозначать множество состояний, в которые конечный автомат может перейти из состояния s по входному сигналу а. Пользуясь функцией , можно описать поведение конечного автомата.
Функция переходов - определяет для заданного состояния s и входной последовательности w множество состояний, в которых может оказаться автомат, обработав входную строку w.
Определяется:
1) s’ (S,) если s’ (s, )
2) s’ (S,) если есть путь по переходам, т.е. если есть состояние s’’ (S,) и одновременно s’ (s’’,)
3) когда строка не пустая: s’ (S,aw), если есть состояние s’’ (s, а) и s’ (s’’,w).
Язык распознается конечным автоматом, если он является множеством последовательностей:
Например, автомат A = <S, Σ, δ, so, F> распознаёт последовательности (язык):
L(A) { w | Δ(s0,w) ∩ F ≠ ∅ }, если автомат детерминированный: L(A) { w | Δ(s0,w) ∈ ∅ }.
4. Преобразование недетерминированного конечного автомата в детерминированный.
Работа конечного автомата заключается в нахождении пути от начального состояния в конечное, по которому можно прочитать лексему. Лексема принимается, если такой путь найден. Недетерминированный конечный автомат включает -переходы и переходы из одного состояния по одному и тому же входному символу в разные состояния. Поэтому при работе недетерминированного автомата возможны откаты в процессе поиска пути, вследствие этого недетерминированный автомат работает медленно. Для каждого недетерминированного конечного автомата можно построить детерминированный конечный автомат.
Рассмотрим алгоритм преобразования. Входом алгоритма является недетерминированный автомат N, выходом – детерминированный автомат D состоящий из множества состояний Dstates и множества переходов Dtrans.
Введем обозначения.
S - состояние из N;
T - множество состояний из N. При работе алгоритма такие множества становятся состояниями D.
Пусть реализованы следующие функции.
closure(S). Эта функция строит -замыкание состояния S, то есть множество состояний в которые можно перейти из S по -переходам, это множество включает также само состояние S;
closure(T). Функция строит -замыкание множества состояний T, то есть множество состояний, достижимых из множества состояний T через -переходы. Это множество включает и состояния, принадлежащие T.
Move(T, a). Функция строит множество состояний, в которые можно перейти из Т по входному символу а.
Алгоритм состоит в следующем.
Dstates:=close(S0); заносим в множество Dstates состояние Т = - closure (s0) и оставляем это состояние не помеченным.
Пока в Dstates хотя бы одно множество Т непомеченно выполнить
begin
пометить множество Т
Для каждого входного символа а принадлежащего - алфавиту автомата выполнить
Begin:
вычислим множество U:=closure(Move(T, a));
Если U Dstates
то Dstates:=Dstates+U заносим U в Dstates непомеченным
Dtrans[T, a]:=U;
end;
end;
Этот алгоритм позволяет построить ДКА.