- •Формальные грамматики и языки.
- •Задача разбора
- •Классификация грамматик по Холмскому.
- •Диаграмма состояний
- •Отношения предшествования
- •Распознаватель
- •Матрица предшествования
- •Некоторые приемы приведения к грамматикам простого предшествования.
- •Представление автоматов.
- •Концевые маркеры и выходы из распознавания.
- •Эквивалентность состояний.
- •Проверка эквивалентности двух состояний.
- •Недостижимые состояния.
- •Алгоритм составления списка достижимых состояний.
- •Приведённые автоматы.
- •Получение минимального автомата.
- •Недетерминированные автоматы.
- •Эквивалентность недетерминированных и детерминированных конечных распознавателей (нкр и дкр).
- •Задание:
- •Транслятор.
- •Введение таблицы символов.
- •Включение неявной информации.
- •Обнаружение ошибок.
- •Макрообработка и операции, выполняемые во время компиляции.
- •Синтез объектной программы.
- •Оптимизация.
- •Генерация кода.
- •Редактирование связей и загрузки.
- •Задача идентификации. Реализация ка при работе трансляторов.
- •Хранение информации о лексемах.
- •Механизм запоминания.
- •Метод хеширования.
- •Нисходящий разбор с возвратами.
- •Начальная установка.
- •Новый человек.
- •Неудача
- •Класс грамматик, допускающих нисходящий распознаватель.
- •Статистические управляемые схемы перевода и атрибутные грамматики.
- •Контекстные условия
Хранение информации о лексемах.
Компилятор использует таблицу имён для хранения информации о лексемах. Эта информация используется затем для двух целей. Во-первых, для проверки семантичной правильности исходной программы; например, если в исходной программе есть оператор вида GoTo LOOP, то компилятор должен проверить, что идентификатор LOOPвстречается в программе в качестве метки соответствующего оператора. Такую информации можно найти в таблице имён(хотя и не обязательно во время обработки оператора перевода). Во-вторых, информация в таблице имён используется при генерации кода. Например, А:=В+С, то сгенерированный для операции + код зависит от атрибутов идентификаторов В и С.
Лексический анализатор заносит имена и информацию в таблицу имён. Чтобы сконструировать эффективный компилятор надо уметь по данному вхождению идентификатора быстро определить отведении ли для этого элемента ячейка в таблице имён. Если этого элемента нет, то надо иметь возможность быстро вставить идентификатор в таблицу.
Пример:
Пусть разрабатывается компилятор с языка, в котором объявления массивов определяется следующими правилами: <оператор массива > → массив<список массивов >
<список массивов> → <определение массива> , <список массивов >/<определение массива>.
<определение массива>) -> <идентификатор массива> (<целое>).
Пример: массив АB(10), СD(20).
Для простоты мы предлагаем, что массивы одномерны. Дерево разбора:
Естественно, оператор объявления массивов не выполняется; он не компилируется в машинный код. Однако, имеет смысл рассматривать его перевод как последовательность шагов по организации информации, которые должны выполнятся непосредственно компилятором. Таким образом, если переводом идентификатора является указатель на отведенное для него место в таблице имён, а перевод целого – оно само, то синтаксически управляемым переводом вершины, помеченной <оператор массива > могут быть команды для механизмов организации информации, предназначенные для того, чтобы запомнить что идентификатор – это массив, а его размер – это соответствующее целое.
Способы применения информации, запомненной в таблице имён, многочисленны. Простой пример: для каждого подвыражения в арифметическом выражении может требоваться информация о его виде, чтобы знать, над какими числами выполнять арифметические операции – над числами с фиксированной или плавающей точкой, комплексными числами и т.д. Эта информация выбирается из таблицы имён для листьев, помеченных как константы или идентификаторы, и передаётся вверх по дереву в соответствии с таким, например, соглашением, что число с фиксированной точкой плюс число с плавающей точкой равно число с плавающей точкой, а число с плавающей точкой плюс комплексное число равно комплексное число. С другой стороны язык, а следовательно и компилятор, может запрещать выражения со смешанными типами.
