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
Выражения записаны в обратном польском коде.
Например:
Код |
Команда в 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 |
|
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 )
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.