Основы разработки трансляторов в САПР. Коробова И.Л - 23 стр.

UptoLike

В этом варианте обеспечивается гораздо большая гибкость, и поэтому во многих системах он и
принят в качестве стандартной процедуры. Следует, однако, заметить, что на объединение и загрузку
также расходуется время.
Теперь покажем, как генерируются команды для последовательности четверок и постфиксной запи-
си, используя в качестве примера выражение
А * ((А * В + С) – С * В).
Будем считать переменные А, В, С, В целыми.
Генерация кода для последовательности четверок. Для рассматриваемого примера последова-
тельность четверок имеет вид:
* A B I1
+ I1 C I2
* C D I3
– I2 I3 I4
* a I4 I5
В основе процедуры генерации кода лежит оператор саsе:
ргосеdure ГК; саsе код операции четверки of
* : подпрограмма, соответствующая операции *;
+ : подпрограмма, соответствующая операции + ;
– : подпрограмма, соответствующая операции – ;
end;
end;
Генерация кода для постфиксной записи. Для рассматриваемого примера постфиксная запись
имеет вид: A A B * C + C D * – A *. Операторы и операнды просматриваются последовательно слева
направо. Всякий раз, когда просматривается операнд, в стек заносится его имя. А когда встречается
операция, генерируются команды для ее выполнения. При этом в качестве описаний операндов исполь-
зуются два верхних описания в стеке; затем эти два описания заменяются описанием результата. При
этом необходимо сформировать временное имя T
i
, которое заносится в стек.
На практике стек можно отобразить на одномерный массив S(1), S(2), …, S(n). Для указания верши-
ны стека можно использовать индекс i. При записи в стек указатель вершины будет сдвигаться в сторо-
ну конца массива, при чтении из стека указатель вершины будет перемещатьсяя в сторону начала мас-
сива (рис. 11).
i
Вершина
1 2 3 4 5
Рис. 11
Для обработки доступен только элемент S(i), т.е. вершина стека. Значение i = 0 перед чтением из
стека служит признаком того, что стек пуст, а значение i = n перед записью в стек признаком того, что
стек переполнен.