![]() |
|
Главная Терминология Хоора 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 id a; i := 1; J := norw; repeat fc := {i+j) div 2; if id < word[k] tiien j := fc-1; if id > word[lc] tlien i := fc+1 until i > j; ifi-l > j tlien sym := wsym[k] else sym := ident end else if cA in [0..9] then begin [число] fc := 0; num := 0; sjw := ттЬег;) repeat пит 10*п ш + (prd(ch)-ord(Q)); fc := fc+1; ge?cA until -1(с/г in [0,. 9]); if fc > nmax then error (30) end else if с/г = -.then --- begin getcii; itch = =then beginsym := becomes; getch end else sym nul; end else begin syw := ssym[ch]; getch end [getsym] ; procedure еи(л:: fct; y,z: integer); begin if cx > cxmax then begin write( PROGRAM TOO LONG); goto 99 end ; with code[cx] do begin/ ;= x; I y; a := г end ; cx := сл: + 1 end [gen] i procedure <cs<(sl,s2: symset; n\ inijeger); begin if -i(sym in si) then begin error(n); si := si + s2; while -i(sym in si) do getsym end [test] ; procedme block(lev,tx: integer; fsys: symset); var dx: integer; {индексразмещения данных] txO: integer; {начальный индекс таблицы] схО: integer; [начальный индекс программы) procedure enier(k: object); begin [запись объекта в таблицу] tx :~ tx + 1; with table[tx] do begin Tiame :== id; kind := k; case k of constant: begin if имт > amaxthen begin error (30); пит .- 0 end ; vol := пит end ; variable: begin feve/ :== lev; adr ;~ dx; dx := dx+1; end ; procedure: level := /ev end end [enter] ; fmcuoapositionQd: alfa): integer; var i: integer; begin [поиск имени id в таблице^ tabie[0] .name := id; i :~ tx; I while table[i] .name Ф id do i :=. i-1; \ position := i end {position} ; procedure constdeclaration; begin if jw = ident then begin g-efejw; if jw in [eql ,becomes] then begin if j>/?z = becomes tbea error (1); I getsym; t if jjw = number then begin enter Q:onstant); getsym end else wo/- (2) end else error (3) end else error (4) end [constdeclaration] ; procedure vardeclaration; begin if = ident thea begin enter (variable); getsym end else error (4) №d [vardeclaration] ; procedure list code; таг/: integer; begin for i :== cxO to cx-l do with code[i] do writelnQ, mnemonic[f]:5, 1:3, c:5) end {listcode] ; procedure statement {fsys: symset); лах i,cx\,cx2: integer; procedure expression{fsys: symset); var addop: symbol; procedure term{fsys: symset); var mulop: symbol; procedure/ac/c>/ (>i: symset); var /: integer; begin test{facbegsys,fsys, 24); while sym in facbegsys do begin if sym - ident then begin / := positioned); if / = 0 then error (11) else with table[i\ do case kind of constant: gen{lit, 0, va/); variable: gen{lod, lev-level, adr); procedure: error (21) end ; getsym end else if sym number then begin if и 1 > <7 2flxthen begin e/ro/- (30); num := 0 end { gen{lit, 0, num); getsym end else ifsym = /p /then begin expression(lrparen]+fsys); if s>m = rparen then getsym ejse erW (22) end ; test {fsys, [Iparen], 23) end [factor] ; |