- •1. Операции над языками. Регулярные выражения.
- •4) Положительное замыкание Клини (без пустой строки):
- •2. Недетерминированный конечный автомат: формальное определение, построение множества достижимых состояний.
- •3. Преобразование регулярных выражений в недетерминированный конечный автомат
- •4. Преобразование недетерминированного конечного автомата в детерминированный.
- •5. Минимизация детерминированного конечного автомата.
- •6. Контекстно-свободные языки. Вывод. Дерево вывода.
- •7. Контекстно-свободные грамматики для регулярных языков.
- •9. Исключение левой рекурсии.
- •8. Метод грамматического разбора сверху - вниз. Ll(1) – грамматики.
- •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) – таблиц разбора.
44. Автомат с магазинной памятью. Допустимость по заключительному состоянию и по пустому магазину.
Автомат с магазинной памятью – это недерменированный конечный автомат с έ-переходами и одним дополнением – магазин, в котором хранится цепочка “магазинных символов”. Магазинный автомат может обозревать символ на вершине магазина и совершать переход нм основе текущего состояния, входной символ и символ на вершине магазина. Он может выполнить спонтанный переход, используя έ в качестве входного символа. За один такт автомат совершает следующие действия: 1) прочитывает и пропускает входной символ. Если в качестве входа έ, то входные символы не пропускаются. Переходит в новое состояние, которое может и не отличаться от предыдущего 3) Заменяет символ на вершине магазина некоторой цепочкой. Цепочкой может быть έ, что соответствует снятию с вершины магазина, т.е магазин не измениться. Автомат может заменить магазинный символ на один или несколько.
Формально МП-автомат - это семёрка объектов <Q, Σ, Г, δ, q0, Z0, F> где Q - конечное множество состояний; Σ - конечное множество символов – алфавит; Г - конечное множество символов – алфавит магазина; δ - функция переходов, которая тройке аргументов (q,a,X), q ∈Q, a ∈ Σ, X ∈ Г, ставит в соответствие множество пар (p,γ), где p - новое состояние, γ – цепочка магазинных символов, заменяющая X на вершине магазина; q0 ∈Q - начальное состояние; Z0 – начальный символ магазина.
F - Множество финальных состояний.
Допустимость. Первый способ определения МП-а допускает свой вход, прочитывая его и достигая заключительного состояния. Существует способ определения МП-а, при котором мы может определить язык допускаемый по пустому магазину, т.е множество цепочек, приводящих МП-а в начальной конфигурации к опустошению магазина. Эти два метода эквиваленты в том смысле, что для языка L найдется МП-а допускающий его по заключительному состоянию тогда и только тогда, когда для L найдется МП-а, допускающий его по пустому магазину.
По состоянию: Пусть P= <Q, Σ, Г, δ, q0, Z0, F> - МП-а, тогда L(P) – язык, допускаемый P по заключительному состоянию определяется так: {w | (q0 w, Z0 ) } |-* (q, έ, α)} для некоторого состояния q из F и произвольной магазинной цепочки α. Таким образом начиная со стартовой конфигурации с w на входе, P прочитывает w и достигает допускающего состояния. Содержимое магазина при этом не имеет значения. По магазину: Пусть P - МП-а, тогда N(P) {N – пустой магазин} – язык, допускаемый P по пустому магазину определяется так: N(P) = {w| (q0 w Z0) |-* (q, έ, έ)} где q – любое состояние. Таким образом N(P) представляет собой множество входов w, которые P может прочитать, одновременно опустошив магазин.
35. Типы и проверка типов.
Тип данных — фундаментальное понятие теории программирования. Тип данных определяет множество значений, набор операций, которые можно применять к таким значениям и, возможно, способ реализации хранения значений и выполнения операций.
Компилятор должен убедится, что исходная программа следует как синтаксическим, так и семантическим соглашениями исходного языка. Проверка бывает статической(проверяет компилятор) и динамической(выполняется целевой программой). Компилятор должен сообщать об ошибке, если оператор применяется к несовместимому с ним операнду. Проверка типов может осуществляться сразу в семантическом анализаторе или/и после синтаксического анализа и построения синтак. дерева. Программа проверки типов проверяет, чтобы тип конструкции соответствовал ожидаемому в данном контексте. Информация о типах собирается программой проверки типов, может потребоваться при генерации кода. Построение программы проверки типов базируется на информации о синтаксических конструкциях языка, представлении типов и правилах присвоения типов конструкциям.
Тип языковой конструкции будет описывать “выражение типа”, т.е выражение типа либо представляет собой базовый тип, либо построен с помощью применения оператора, называемого конструктором типа, к другим выражениям типа. Базовый тип является выражением типа. В базовый тип входят boolean, char, integer. Поскольку выражение типа можно именовать, имя типа является выражением типа. Конструкторы типа могут включать следующее: массивы, произведения, записи, указатели, функции.
Система типов представляет собой набор правил для назначения выражения типов различными частями программы. Программа проверки реализует систему типа синтаксическим способом.(т.е добавлением условий к правилам)
{ спросить что тут ещё нужно
Спецификация простой программы проверки типов.
Программа проверки типов представляет собой схему трансляции, синтезирующую тип каждого выражения из типов их подвыражений, и может обрабатывать массивы, указатели, инструкции и функции. }
Соответствие типов переменных можно сформулировать в виде логических правил типирования.
В системе проверки типов содержаться аксиомы и правила вывода, на основе которых можно выводить типы выражений. Тип выражения определяется из контекста программы.
Например если возьмем выражение Lispa
( let ((x 5) (y 7) (+ x y))
x: int, y: int → (+x y): int (сумма тоже целочисленна)
Информацию, получаемую из контекста, будем называть окружением типирования или просто окружением (Е).
Тот факт, что е имеет тип τ в окружении Е будем записывать: Е├ е : τ. Такое утверждение называется типированием. Если окружение является пустым, например для одной константы 5, то запишем: ├5:Int. В процессе проверки типов окружение может расширяться, т.е. в него могут добавляться новые сведения о типе.
Система проверки типов является дедуктивной системой. В ней аксиомы определяют правильное назначение типа примитивным элементам, а правила – сложным выражениям. А тип сложного выражения определяется исходя из типов составляющих его частей с применением соответствующего правила вывода: t1,t2,…/t, где t1,t2,… - типирование. Если типирование t1,t2,…выполняется (истинно), тогда выполняется и типирование t.
Для суммы двух целых чисел применимо следующее правило типирования:
Е├е1:Int Е├е2:Int
Е├е1+е2:Int
Все выражения программы должны иметь вывод ├е: τ для некоторого типа τ. Такие выражения называются правильно-типированные. Если для какого-то выражения тип вывести нельзя, то транслятор выдаст сообщение о несоответствии типов: type miss match.
