Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТЯП, ТВП / ТЯПМТ / Пособие.doc
Скачиваний:
161
Добавлен:
11.05.2015
Размер:
2.37 Mб
Скачать

(Тип – адреса, номер - блока, смещение).

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

Номер – блокапозволяет найти номер уровня блока в таблице, что обеспечивает доступ к конкретной рамке блока через дисплей.

Смещениепоказывает смещение конкретной рамки по отношению к началу стека.

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

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

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

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

9.2. Структура данных для генерации кода

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

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

  • тип данных;

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

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

При трансляции A+B первыми помещаются в нижний стек статические свойстваA. Любой элемент нижнего стека можно представить в виде структуры, имеющей поле для каждой из своих аналитических характеристик. Для идентификаторов аналитические характеристики находятся из таблицы символов. Затем в стек знаков операции помещается «+», и в нижний стек добавляются аналитические характеристикиB. Знак операции берется из стека знаков операции, а его два операнда - из нижнего стека. Типы операндов используются для идентификации знака операции, после чего генерируется код. И, наконец, в нижний стек помещаются статические характеристики результата.

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

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

A1. После чтения идентификатора или константы (т.е. листа синтаксического дерева) поместить в нижний стек соответствующие характеристики.

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

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

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

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

Рассмотрим дерево для (рис. 9.2).

Рис. 9.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 в нижний стек.

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

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

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

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

Действия A1, A2, A3 легко расширить, что позволит использовать большое число уровней приоритета для знаков операций и унарные знаки операций.

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

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

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

Блок

Уровень блока

Размер стека идентификаторов

Размер рабочего стека

1

1

14

16

2

2

12

11

3

2

21

13

4

3

4

9

5

2

6

12

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

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

  • нижний стек;

  • верхний стек;

  • стек значений операций;

  • таблица блоков;

  • таблица видов и таблица символов из предыдущего прохода.