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).
Ссылка на скачивание - внизу страницы.