TERM®FACT((‘*’|’/’|’%’) FACT)*

FACT®’(’ EXPR ‘)’ | numb | iden [‘(’ [FCTL] ’)’]

FCTL®EXPR (‘,’ EXPR)*

Фактически мы программой реализуем некий SPL-процессор. В процессе синтаксического анализа за счет расширенных функций для нетерминальных символов параллельно будут создаваться следующие таблицы:
void newob( char *nm, int wt, int vl ); //функция занесения новых объектов в таблицу объектов
odc *findob( char *nm ); //функция поиска объекта в таблице объектов
fnd *newfn( char *nm, int is, int cp, int st); //функция занесения новых функций в таблицу функций
fnd *findfn( char *nm ); //функция поиска функции в таблице функций
fnd *eval( char *nm, int cp ); //вызов функции
void defin( char *nm, int cp, int st); //описание функций
fnd *fmain( void ); //поиск функции main() и неописанных функций
Будет создан стек. В основании стека размещаются глобальные переменные. cgv — количество глобальных переменных.

У глобальных переменных размещение статическое, у локальных переменных — динамическое.
sp — граница, откуда заносятся локальные переменные (начало области локальных переменных).
Определение адреса для переменных:
st[k],
где
— смещение в стеке;
st[sp+k], где
.
Определение адреса для фактических параметров:
st[sp+k], где
.
Здесь сдвиги отрицательные.
Затем идет адрес возврата и адрес активации:
st[sp-2] — количество фактических параметров.
Все команды будут закодированы целыми числами с помощью перечисляемых констант enum:
enum {OPR, LIT, LDE, LDI, STE, STI, CAL, INI, JMP, JMC};
Описание команд:
1) OPR — операции над числом в вершине стека. Этих операций 10.

a) OPR 1 — чтение с клавиатуры (из stdin число попадает в вершину стека t);
b) OPR 2 — печать (print). Из вершины стека число заносится в stdout (экран дисплея);
c) OPR 3 — сложение двух чисел
.
находится в t-1,
— в t. Результат — в t;
d) OPR 4 — вычитание
.
находится в t-1,
— в t. Результат — в t;
e) OPR 5 —
. Результат — в t;
f) OPR 6 —
. Результат — в t;
g) OPR 7 —
(остаток от
деления). Результат — в t;
h) OPR 8 — изменение знака числа в t на противоположный знак;
i) OPR 9 — return — возврат из функции.
Возвращаемое число находится в вершине стека t. Если return из main, то
, вывод на печать (экран).
Если return
не из main, то
;
j) OPR 10 — останов.
2) LIT — загрузка в t числовой константы
;
3) LDE — загрузка в t
глобальной переменной, имеющей смещение
;
st[a];
4) LDI — загрузка
в t локальной
переменной, имеющей смещение
;
st[sp+a];
5) STE — присваивание глобальной
переменной, имеющей смещение
, содержимого вершины
стека t;
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.