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

225

Адреса во время прогона для идентификаторов определяются в процес-

се распределения памяти и хранятся в таблице символов вместе с информа-

цией о типе. Кроме трехадресной команды, существуют другие команды промежуточного кода:

SETLABEL L1

для установки метки и

ASSIGN type, addr1, addr2

для присваивания. Тип необходим как параметр, чтобы определить размер значения, передаваемого из addr1 в addr2.

8.2 СТРУКТУРА ДАННЫХ ДЛЯ ГЕНЕРАЦИИ КОДА

Для хранения адресов операндов на время, пока их нельзя выдать как параметры промежуточного кода, необходим стек значений [2]. В этом стеке,

который называется нижним стеком, можно хранить и другую информацию,

например:

адрес времени прогона;

тип данных;

область действия (номер рамки).

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

При трансляции A+B первыми помещаются в нижний стек статические свойства A. Любой элемент нижнего стека можно представить в виде струк-

туры, имеющей поле для каждой из своих аналитических характеристик. Для идентификаторов аналитические характеристики находятся из таблицы сим-

волов. Затем в стек знаков операции помещается «+», и в нижний стек добав-

ляются аналитические характеристики B. Знак операции берется из стека знаков операции, а его два операнда – из нижнего стека. Типы операндов ис-

пользуются для идентификации знака операции, после чего генерируется

226

код. И, наконец, в нижний стек помещаются статические характеристики ре-

зультата.

Этот процесс можно распространить на более сложные выражения,

например на грамматики с правилами:

EXP TERM | EXP + TERM | EXP – TERM TERM FACT | TERM FACT | TERM / FACT FACT constant | identifier | ( EXP )

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

A1. После чтения идентификатора или константы (т.е. листа синтакси-

ческого дерева) поместить в нижний стек соответствующие харак-

теристики.

A2. После чтения оператора поместить символ операции в стек знаков операций.

A3. После чтения правого операнда (который может быть выражением)

извлечь из стеков знак операции и два его операнда, генерировать соответствующий код, т.к. знак операции идентифицирован, и поме-

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

При включении в грамматику этих действий она примет следующий

вид:

EXP TERM | EXP + A2 TERM A3 | EXP – A2 TERM A3 TERM FACT | TERM A2 FACT A3 | TERM / A2 FACT A3

FACT constant A1 | identifier A1 | ( EXP )

Нижний стек частично используется для передачи информации о типе по синтаксическому дереву.

 

227

· · · · · · · · · · · · · · · · · · · · · · · ·

 

Пример · · · · · · · · · · · · · · · · · · · · · · ·

 

 

 

 

Рассмотрим дерево для a b + x y (рис. 8.2).

 

+

 

 

 

 

a

b

x

y

Рисунок 8.2 – Синтаксическое дерево для арифметического выражения

Если значения a и b имеют тип целого, а x, y – тип вещественного зна-

чения, компилятор может заключить, воспользовавшись информацией ниж-

него стека, что «+» вершины дерева представляет собой сложение целого и вещественного. Мы можем переписать выражение, расставив действия A1, A2

и A3 в том порядке, в каком они будут возникать при трансляции выражения: a A1 A2 b A1 A3 + A2 x A1 A2 y A1 A3 A3

Каждый вызов A3 соответствует тому месту, где появился знак опера-

ции в постфиксной форме. Стек знаков операций служит для формирования постфиксной нотации. Поэтому последовательность действий при трансля-

ции данного выражения должна быть следующей:

A1. Поместить статические характеристики a в нижний стек.

A2. Поместить знак « » в стек знаков.

A1. Поместить статические характеристики b в нижний стек.

A3. Извлечь статические характеристики a и b из нижнего стека и знак

« » из стека знаков операций, генерировать код для умножения двух целых чисел, поместить статические характеристики результата в нижний стек; тип результата – целый.

A2. Поместить знак «+» в стек знаков.

A1. Поместить статические характеристики x в нижний стек.

228

A2. Поместить знак « » в стек знаков операций.

A1. Поместить статическую характеристику y в нижний стек.

A3. Извлечь статические характеристики x и y из нижнего стека и знак

« » из стека знаков операций, генерировать код умножения двух вещественных чисел, поместить статические характеристики ре-

зультата в нижний стек; тип результата – вещественный.

A3. Извлечь два верхних элемента из нижнего стека и знак «+» из стека знаков операций, генерировать код сложения целого и вещественно-

го значений, поместить статические характеристики результата в нижний стек; тип результата – вещественный.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Действия A1, A2, A3 легко расширить, что позволит использовать боль-

шое число уровней приоритета для знаков операций и унарные знаки опера-

ций.

Нижний стек обеспечивает передачу информации вверх по синтаксиче-

скому дереву. Для передачи вниз по дереву используется верхний стек. Зна-

чение в него помещается всякий раз, когда во время генерации кода происхо-

дит вход в такую конструкцию, как присвоение или описание идентификато-

ра. При выходе из этой конструкции значение из стека удаляется.

Еще одной структурой данных, которая требуется во время генерации кода, является таблица блоков (табл. 8.1.)

Таблица 8.1 – Таблица блоков

Блок

Уровень

Размер стека

Размер рабочего

 

блока

идентификаторов

стека

 

 

 

 

1

1

14

16

 

 

 

 

2

2

12

11

 

 

 

 

3

2

21

13

 

 

 

 

4

3

4

9