
- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •5. Минимизация детерминированного конечного автомата.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •7. Контекстно-свободные грамматики для регулярных языков.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •9. Исключение левой рекурсии.
- •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) – таблиц разбора.
1. Операции над языками. Регулярные выражения.
На этапе лексического анализа необходимо распознавать, к какому классу принадлежит данная лексема. Задача состоит в построении лексических символов. Для каждого слова определяется формальный язык – множество последовательностей символов. Эти множества можно определять по индукции, т. е. берем базовое множество символов (элементов языка), а затем из них строим слова. В качестве базовых элементов могут выступать буквы или цифры.
Над множеством строк можно выполнять следующие операции:
1) Объединение (альтернатива). Если заданы два языка L и M, то объединением этих языков будет множество строк, каждое из которых принадлежит L или M:
L M = {s | s L s M}
2) Конкатенация (сцепление строк). Если заданы языки L и M, то их конкатенацией будет язык, элементы которого получены путем приписывания элементу из L элемента из M:
LM = { append(s1, s2) | s1 L s2 M}
Если L – это цифра, а M – буква, то LM = {“a1”, “a2”, …}
3) Замыкание Клини (итерация): обозначается как L* и получается объединением всех языков Li, где 0 ≤ i ≤ ∞ .
L0 L1 L2 … L* = ∞ i=0 Li
где L1 = L, L2 = LL (кусочки по два элемента), L3 = LL2, L0 = - пустая строка.
4) Положительное замыкание Клини (без пустой строки):
L+ = ∞ i=1 Li
Такими операциями определяется язык, на основе которого строятся лексические единицы.
Формальные языки можно определить, пользуясь регулярными выражениями. С их помощью можно показать, как строятся элементы языка. Регулярные выражения над алфавитом определяются индуктивно.
Операции, используемые в регулярных выражениях:
1) (пустая строка) – это регулярное выражение, обозначающее множество, состоящее из одной пустой строки {}.
2) если a , то a является регулярным выражением, обозначающим язык, содержащий один символ a - {a}.
3) если r и s – регулярные выражения, обозначающие языки, то L(r) и L(s), то можно построить следующие варианты выражений:
- (r) – регулярное выражение
- r|s – объединение (альтернатива) L(r) L(s)
- rs – конкатенация L(r)L(s)
- r* - регулярное выражение, обозначающее замыкание Клини L(r)*
Приоритет операций: замыкание Клини, конкатенация, альтернатива.
Цифра: (0|1|2|3…9)
Идентификатор: буква (буква | цифра)*.
Для каждого регулярного выражения можно построить НКА, для любого НКА можно построить ДКА, ДКА можно минимизировать, т.е. находить автомат с минимальным числом состояний.
2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
Если язык задан регулярными выражениями, то для него можно построить конечный автомат.
КА представляется диаграммой переходов. Узлы - состояния, дуги – переходы, финальное состояние - двойной кружок (рис. конечный автомат для (a+b)*). Цепочка принимается автоматом, если существует путь из начального состояния в конечное, метки дуг которого формируют эту цепочку.
Автомат называется недетерминированным, если у него есть переходы из одного и того же состояния, помеченные одним и тем же символом, и если в нем присутствуют - переходы.
Формально КА определяется пятеркой <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) ∈ ∅ }.