
- •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. Контекстно–зависимый анализ. Синтаксически управляемая трансляция.
5. Минимизация детерминированного конечного автомата.
Известно, что для каждого ДКА можно определить единственный минимальный (с точностью до наименований состояний) ДКА.
В автомате некоторые состояния могут быть эквивалентными.
Состояние Si и Sj эквивалентны при выполнении двух условий:
1) оба конечные
2) оба не конечные, но для каждого входного символа они имеют переходы в эквивалентное состояние.
Алгоритм минимизации:
1) разбиваем множество состояний КА на два подмножества – финальное и не финальное.
2) последовательно разбиваем подмножества на более мелкие части, если есть состояния, имеющие переходы в разные группы.
Т.о. при минимизации конечного автомата все состояния делятся на две группы: финальные и нефинальные. Затем выполняется следующая процедура. Рассматриваем группу {S1, S2, …, Sk} и некоторый входной символ а. Если по этому входному символу есть переходы в разные группы, то исходную группу разбивают на части. Принадлежность Si к той или иной части зависит от того, в какую группу существует переход из состояния Si по входному символу а. Эта процедура продолжается до тех пор, пока не останется ни одной группы, которую можно было бы разбить по какому-либо входному сигналу.
13. Построение таблицы разбора для ll(1) – грамматики
Таблица синтаксического разбора представляет собой двумерную таблицу, в которой строки соответствуют нетерминалам, а столбцы – терминалам грамматики. Значения в ячейках этой таблицы определяют продукцию, которая должна быть активирована на текущем шаге алгоритма при получении следующей лексемы. Для построения данной таблицы требуется предварительно построить для каждого нетеминала грамматики множества first и follow. Эта таблица определяет, какую продукцию нужно рассматривать для некоторой пары: терминал на входе и нетерминал в вершине стека. Таблица разбора строится следующим образом.
Для всех продукций А грамматики выполняем:
1 Для всех терминалов а, принадлежащих first() в клетку [А, а] таблицы разбора записываем продукцию А.
2 Если принадлежит first(), то для всех b, принадлежащих follow(А), в клетку [A, b] записываем продукцию А.
Во все остальные клетки таблицы записываем признак ошибки. Это означает, что при данном нетерминале в стеке не ожидается указанный терминал во входной последовательности.
Если при построении таблицы возникает попытка в одну клетку записать две или более продукции, то разбираемая грамматика не является LL(1)-грамматикой, следовательно, не может разбираться таким способом.
7. Контекстно-свободные грамматики для регулярных языков.
Не все языки можно разбирать с помощью регулярных выражений, например нельзя записать регулярное выражение для степенной функции. Для работы с такими языками используются контекстно-свободные грамматики.
КСГ описывают язык как множество строк, полученных применением конечного числа продукций к стартовому символу. КСГ – четверка символов <V, , P, S>, где
V - конечное множество грамматических символов;
- терминальные символы; N = V - - нетерминальные символы. , N V.
P – множество продукций; P N * V* - последовательность грамматических символов (возможно пустая). Условие, что <A, > p, будет записываться в виде А→.
S- стартовый (начальный) нетерминал. Отметим условные обозначения:а, b, c – терминальные символы;A, B, C – нетерминальные символы; U, V, W – переменные, принадлежащие множество V;, , - последовательности грамматических символов (, , V*);u, v, w – элементы алфавита (u, v, w ). Продукция – это последовательность, начинающаяся с нетерминального символа (левая часть правила), за которым следует замыкание Клини терминальных и нетерминальных символов (правая часть правила). Каждая продукция имеет голову и хвост (правая и левая части). Голова всегда нетерминал, который частично определяется этой продукцией, хвост – конечная цепочка грамматических символов, которая служит определением этого нетерминала. Для каждой грамматики можно определить правило непосредственного вывода или правила постановки правила. Любой регулярный язык м. б. описан КСГ.
Алгоритм: для каждого КА строит КСГ.
1. берем алфавит КА и считаем его множеством терминальных символов;
2. множество состояний автомата берем в качестве множества нетерминальных символов, где начальное состояние соответствует стартовому нетерминалу;
3. если в КА есть переход из сост-я А в сост-е В по входному символу х, в грамматику включается продукция А→хВ
4. если состояние С – финальное, то включается продукция С→.
Класс грамматик, порождающих регулярные языки, называется праволинейными (правая часть каждого ее правила содержит не более 1 нетерминала, который стоит в конце).