Программа-интерпретатор для учебного языка SPL, страница 5

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

Нетерминальный символ FACT

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

Нетерминальный символ FCTL

FCTL®EXPR (‘,’ EXPR)*

SPL-программы

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

  1. таблица промежуточных команд TCD (мы сами их назначим, закодировав с помощью перечисляемых констант — enum);
  2. таблица объектов TOB: константы, глобальные и локальные переменные;
  3. таблица функций TFN.

Функции

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-1];
  • адрес активации: st[sp-0].

st[sp-2] — количество фактических параметров.

Команды SPL

Все команды будут закодированы целыми числами с помощью перечисляемых констант 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;