- •1. Начальные сведения о компиляции
- •1.1 Общие сведения о языке программирования и структуре транслятора.
- •1.2 Модель анализа-синтеза компиляции
- •1.3 Понятие прохода. Однопроходные и многопроходные компиляторы
- •1.4 Фазы компилятора
- •1.5 Управление таблицей символов
- •1.6 Обнаружение ошибок и сообщение о них
- •1.7 Фазы анализа
- •2. Лексический анализ
- •2.1 Назначение лексического анализатора
- •2.2 Атрибуты лексем
- •2.3 Общие принципы построения лексических анализаторов
- •2.4 Определение границ лексем
- •2.5 Выполнение действий, связанных с лексемами
- •2.6 Практическая реализация лексических анализаторов
- •2.7 Лексические ошибки
- •2.8 Способы построения лексических анализаторов
- •3. Определение лексем
- •3.1 Строки и языки
- •3.2 Операции над языками
- •3.3 Регулярные выражения
- •3.4 Регулярные определения
- •3.5 Распознавание лексем и регулярные выражения
- •3.6 Диаграммы переходов
- •Конечные автоматы
- •3.7.1 Недетерминированные конечные автоматы
- •3.7.2 Детерминированный конечный автомат
- •Преобразования нка
- •Построение конечного автомата по регулярной грамматике
- •4. Формальные языки и грамматики
- •4.1 Цепочки символов. Операции над цепочками символов
- •4.2 Понятие языка. Формальное определение языка
- •4.3 Способы задания языков
- •4.4 Синтаксис и семантика языка
- •4.5 Особенности языков программирования
- •4.6 Понятие о грамматике языка
- •4.7 Формальное определение грамматики. Форма Бэкуса-Наура
- •4.8 Принцип рекурсии в правилах грамматики
- •Другие способы задания грамматик
- •4.10 Запись правил грамматик с использованием метасимволов
- •4.11 Запись правил грамматик в графическом виде
- •4.12 Классификация языков и грамматик
- •4.12.1 Классификация грамматик по Хомскому
- •4.12.2 Классификация языков
- •4.12.3 Примеры классификации языков и грамматик
- •4.13 Цепочки вывода. Сентенциальная форма. Вывод. Цепочки вывода
- •4.14 Сентенциальная форма грамматики. Язык, заданный грамматикой
- •4.15 Левосторонний и правосторонний выводы
- •4.16 Дерево вывода. Методы построения дерева вывода
- •5. Синтаксический анализ
- •5.1 Основные принципы работы синтаксического анализатора
- •5.2 Роль синтаксического анализатора
- •5.3 Обработка синтаксических ошибок
- •5.4 Контекстно-свободные грамматики
- •5.5 Порождение
- •Деревья разбора и приведения.
- •Неоднозначность грамматик. Устранение неоднозначности
- •5.8 Устранение левой рекурсии
- •Левая факторизация
- •Эквивалентные преобразования кс-грамматик
- •6. Нисходящий анализ
- •6.1 Анализ методом рекурсивного спуска
- •6.2 Предиктивные анализаторы
- •6.3 Нерекурсивный предиктивный анализ
- •6.4 Множества first и follow
- •6.5 Построение таблиц предиктивного анализа
- •6.6 Ll(1)-грамматики
- •7. Восходящий синтаксический анализ
- •7.1 Понятие основы
- •7.2 Стековая реализация пс-анализа
- •Стек Вход
- •Стек Вход
- •7.3 Конфликты в процессе пс-анализа
- •7.4 Синтаксический анализ приоритета операторов
- •7.4.1 Грамматики простого предшествования
- •7.4.2 Грамматики операторного предшествования
- •7.4.3 Использование отношений приоритетов операторов
- •7.4.4 Нахождение отношений приоритетов операторов
- •7.4.5 Обработка ошибок переноса/свертки
- •7.4.6 Алгоритм синтаксического анализа простого предшествования
- •7.4.7 Алгоритм синтаксического анализа приоритета операторов
- •7.5.1 Алгоритм lr-анализа
- •7.5.2 Построение таблиц slr-анализа
- •7.5.3 Операция замыкания
- •7.5.4 Операция goto
- •7.5.5 Построение множеств пунктов
- •7.5.6 Построение таблицы разбора slr-анализа
- •8. Генерация кода. Методы Генерации кода.
- •8.1 Общие принципы генерации кода.
- •8.2 Внутреннее представление программы
- •8.3 Способы внутреннего представления программ.
- •8.4 Синтаксические деревья
- •8.4.1 Дерево разбора. Преобразование дерева разбора в дерево операций
- •Трехадресный код. Типы трехадресных инструкций
- •8.6 Тетрады - многоадресный код с явно именуемым результатом
- •8.8 Косвенные триады
- •8.9 Сравнение представлений: использование косвенного обращения
- •8.10 Ассемблерный код и машинные команды
- •8.11 Обратная польская запись операций
- •8.11.1 Вычисление выражений с помощью обратной польской записи
- •9. Синтаксически управляемая трансляция
- •9.1 Синтаксически управляемые определения
- •9.2 Вид синтаксически управляемого определения
- •9.3 Синтезируемые атрибуты
- •9.4 Наследуемые атрибуты
- •9.5 Графы зависимости
- •9.6 Порядок выполнения
- •9.7 Восходящее выполнение s-атрибутных определений
- •9.7.1 Синтезируемые атрибуты в стеке синтаксического анализатора
- •9.9 Схемы трансляции
- •9.9.1 Восходящее вычисление наследуемых атрибутов.
- •9.9.2 Наследование атрибутов в стеке синтаксического анализатора
- •9.9.3 Замена наследуемых атрибутов синтезируемыми
- •9.9.4 Память для значений атрибутов во время компиляции
- •9.9.5 Назначение памяти атрибутам во время компиляции
- •9.9.6 Устранение копий
-
Трехадресный код. Типы трехадресных инструкций
Трехадресный код представляет собой последовательность инструкций вида
х := у op z
где х, у и z — имена, константы или временные переменные, генерируемые компилятором; ор означает некоторый оператор, например арифметический оператор для работы с числами с фиксированной или плавающей точкой или оператор для работы с логическими значениями. Например, выражение исходного языка наподобие х+у*z может быть транслировано в следующую последовательность.
t1 := у * z
t2 := х + t1
Здесь t1 и t2— сгенерированные компилятором временные имена. Использование имен для вычисленных программой промежуточных значений обеспечивает трехадресному коду, в отличие от постфиксной записи, возможность легкого переупорядочения.
Термин "трехадресный код" отражает тот факт, что каждая инструкция обычно содержит три адреса — два для операндов и один для результата.
Список некоторых основных трехадресных инструкций, используемых в большинстве языков программирования:
-
Инструкции присвоения вида х := у op z, где ор— бинарная арифметическая или логическая операция.
-
Инструкция присвоения вида х := ор у, где ор — унарная операция. Основные унарные операции включают унарный минус, логическое отрицание, операторы сдвига и операторы преобразования, которые, например, преобразуют число с фиксированной точкой в число с плавающей точкой.
-
Инструкции копирования вида х : = у, в которых значение у присваивается х.
-
Безусловный переход goto L. После этой инструкции будет выполнена трехадресная инструкция с меткой L.
-
Условный переход типа if х relop у goto L. Эта инструкция применяет оператор отношения relop (<, >= и т.п.) к х и у, и следующей выполняется инструкция с меткой L, если соотношение х relop у верно. В противном случае выполняется следующая за условным переходом инструкция.
-
Индексированные присвоения типа х := y[i] x[i] := у. Первая инструкция присваивает х значение, находящееся в i-й ячейке памяти по отношению к у. Инструкция х[i] : = у заносит в i-ю ячейку памяти по отношению к х значение у. В обеих инструкциях х, у и i ссылаются на объекты данных.
-
Присвоение адресов и указателей вида х : = &у, х : = *у и *х : = у. Первая инструкция устанавливает значение х равным положению у в памяти. Предположительно, у представляет собой имя, возможно временное, обозначающее выражение с l-значением типа А [i,j ], а х — имя указателя или временное имя. Таким образом, r-значение х представляет собой значение некоторого объекта. Во второй инструкции под у подразумевается указатель или временная переменная, l-значение которой представляет собой местоположение ячейки памяти. В результате l-значение х становится равным содержимому этой ячейки. И наконец, инструкция *х := у устанавливает l-значение объекта, указываемого х, равным l-значению у.
Выбор приемлемых операторов, представляет собой важный вопрос в создании промежуточного представления. Очевидно, что множество операторов должно быть достаточно богатым, чтобы позволить реализовать все операции исходного языка. Небольшое множество операторов легче реализуется на новой целевой машине, однако ограниченное множество инструкций может привести к генерации длинных последовательностей инструкций промежуточного представления для некоторых конструкций исходного языка и добавить работы оптимизатору и генератору целевого кода.