
- •Глава 1. Введение 2
- •Глава 2. Лексический анализ 6
- •2.4. Построение детерминированного конечного
- •Глава 3. Синтаксический анализ 20
- •Глава 8. Генерация кода 76
- •Глава 9. Системы автоматизации построения трансляторов 120
- •Глава 1. Введение
- •1.1. Место компилятора в программном обеспечении
- •1.2. Структура компилятора
- •Глава 2. Лексический анализ
- •2.1. Регулярные множества и регулярные выражения
- •2.2. Конечные автоматы
- •2.5. Программирование лексических анализаторов
- •2.6. Конструктор лексических анализаторов lex
- •Глава 3. Синтаксический анализ
- •3.1. Основные понятия и определения
- •3.2. Таблично-управляемый предсказывающий разбор
- •3.2.1. Алгоритм разбора сверху-вниз
- •3.2.2. Множества first и follow.
- •3.2.4. Ll(1)-грамматики
- •3.2.5. Удаление левой рекурсии
- •3.2.6. Левая факторизация
- •3.2.7. Рекурсивный спуск
- •3.2.8. Диаграммы переходов для рекурсивного спуска
- •3.2.9. Восстановление после синтаксических ошибок
- •3.3. Разбор снизу-вверх типа сдвиг-свертка
- •3.3.1. Основа
- •3.3.2. Lr(k)-анализаторы
- •3.3.4. Конфликты разбора типа сдвиг-свертка
- •3.3.5. Восстановление после синтаксических ошибок
- •Глава 4. Промежуточные представления программы
- •4.1. Представление в виде ориентированного графа
- •4.2. Трехадресный код
- •4.3. Линеаризованные представления
- •4.4. Организация информации в генераторе кода
- •4.5. Уровень промежуточного представления
- •Глава 5. Элементы теории перевода
- •5.1. Преобразователи с магазинной памятью
- •5.2. Синтаксически управляемый перевод
- •5.3. Атрибутные грамматики
- •5.3.1. Определение атрибутных грамматик
- •5.3.2. Атрибутированное дерево разбора
- •5.3.3. Язык описания атрибутных грамматик
- •Глава 6. Контекстные условия языков программирования
- •6.1. Описание областей видимости и блочной структуры
- •6.2. Структура среды Модулы-2
- •6.3. Занесение в среду и поиск объектов
- •Глава 7. Организация таблиц символов компилятора
- •7.1. Таблицы идентификаторов и таблицы символов
- •7.2. Таблицы идентификаторов
- •7.3. Таблицы символов и таблицы расстановки
- •7.4. Функции расстановки.
- •7.5. Таблицы на деревьях
- •7.7. Сравнение различных методов реализации таблиц
- •Глава 8. Генерация кода
- •8.1. Модель машины
- •8.2. Динамическая организация памяти
- •8.3. Назначение адресов
- •8.4. Трансляция переменных.
8.3. Назначение адресов
Назначение адресов переменным, параметрам и полям записей
происходит при обработке соответствующих объявлений. В однопроходном
трансляторе это может производиться вместе с построением основной
таблицы символов и соответствующие адреса (или смещения) могут
храниться в этой же таблице. В промежуточном представлении Лидер
объявления сохранены, что делает это промежуточное представление
машинно-независимым. Напомним, что в Лидер-представлении каждому
описанию соответствует некоторый номер. В процессе работы генератора
кодов поддерживается таблица Table, в которой по этому номеру (входу)
содержится следующая информация:
- для типа - его размер;
- для переменной - адрес;
- для поля записи - смещение внутри записи;
- для процедуры - размер локальных;
- для диапазона индексов массива - значение левой границы.
Функция IncTab вырабатывает указатель (вход) на новый элемент
таблицы, проверяя при этом наличие свободной памяти. Таблица LevelTab
- это таблица уровней процедур, содержащая указатели на
последовательно вложенные процедуры (см. рис. 4.9).
Для вычисления адресов определим для каждого объявления два
синтезируемых атрибута: DISP будет обозначать смещение внутри области
процедуры (или единицы компиляции), а SIZE - размер. Тогда семантика
правила для списка объявлений принимает вид
RULE
DeclPart ::= ( Decl )
SEMANTICS
Disp<1>:=0;
1A: Disp<1>:=Disp<1>+Size<1>;
Size<0>:=Disp<1>.
Это можно следующим образом изобразить на дереве объявлений
(рис. 8.10).
DeclPart | Size <----------+
/|\ |
/ | \ |
/ | \ |
/ | \ |
/ | \ |
Decl Decl Decl |
Disp----->Disp--------->Disp
+ Size + Size + Size
^ ^ ^
| | |
Рис. 8.10
Все объявления, кроме объявлений переменных, имеют нулевой
размер. Размер объявления переменной определяется следующим правилом:
RULE
Decl ::= 'VAR' TypeDes
SEMANTICS
var Entry:Tablentry;
0: Entry:=IncTab;
Size<0>:=((Table[VAL<2>]+1) DIV 2)*2;
{ Выравнивание на границу слова }
Table[Entry]:=Disp<0>+Size<0>.
В качестве примера трансляции определения типа рассмотрим
обработку описания записи:
RULE
TypeDes ::= 'REC' ( TypeDes ) 'END'
SEMANTICS
var Disp:word;
Temp:Tablentry;
0: Entry<0>:=IncTab;
Disp:=0;
2A: begin Temp:=IncTab;
Table[Temp]:=Disp;
Disp:=Disp+Table[Entry<2>]+1) div 2)*2;
{ Выравнивание на границу слова }
end;
Table[Entry<0>]:=Disp.