- •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) – таблиц разбора.
3. Преобразование регулярных выражений в недетерминированный конечный автомат
Описывать лексику языка удобнее в форме регулярных выражений, а распознавать язык с помощью КА. Поэтому важно уметь преобразовывать определения языка в форме регулярных выражений в определение в форме КА. Такое преобразование предложил Kennet Thompson.
Конечный автомат это пятерка (S, , , S0, F)
S - конечное множество состояний.
- конечное множество допустимых входных сигналов.
- функция переходов. Она отражает множество Sх({}) в множество состояний недетерминированного конечного автомата. Для детерминированного автомата функция переходов отражает множество Sх во множество состояний автомата. Другими словами, в зависимости от состояния и входного символа, определяет новое состояние автомата.
S0 - начальное состояние конечного автомата, S0 S.
F - множество конечных состояний автомата, F S.
Работа конечного автомата представляет собой последовательность шагов. Шаг определяется состоянием автомата и входным символом. Сам шаг состоит в изменении состояния автомата и считывании следующего символа входной последовательности.
Существуют следующие правила преобразования регулярных выражений в конечный автомат.
1 Регулярное выражение “” преобразуется в автомат из двух состояний и -перехода между ними (рисунок 1).
Рисунок 1. – Автомат для -перехода
2
Регулярное
выражение из одного символа “а”
преобразуется в конечный автомат из
двух состояний и перехода между ними
по входному сигналу а (рисунок 2).
Рисунок 2. – Автомат для перехода по символу а
3
Пусть
есть регулярное выражение rs
и уже построены конечные автоматы для
выражения r
и выражения s.
Тогда два автомата соединяются
последовательно. На рисунке 3 представлены
исходные автоматы для языков r
и s.
На рисунке автомат для распознавания
конкатенации этих языков.
Автомат для r Автомат для s
Рисунок 3. – Исходные автоматы
Рисунок 4. – Автомат для конкатенации языков
4
Пусть
есть регулярное выражение r
| s
и уже построены конечные автоматы для
выражения r
и выражения s
(рисунок 3). Тогда в результирующем
автомате должна быть альтернатива
выполнения одного из двух автоматов.
То есть автомат для выражения r
| s
при автоматах для r
и s
с рисунка 3 имеет вид, представленный
на рисунке 5.
Рисунок 5. – Автомат для объединения языков
5
Пусть
есть регулярное выражение r*
при построенном конечном автомате r.
В этом случае вводятся два новых состояния
для возможности обхода автомата выражения
r,
а также вводится -переход
между конечным и начальным состояниями
для возможности многократного повторения
автомата r.
Если для регулярного выражения r
построен автомат аналогичный рисунку
3, то регулярному выражению r*
соответствует конечный автомат,
представленный на рисунке 6.
Рисунок 6. – Автомат для замыкания Клини языка
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 хотя бы одно множество Т непомеченно выполнить
begin
пометить множество Т
Для каждого входного символа а выполнить
begin
U:=closure(Move(T, a));
Если U Dstates
то Dstates:=Dstates+U;
Dtrans[T, a]:=U;
end;
end;
АЛГОРИТМ:
1) заносим в множество Dstates состояние Т = - closure (s0) и оставляем это состояние не помеченным.
2) в цикле while существует Т, Т Dstates и Т – непомечено
do begin
1. помечаем состояние Т
2. в цикле для каждого входного символа «а», принадлежащего - алфавиту автомата, выполним следующее: вычислим множество U = - closure(move (T, a))
3. проверим, если U не принадлежит Dstates, тогда заносим U в Dstates непомеченным, т.е. (должны найти варианты переходов (оно должно быть обработано)). В множество Dstates заносим переход (Т, а, U).
На этом все циклы завешаются. Этот алгоритм позволяет построить ДКА.
