Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Трансляция выражений в компиляторе С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. Если перед открывающей скобкой имеется имя функции, то при ее выталкивании генерируется команда вызова этой функции с предварительной записью в стек ее параметра, если это необходимо.

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





Дата публикования: 2015-03-29; Прочитано: 301 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...