end
Метка |
Команда |
Пояснение |
|
0 |
INI 1 |
увеличение стека на 1 (выделение памяти на одну локальную переменную z) |
|
1 |
LIT 1 |
загрузка в t числовой константы 1 |
|
2 |
STI 1 |
t®z |
|
3 |
LDI -3 |
b®t |
|
4 |
JMC 22 |
условная передача управления на метку 22 |
|
5 |
LDI –3 |
b®t, b®t-1 |
|
6 |
LIT 2 |
загрузка в t числовой константы 2, b®t-1 |
|
7 |
OPR 7 |
b%2, результат в t |
|
8 |
JMC 13 |
условная передача управления на метку 13 |
|
9 |
LDI 1 |
z®t |
|
10 |
LDI –4 |
a®t, z®t-1 |
|
11 |
OPR 5 |
z*a, результат в t |
|
12 |
STI 1 |
t®z |
|
13 |
LDI –4 |
a®t |
|
14 |
LDI –4 |
a®t, a®t-1 |
|
15 |
OPR 5 |
a*a, результат в t |
|
16 |
STI –4 |
t®a |
|
17 |
LDI –3 |
b®t |
|
18 |
LIT 2 |
загрузка в t числовой константы 2, b®t-1 |
|
19 |
OPR 6 |
b/2, результат в t |
|
20 |
STI –3 |
t®b |
|
21 |
JMP 3 |
переход на метку 3 |
|
22 |
LDI 1 |
z®t |
|
23 |
OPR 9 |
return z |
|
24 |
OPR 10 |
останов |
|
25 |
INI 2 |
увеличение стека на 2 (выделение памяти на две локальные переменные x и y) |
|
26 |
OPR 1 |
число из stdin переходит в t |
read x |
27 |
STI 1 |
t®x |
|
28 |
OPR 1 |
число из stdin переходит в t |
read y |
29 |
STI 2 |
t®y |
|
30 |
LDI 1 |
x®t |
|
31 |
LDI 2 |
y®t, x®t-1 |
|
32 |
LIT 2 |
загрузка в t числовой константы 2 (количество фактических параметров функции), y®t-1, x®t-2 |
|
33 |
CAL 0 |
переход к команде под номером 0 |
|
34 |
OPR 2 |
из вершины стека число заносится в stdout |
|
35 |
OPR 10 |
останов |
Во-первых, убираются из перечисляемого списка
enum {BEGINL=257, ENDL, READL, PRITL, RETRL, IFL, THENL, WHILEL, DOL, CONSTL, INTL, IDEN, NUMB};
лексемы BEGINL и ENDL. Тогда получим:
enum {READL=257, PRITL, RETRL, IFL, THENL, WHILEL, DOL, CONSTL, INTL, IDEN, NUMB};
Во-вторых, в функции word() (лексический анализ) также убираются ключевые слова begin и end, и лексемы BEGINL и ENDL. Имеем:
static char *serv[] = {"read", "print", "return", "if", "then", "while", "do", "int", "const"};
static int cdl[] = {READL, PRITL, RETRL, IFL, THENL, WHILEL, DOL, INTL, CONSTL};
В-третьих, так как в таблице кодов ASCII есть символы {, }, то в функции get() (лексический анализ) вносятся такие изменения:
if (nch == '+' || nch == '-' || nch == '*' || nch == '/' ||
nch == '%' || nch == '(' || nch == ')' || nch == ',' ||
nch == ';' || nch == '=' || nch == '{' || nch == '}' ||
isspace( nch )) {
lex = nch;
nch = getc( PF );
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.