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

234

GOTO L<i>

Удалить из стека номер метки (j). Поместить метку в конец цикла:

SET LABEL L<j>

Таким образом, цикл

for i := 1 to 10 do <something>

генерирует код следующего вида:

MOVE 1, address(<controlled variable>)

MOVE address(<ulimit>), <wostack pointer>

SET LABEL L1

JUMPG L2 address(<controlled variable>), address (<ulimit>) <something>

GOTO L1

SET LABEL L2

Действия A4 можно видоизменять, если приращение управляющей пе-

ременной будет не стандартным (1), а иным:

for i := 0 by 5 to 10 do <something>

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

Если цикл содержит часть while, например

for i := 1 to 10 while a < b do,

то действие A3 следует видоизменить, чтобы при принятии решения о выходе учитывалось как значение части while, так и управляющей переменной, при-

чем любая из этих проверок достаточна для завершения цикла.

8.3.5 ВХОД И ВЫХОД ИЗ БЛОКА

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

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

235

1.Прочитать в таблице символов информацию, касающуюся блока, и

связать ее с информацией включающих блоков таким образом, что-

бы можно было выполнять «внешние» поиски определяющих реа-

лизаций идентификаторов.

2.Поместить в стек <idstack pointer>. Поместить в стек <wostack pointer>. Поместить в стек <block number>. Все эти значения ссыла-

ются на включающий блок и могут потребоваться вновь после того,

как будет покинут блок, в который только что осуществлен вход:

<idstack pointer> := 0 <wostack pointer>:= 0

3.Генерировать код для направления DISPLAY

BLOCK ENTRY <block number>

4.Увеличить номер уровня блока на 1. Увеличить gbn (наибольший использованный до сих пор номер блока) на 1 и присвоить это зна-

чение номеру блока.

5.Прочитать информацию о видах и добавить ее в таблицу видов (ес-

ли язык использует сложные виды (структуры)).

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

1.Обновить таблицу блоков, задав размер стека идентификаторов и т.п. для покинутого блока.

2.Исключить информацию в таблице символов для покинутого блока.

3.Генерировать код для изменения дисплея:

BLOCK EXIT <block number>

4.Удалить из стека <block number>. Удалить из стека <wostack pointer>. Удалить из стека <idstack pointer>. Уменьшить уровень блока на 1.

5.Поместить результат (при необходимости) в рамку стека вызываю-

щего блока.