Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

39

Таблица 2.3 - Оптимизация кода

LOAD

=0.98

LOAD

=0.98

LOAD

TAX

STORE

$2

STORE

$2

ADD

PRICE

LOAD

TAX

LOAD

TAX

MPY

=0,98

STORE

$1

ADD

PRICE

STORE

COST

LOAD

$1

MPY

$2

 

 

ADD

PRICE

STORE

COST

 

 

MPY

$2

 

 

 

 

STORE

COST

 

 

 

 

 

 

 

Применяем правило 1)

Удаляем последова-

К последовательно-

к последовательности

тельность

сти

 

LOAD

PRICE;

STORE

$1;

LOAD

=0.98;

ФВВ

;1

LOAD

$1

STORE

$2

Заменяем на

 

 

Применяем правило

LOAD

$1

 

 

4) и удаляем их.

ADD

PRICE

 

 

В команде

 

 

 

 

MPY

$2

 

 

 

 

Заменяется $2 на

 

 

 

 

MPY

=0,98

2.9. Исправление ошибок

Предположим, что входом компилятора служит правильно построенная программа (однако, на практике очень часто это не так).

Компилятор имеет возможность обнаружить ошибки в программе по крайней мере на трех этапах компиляции:

-лексического анализа;

-синтаксического анализа;

-генерации кода.

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

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

Перечислим несколько возможных изменений.

·Замена одного знака. Если лексический анализатор выдает синтаксическое слово INTEJER в неподходящем для появления иденти-

40

фикатора месте программы, то компилятор может догадаться, что подразумевается слово INTEGER.

·Вставка одной лексемы, т.е. заменить на 2*С.

·Устранение одной лексемы. DO 10 I=1,20,.

·Простая перестановка лексем. I INTEGER на INTEGER I.

Далее мы подробно остановимся на реализации таких компиляторов.

2.10.Резюме

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

 

 

 

 

 

 

 

Работа с таблицей

 

 

 

 

 

Исходная

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

программа

 

 

 

 

 

 

 

 

 

 

 

 

 

Лексический

 

 

Синтаксический

 

 

Генерация

 

Оптимизация

 

ассембли

 

 

 

 

 

 

 

 

 

 

 

 

анализатор

 

 

анализатор

 

 

кода

 

кода

 

рование

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Анализ ошибок

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

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

Контрольные вопросы

1.Задание языков программирования.

2.Синтаксис и семантика.

3.Процесс компиляции.

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

5.Работа с таблицами.

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

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

8.Алгоритм генерации кода.