Главная  Терминология Хоора 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 [ 125 ] 126 127 128 129 130 131 132 133

11иже в мнемонической форме приведена программа, полуценная при трансляции процедуры умножения (5.14). Ком- шентарии с правой стороны добавлены лишь для пояснения.

выделить ra

У

0,12

>

п

0,29

нечетно

0,20

г

бозВрат

Рабочая программа, соответствующая процедуре ПЛ/О (5.14).

При трансляции с языков программирования обычно приходится решать значительно более сложные задачи, чем те, которые решал транслятор с языка ПЛ/О для машины ПЛ/О :(5.4]. Большинство цз них с гораздо большим трудом поддаются четкой организации. Если читатель попытается расширить данный транслятор, приспособив его либо для более Мощного языка, либо для более привычной вычислительной машины, то он вскоре убедится в правоте этого утверждения. Тем не менее основной изложенный здесь подход к разработке сложных программ по-прежнему остается в силе, и его ценность даже возрастает в случае более тонких и сложных зд-Дач. Он действительно успешно применялся при построении крупных трансляторов [5.1, 5.9].



program PLO(input,output),

{транслятор с IIJI/O с формированием рабочей программы] label 99;

{число зарезервированных слов] {длина таблицы имен] {максимальное количество цифр в числах] {длина имен] {максимальный адрес ] (максимальная глубина вложенности блоков] {размер массива кодов]

const яо/и 1= 11; txmax - 100;. птах = 14; al = 10; атах = 2047; Jevmax = 3; схтах = 200; type symbol -

{nul, ident, number, plus, minus, times, slash, oddsym, eql, neq, Iss, leq, gtr, geq, Iparen, rparen, comma, semicoloit, period, becomes, beginsym, endsym, ifsym, thensym, -hHesym, dosym, calkym, constsym, arsym,rocsym)i alfa = packed array [1.. al] of char; object = (constant, yariable, procedure); symset = set of symbol;

fct = (lit, opr, lod, sto, cal, int,jmp,jpc); {функции] instruction = packed record

/: fct; {код функции]

/: О.. levmax; {уровень] a: 0.. атах; {смегцение] end ;

загрузка константы а выполнение операции а загрузка переменной 1,а запись переменной 1.а вызов процедурьг а на уровне I увеличение t-регистра на а переход на а

условный переход на а ]

{последний прочитанный входной символ] [последний прочитанный символ языка] {последнее прочитанное имя] [последнее прочитанное число] {счетчик символов] [длина строки]

{ LIT 0,

OPR 0,

LOD 1,а

его 1,а

CAL 1,а

INT 0,а

JMP 0,а

JPC 0,а таг с/г: с/7<з/-; sym: symbol; id: alfa; пит: integer; сс: integer; II: integer; hk, err: integer;

[индексразмещения команды]

сх: integer;

line-: array [1.. 81] of char; a: alfa;

code: array [0.. cxmax] of instruction;



word: array [1 .. norw] of alfa; wsym: array [1.. ноги] of symbol; ssym: array [char] of symbol; mnemonic: array [fct] of

packed array tl.. 5] of char; declbegsys, statbegsys, facbegsys: symset; table: array [0.. txmax] of record name: alfa; case kind: object of constant: (yal: integer); variable, procedure: (level, adr: integer) enA ;

procedure error (n: integer);

begin writelni: cc-1, f, n: 2); err := err+l

end [error] ; procedure getsym; \&ii,j,k: integer;

procedure

begin if cc = then begin if eof (input) then

begin writeQ PROGRAM INCOMPLETE); goto 99 end ;

:= 0; cc := 0; write(cx: 5, ); while -leolnQnput) do

begin := +1; read(ch); write(ch); Iine[ll] :- ch

end ;

writeln; ll := 11+1 - read(line[ll]) end ;

cc :== cc+1; ch := line[cc] end [getch] ;

begin [getsym]

while ch = do getch; if с/г in [A..Z] then

begin [имя или зарезервированное слово] к := 0; lepeafifAr < о/then

Ьфхк \ к+\; а[к] : ch

end ;

getch

until -п(сА in [A.. Z,0.. 9])J \fk> kkthenkk:== kdsb

repeat a[kk] := kk ;= kk-l

until kk - k;




1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 [ 125 ] 126 127 128 129 130 131 132 133