![]() |
Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | |
|
В компиляторе С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. Если перед открывающей скобкой имеется имя функции, то при ее выталкивании генерируется команда вызова этой функции с предварительной записью в стек ее параметра, если это необходимо.
Выталкивание открывающей скобки подвыражения (перед которой отсутствует имя функции) сводится к продвижению находящейся в верхушке стека информации о значении подвыражения на одну позицию вглубь стека.
Дата публикования: 2015-03-29; Прочитано: 301 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!