Лекция: Трансляция выражений в компиляторе С0

В компиляторе С0 выражения транслируются методом стека с приоритетами [1, 2, 6, 16], который реализован в подпрограмме virag. Задача этой подпрограммы — определение порядка выполнения операций выражения.

Выражение рассматривается как последовательность секций, состоящих из терма (операнда), который может отсутствовать, и ограничителя:

выражение ::= секция...

секция ::= [терм] ограничитель

терм ::= число | имя

ограничитель ::= ( | ) |, |; | = | == | != |

< | > | <= | >= | + | — | * | / | %

К ограничителям относятся знаки операций, скобки, а также запятая, разделяющая фактические параметры вызова функции, и точка с запятой, обозначающая конец оператора-выражения. Ограничителям присвоены приоритеты по старшинству операций, как в языке С (см. табл.). Запятая и точка с запятой играют роль закрывающей скобки, соответственно, для фактического параметра и выражения в целом и имеют такой же приоритет.

Для определения порядка выполнения операций используется стек из глобальных параллельных массивов: st, sz, sogz, spr с указателем i.

Элемент стека содержит секцию: терм, ограничитель и его приоритет. В компиляторе С0 они хранятся в виде четырех значений: st [i] — тип терма (0 — отсутствующий терм, 1 — число, 3 — имя, 4 — число в стеке выполнения: результат выполнения операции); sz[i]- значение терма (для имени указывается его позиция в таблице имен; у пустого терма и терма типа 4 значение отсутствует); sogr[i] и spr[i] – ограничитель и приоритет.

Транслятор С0 сочетает компиляцию с интерпретацией. Если операнды являются константами, то операция интерпретируется, т.е. выполняется, и в стек трансляции помещается результат операции. В противном случае операция компилируется, т. е. генерируется (выводится в объектную программу) реализующая операцию группа команд, а в стек трансляции записывается указание о том, что результат операции будет находиться в стеке выполнения (типу терма st[i-1] присваивается 4).

При этом подпрограмма zopreg генерирует различные команды загрузки операнда (терма) в регистр АХ или ВХ в зависимости от типа, т.е. местонахождения терма.

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

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

еще рефераты
Еще работы по информатике