Главная Терминология Хоора 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 begin - . if sym ~ ident then begin i := position (id); if / = 0 then error (11) else if table[i] .kind ~ procedure then error (21)j getsym end else iisym - number then -begin g-e/jj/w; end else iisym = Iparen then begin getsym; expression фparen]+fsys); if sym - rparen then getsym else error (22) end : test (fsys, [tparen], 23) end {factor] % - begin {tertri] factor (fsys+[times, slash]); while sym in [times, .slash] do begin getsym; factor(fsys+[times, slash]) end end [term] ; begin [expression] if ijAW in [plus ,mimis] then - begin getsym; term(fsys+[plus, minus]) end else term{fsys-\-[plus, minus]); while jjm in [plus, minus] do begin ge/sjm; term(.fsys+[plus, minus]) end end {ejj/m/oK} ; ргосейше condition(fsys: symset); begin if jym = oddsym then begin gejyw; expression(fsys); end else begin expression ([eql, neq, Iss, gtr, leq, geq]+fsys); if -(sym in [e/, е^, Iss, leq, gtr, geg]) then error (20) else begin ge/jjw; ecjression (/j;j) end . - . end [condition); begin {statement) jSsym - ident thea begin i t- position(id); if I = 0 then error (11) else if tablelil .kind. Ф variable then error (12); getsym; ilsym = becomes then getsym еЪе error (13); expression(fsys); end else ifsym =s callsym then begin getsym; it sym Ф ident then error( else begin? := positionQd); if г 0 then ewr (11) else tdbk{i\ .kind Ф procedure then error (15) j end nd else ifsjw - Ifsym Шп. begin getsym; condition ([ihensym, osyml+fsys); it sym - f/!e 5jwtheuej;meIsee/ / or(16); 5/йГе/ еп;(ДуЛ') end else it sym = Jemsjmthen begin getsym; statement([semico7oh, endsyml-i-fsys); while sym in [5em/co/on]+Jto/6e5>.y do begin it sym = 5em/co/o then efjjm else wor (10); statement([semicolon ,endsym] +fsys) end ; if - endsym then ge/sym else ew/* (17) end else if sym - whilesym then begin getsym; condition([dosym]+fsys)l it sym = dosym then getsym else error (\b); statement(fsys); end ; test(fsys,[ll9) end {statement} ; begin {block} repeat if sym constsym t\m begin getsym; repeat constdeclaration; wliilejm = comma йо begin getsym; constdeclaration end ; if sym - semicolon then getsym else error (5) until sym Ф ident end ; iisym ~ yarsymikien ben getsym; repeat vardeclaration; while sym = comma do begin getsym; vardeclaration end ; iGimgMsym-eise error (5) nntil sym Ф ident; end ; while sym procsym do ben getsym; iisym - ident then begin enter (procedure); getsym end else error (4); ifsjTO = semicolon then getsym else error (?); block (tx, {semicolori\-\-fsys); if sym = semicolon then begin gete >w; test(statbegsys+[ident, procsym], fsys, 6) end else enw (5) end ; eii(5/ur/begi,)j+[/Je <], declbegsys, 7) until -i(i;>m in declbegsys); statement([semicolon, endsym]-\-fsys); test(fsys, i I 8); end [block] ; begin [основная программа] Инициация(см. программу 5.4)... сс := 0; := 0; ch := кк al; getsym; block (О, [period]+declbegsys+statbegsys); iisym Ф period then error (9); 99: writeln end . Программа 5.5. Грамматический разбор для ПЛ/0 с восстановлением при ошибках. |