
- •Компиляция. Основные понятия. Контекст компилятора
- •Этапы, фазы и проходы
- •Фаза анализа. Основные понятия.
- •Фаза синтеза. Основные понятия.
- •Методы определения языка
- •Понятие регулярных выражений
- •Понятие грамматики
- •8.Иерархия грамматик по Хомскому
- •9 . Порождения синтаксические деревья
- •Неоднозначность
- •11.Понятие лексического анализа
- •12.Лексический анализ с помощью регулярных выражений
- •Лексический анализ с помощью конечных автоматов
- •14. Лексический анализ с помощью Lex
- •15. Нисходящий анализ. Критерии принятия решений.
- •16. Понятие ll(1)-грамматики
- •17. Рекурсивный спуск. Расширенная форма записи правил для исключения рекурсивных вызовов.
- •18. Рекурсивный спуск. Комбинирование рекурсии и итерации.
- •19. Преобразование грамматик. Удаление левой рекурсии
- •20. Преобразование грамматик. Факторизация
- •21. Введение действий в грамматику
- •22. Восходящий синтаксический анализ. Основные понятия. Критерий принятия решений
- •Восходящий синтаксический анализ. Таблица синтаксического анализа.
- •25. Характеристический конечный автомат.
- •Восходящий синтаксический анализ. Slr(1), lalr(1), общий алгоритм формирования таблицы lr(1)-анализа.
- •Восходящий синтаксический анализ. Генератор восходящих анализаторов yacc. Основные понятия.
- •Семантический анализ. Не-контекстно-свободные характеристики языков.
- •Семантический анализ. Таблица символов.
- •Семантический анализ. Таблица типов.
- •31.Семантический анализ. Таблицы функций. Таблицы меток
- •32. Распределение памяти. Классификация памяти
- •33. Распределение памяти. Стек времени выполнения. Определение области видимости.
- •34. Распределение памяти. Стековый фрейм.
- •35. Распределение памяти. Дисплей.
- •35. Адреса времени компиляции. Простые адреса. Адресация элементов статического массива.
- •37. Распределение памяти. Адреса времени компиляции. Адреса динамического массива
- •38. Куча. Основные понятия. Методы автоматического освобождения памяти.
Фаза анализа. Основные понятия.
Лексический анализ
Синтаксический анализ
Семантический анализ
Лексический анализ (сканирование) - Поток символов исходной программы считывается слева направо и группируется в токены, представляющие собой последовательности символов с определенным совокупным значением.
Синтаксический анализ (разбор) - Выполняет группирование токенов исходной программы в грамматические фразы, используемые компилятором для синтеза вывода.
Семантический анализ - Проверяется наличие семантических
ошибок и накапливается информация о типах для следующей стадии.
Фаза синтеза. Основные понятия.
Этап синтеза состоит из следующих фаз: 1.Генерация машинно-независимого кода. 2.Оптимизация машинно-независимого кода. 3.Распределение памяти. 4.Генерация машинного кода. 5.Оптимизация машинного кода.
В фазе распределения памяти каждая константа и переменная, фигурирующие в программе, получают зарезервированное место в памяти для хранения своего значения. Статическая память, если время жизни переменно равно времени жизни программы; не может быть освобождена до завершения выполнения программы. Динамическая память, если время жизни переменной равно времени жизни определенного блока, функции или процедуры; может быть освобождена после выполнения данного фрагмента программы. Глобальная память, если на момент компиляции время жизни неизвестно, а память должна выделяться и освобождаться в процессе выполнения. Результатом работы фазы распределения памяти является создание адреса, в котором содержится полная информация о локализации памяти. В дальнейшем адрес передается генератору кода. Если в логических терминах компилятор рассматривается как состоящий из этапов и фаз, физически он составлен из проходов. Компилятор осуществляет проход каждый раз при считывании исходного кода или его представления. Многие компиляторы являются однопроходными, т.е. полный процесс компиляции полностью выполняется при однократном чтении кода.
Инструментальные средства
Генераторы сканеров
Генераторы синтаксических анализаторов
Автоматические генераторы кода
Методы определения языка
Определение
языка должно
определять все строки символов,
существующих в данном языке (синтаксис
языка), а также их значения или планируемый
эффект (семантика языка).
;
где
«|»-знак, означающий «где», n-целое,
«умножение»- конкатенация.
-
пустая строка. Пустые строки играют
важную роль в определении языков
программирования. x*y*
где «*»-
звездочка Клини, означает, что
предшествующий ему элемент, употребляется
нуль или ещё большее число раз. x*y+
где «+»-
одно или большее число вхождений,
предшествующего элемента. Алфавит
представляет собой конечный набор
символов. Если А-алфавит, то к числу
регулярных выражений относятся: нулевая
строка(
),
любой элемент А.
Определение языка должно быть
точным (или формальным);
лаконичным;
машинно-читаемым.
Несколько очень простых языков