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

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

останов

Индивидуальные изменения

Изменение №1: Замена begin и end, начинающих и оканчивающих последовательность исполняемых операторов функции, на { и } соответственно

Во-первых, убираются из перечисляемого списка

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 );