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

st[a];

6)  STI — присваивание локальной переменной, имеющей смещение , содержимого вершины стека t;

st[sp+a];

7)  CAL — вызов функции с точкой входа  в таблице команд;

8)  INI — выделение места под  локальных переменных;

9)  JMP — передача управления на метку  в таблице команд;

10) JMC — условная передача управления на метку . Если содержимое вершины стека меньше или равно нулю (), то происходит передача управления на команду с меткой . Иначе передача не происходит, а выполняется следующая по порядку команда. В обоих случаях содержимое вершины стека теряется;

Функции

void push( int a ); //функция занесения в вершину стека целого             числа a

int red( void ); //функция ввода

void interp( void ); //заполнение стека (вызывает comman)

void comman( void ); //выполнение команд, перечисленных в enum     (вызывает operat)

void operat( int a ); //выполнение одной из 11-ти команд OPR

Создание SPL-программы

Выражения записаны в обратном польском коде.

Например:                                 

Код

Команда в TCD

int z;

z=3;

{INI }, где  — количество локальных переменных

{LIT 3}

{STE a} или {STI a}

read x;

{OPR 1}

{STE a} или {STI a}

print e;

<e> {OPR 2}

return e;

<e> <OPR 9>

<> <> {OPR }, где  — любая из операций сложения (+), вычитания (-), умножения (*), деления (/), взятия остатка от деления (%), а

<e> <OPR8>

 с точкой входа a

<><>{LIT n}{CAL a}

if e then s end

<e>{JMC l}<s><l>

while e do s end

<e><JMC l> <s> <JMP > <l>, где  — номер команды, которая обрабатывает e

Простая программа:

main( x, y )

begin

  int c;

  read c;

  c = x-y/c;

  if c then return c end

end

Команда

Код (в TCD)

Операция (в TCD)

INI1

TCD[0].cod = 7

TCD[0].opd = 1

OPR 1

TCD[1].cod = 0

TCD[1].opd = 1

STI 1

TCD[2].cod = 5

TCD[2].opd = 1

LDI -4

TCD[3].cod = 3

TCD[3].opd = -4

LDI -3

TCD[4].cod = 3

TCD[4].opd = -3

LDI 1

TCD[5].cod = 3

TCD[5].opd = 1

OPR 6

TCD[6].cod = 0

TCD[6].opd = 6

OPR 4

TCD[7].cod = 0

TCD[7].opd = 4

STI 1

TCD[8].cod = 5

TCD[8].opd = 1

LDI 1

TCD[9].cod = 3

TCD[9].opd = 1

JMC 13

TCD[10].cod = 9

TCD[10].opd = 13

LDI 1

TCD[11].cod = 3

TCD[11].opd = 1

OPR 9

TCD[12].cod = 0

TCD[12].opd = 9

OPR 10

TCD[13].cod = 0

TCD[13].opd = 10

Программа №2:

exp( a, b )

begin

  int z;

  z = 1;

  while b do

    if b%2 then z = z*a end;

    a = a*a; b = b/2

  end;

  return z

end

main()

begin

  int x, y;

  read x;

  read y;

  print exp( x, y )