Читайте также: |
|
Концептуально компилятор работает пофазно, причем в процессе каждой фазы происходит преобразование исходной программы из одного представления в другое. Типичное разбиение компилятора на фазы показано на рис. 1.9. На практике некоторые фазы могут быть сгруппированы вместе, как упоминается в разделе 1.5, и промежуточные представления программы внутри таких групп могут явно не строиться.
Первые три фазы, формирующие анализирующую часть компилятора, были рассмотрены в предыдущем разделе. Управление таблицей символов и обработка ошибок пока-, заны во взаимодействии с шестью фазами: лексическим анализом, синтаксическим анализом, семантическим анализом, генерацией промежуточного кода, оптимизацией кода и генерацией кода. Неформально диспетчер таблицы символов и обработчик ошибок также могут считаться "фазами" компилятора.
Управление таблицей символов
Одной из важных функций компилятора является запись используемых в исходной программе идентификаторов и сбор информации о различных атрибутах каждого идентификатора. Эти атрибуты предоставляют сведения об отведенной идентификатору памяти, его типе, области видимости (где в программе он может применяться). При использовании имен процедур атрибуты говорят о количестве и типе их аргументов, методе передачи каждого аргумента (например, по ссылке) и типе возвращаемого значения, если таковое имеется.
Таблица символов представляет собой структуру данных, содержащую записи о каждом идентификаторе с полями для его атрибутов. Данная структура позволяет быстро найти информацию о любом идентификаторе и внести необходимые изменения. Таблицы символов подробнее рассматриваются в главах 2, "Простой однопроходный компилятор", и 7, "Среды времени исполнения".
Исходная программа |
Диспетчер таблицы символов |
Лексический анализ |
Синтаксический анализ |
Семантический анализ |
Генератор промежуточного кода |
Оптимизатор кода |
Генератор кода |
Обработчик ошибок |
Целевая программа |
Рис. 1.9. Фазы компилятора
Если лексическим анализатором в исходной программе обнаружен идентификатор, он записывается в таблицу символов. Однако атрибуты идентификатора обычно не могут быть определены в процессе лексического анализа. Например, в объявлении переменных на языке Pascal
var position, initial, rate: real;
когда лексический анализатор находит идентификаторы position, initial и rate, их тип real еще неизвестен.
В процессе остальных фаз информация об идентификаторах вносится в таблицу символов и используется различными способами. Например, при семантическом анализе и генерации промежуточного кода необходимо знать типы идентификаторов, чтобы гарантировать их корректное использование в исходной программе и сгенерировать правильные операции по работе с ними. Обычно генератор кода вносит в таблицу символов и использует детальную информацию о памяти, назначенной идентификаторам.
Дата добавления: 2015-11-30; просмотров: 22 | Нарушение авторских прав