![]() |
|
Главная Терминология Хоора 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). Ком- шентарии с правой стороны добавлены лишь для пояснения.
Рабочая программа, соответствующая процедуре ПЛ/О (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; |