
- •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) – таблиц разбора.
5. Минимизация детерминированного конечного автомата.
Было доказано, что для каждого ДКА можно определить единственный минимальный (с точностью до наименований состояний) ДКА.
В автомате некоторые состояния могут быть эквивалентными.
Состояние Si и Sj эквивалентны при выполнении двух условий:
1) оба конечные
2) оба не конечные, но для каждого входного символа они имеют переходы в эквивалентное состояние.
Алгоритм минимизации:
1) разбиваем множество состояний КА на два подмножества – финальное и не финальное.
2) последовательно разбиваем подмножества на более мелкие части, если есть состояния, имеющие переходы в разные группы.
При минимизации конечного автомата все состояния делятся на две группы: финальные и нефинальные. Затем выполняется следующая процедура. Рассматриваем группу {S1, S2, …, Sk} и некоторый входной символ а. Если по этому входному символу есть переходы в разные группы, то исходную группу разбивают на части. Принадлежность Si к той или иной части зависит от того, в какую группу существует переход из состояния Si по входному символу а. Эта процедура продолжается до тех пор, пока не останется ни одной группы, которую можно было бы разбить по какому-либо входному сигналу.
6. Контекстно-свободные языки. Вывод. Дерево вывода.
КСЯ можно разбирать на части. Паскаль имеет вложенную структуру. If E then S1 (оператор) else S2 (оператор). Здесь можно выделить синтаксические категории (S1) – нетерминалы и ключевые слова – терминалы (имеют законченный вид). Для описания синтаксиса ЯП используется БНФ. В ней даются определения нетерминалов через терминалы и нетерминалы. Для оператора if:
<оператор>::= if <выражение> then <оператор> else <оператор>. Далее каждый оператор также можно раскрыть.
Для каждой грамматики можно определить правило непосредственного вывода: если определены последовательности символов и такие, что V* и V* (конечное множество грамматических символов), и если задана продукция А→Р, то из последовательности символов А можно получить .
Здесь → означает применение правила подстановки или непосредственного вывода.
Допустим, если есть последовательность аАВС, то используя грамматику, применив правило 5 только к В, получим:
аАВС→аАвВС
↑
5
Выводом называется последовательность постановок, она обозначается →*. Эта запись означает, что из выводится за 0 или более шагов. →+: из выводится за 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 нетерминала, который стоит в конце).