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

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 с восстановлением при

ошибках.




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