Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Layt_teor_osnovy_form_yazykov.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.17 Mб
Скачать

5.8. Принципиальная модель компилятора.

На рис. 5.5 приведена наша принципиальная модель компилятора. Здесь фаза оптимизации следует за фазой генерации кода, но, как мы уже отмечали, разнообразные попытки оптимизации кода могут делаться по ходу всего процесса компиляции.

К процедуре анализа и исправления ошибок можно обращаться на этапах лексического анализа, синтаксического анализа и генерации кода, и если исправление закончилось успешно, то процесс продолжается с того места, где произошло обращение к этой процедуре. Ошибки, при которых в некотором месте входной цепочки не оказывается никакой лексемы, обнаруживаются в ходе лексического анализа. Ошибки, при которых входную программу можно разбить на лексемы, но к этой последовательности лексем не подходит никакое синтаксическое дерево, обнаруживаются в ходе синтаксического анализа. Наконец, ошибки, при которых входная цепочка имеет синтаксическую структуру, но для нее не получается осмысленный код, обнаруживаются в процессе генерации кода. Примером такой ситуации может служить переменная, используемая без описания. Синтаксический анализатор игнорирует информационную компоненту лексемы, так что он не заметит этой ошибки.

Таблицы имен образуются в процессе лексического анализа, а иногда также и в ходе синтаксического анализа, когда, скажем, атрибуты и идентификаторы, к которым они относятся, связываются друг с другом в формируемой древовидной структуре. Эти таблицы используются при генерации кода и, возможно, на этапе ассемблирования.

Рис. 5.5. Модель компилятора.

На рис. 5.5 показана заключительная фаза, которую мы называем ассемблированием. На этом этапе промежуточный код обрабатывается для получения окончательного представления объектной программы в машинном языке. Некоторые компиляторы могут выдавать код на машинном языке непосредственно как результат процесса генерации кода, так что фазу ассемблирования можно явно не указывать.

Модель компилятора, изображенная на рис. 5.5, лишь первое приближение к реальному компилятору. Например, некоторые компиляторы проектируются так, чтобы они занимали небольшой объем памяти. В результате получается много фаз компиляции, которые выполняются последовательно, постепенно преобразуя исходную программу в объектную.

ОГЛАВЛЕНИЕ.

Введение.

Глава 1. Грамматики и языки

1.1. Обсуждение грамматик

1.2. Символы и цепочки

1.3. Формальное определение грамматики и языка

1.4. Синтаксические деревья и неоднозначность

1.5. Задача разбора

1.6. Некоторые отношения применительно к грамматикам

1.7. Практические ограничения налагаемые на грамматики

1.8. Другие способы представления синтаксиса

1.9. Некоторые проблемы теории формальных языков

Глава 2. Регулярные выражения и конечные автоматы

2.1. Диаграммы состояний

2.2. Детерминированный конечный автомат

2.3. Недетерминированный конечный автомат

2.4. Построение КА из НКА

Глава 3. Нисходящие распознаватели

3.1. Нисходящий разбор с возвратами

3.2. Проблемы нисходящего разбора и их решения

Глава 5. Обзор процесса компиляции.

5.1. Ассемблер.

5.2. Основные части компилятора.

5.3. Лексический анализ.

5.4. Синтаксический анализ

5.5. Генерация кода

5.6. Оптимизация кода

5.7. Анализ и исправление ошибок

5.8. Принципиальная модель компилятора

26

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]