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

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

procedure Interpret;

const stacksize = 500;

Yar p,b,t: integer [регистр программы, регистр указателя стека, базовый регистр] 1: instruction; [регистр команды] s: array [1 .. stacksize] of integer; [память для данных] fnnction base(l: iiuegcr): integer;

var M: integer; begin 2>1 r= b; [поиск базы I уровнями ниже] while / > О do

begin b\ s[b\]; I := /-1 end ; base := b\ end [base] ; !-

begin writeln( START PL/0); ]f := 0; & := \; p := 0; sm 0; s[2] :== 0; [3] := 0; iwpeati := codc[p]; p : p+l; - with I do case/of

Jit: begin t := Ml; s[t] := a end ;

cpr: case a of [операция] 0: begin [возврат]

t := Й-1; 5[f+3]; 6 :== s[+2I; end ; 1: s\t] -s[i];

2: begin t-l; sit] := + s[t-\-l] end ;

3: begin t := t-l; s[t] :== sM - s[t-\-\\ end ;

4: begin t := f-1; := * end ;

5: begin t : t-l; sit] := s[t] Ys[t+l] end ;

6: s[t] := o;-(/(o(/(s[f])); 8: begin f := t-l; s[t] := Qrd{s[i]=slt-\r\]) end ;

9: begin / := /-1; := ord{s[i]s[t+lb end ;

10: begin t := t-l; s{t] := ord(s[t]<s{t+l]) end ;



11: begin / := i-l; s[tl :--end ;

i-l; s[t] ord(s[t]>s[t+lli)

t-l; s[t] :== ord( s[t]<s[i+lD

12: begin t

end ; 13: begin /

end ; end ;

lod: begins :== t+l; s[t] := s[base{l)+dl end ;

sto: begin s[base(l)i-a] := s[t]; wnteln(s[t]); t := /-1 end ;

cal: begin [формирование отметки в новом блоке} s[t+l] := base(l); s[t+2] := b; s[t+3] :== p; b : t+l; p:== a end ; int: t := /+й; >i/: p:== a;

jpc: begin if jH = Oihenp end

end [with, case}

nntilp == 0;

wnVeC END PL/0); end [interpret} ; begin [основная программа]

for с/г := A to do ssym[ch] := м/;

:= a; t ;= /-1

woid[ 2] wor4 4] worJ[ 6]

Word[] := PROCEDURE HW<?[10] :=a VAR

:= CALL

:= DC := IF

word[ 1] BEGIN; word[ 3] := ccNsr; word[ 5] := .END ; word[ 7] := ODD ; wordl 9] THEN ; Mwll] : WHILE; wsym[ 1] := beginsym; wsym[ 2]

3] := constsym; wsym[ 4] := dosym; wsyml 5] := endsym; wsyml 6] := г/яд'ш; wsym[ 7J~:= oddsym; wsym[ 8] := procsym; wsyml 9] := thensym; wsym[lO] := varsym; wsynill] := whilesym; ssymY+] := рЛ ; Jsjmr-] := wmMj;

callsym;

ssym[*] :~ times; ssymlX] /рагея;

:= period; ssym[<] := /jj;

ssym[y] := rparen; ssym[,] :- comma; ssym[Ф'] иед-; iijw[>] := gtr; ssym[>] ge?;



УПРАЖНЕНИЯ

5.1. Рассмотрим следующий синтаксис;

5::=л

А::=В\П А then А else А

В ::= С1 В + С1 + С

C::=D\C*D\*D

В-л=х\{А)\~В

Каковы здесь терминальные и нетерминальные символы? Определите множества самых левых и внешних символов L(X) и F[X) для каж< дого нетерминального символа X. Постройте последовательность шагов грамматического разбора для следующих предложенийг

х-{-х

(х-\-х)(+~х)

if х-\- X then X* X else - х

if X then if - л tlien x else xx else л: * л

if - X then л else if x then x + л else x

5.2. Удовлетворяет ли грамматика упр. 5.1 ограничениям 1 и 2 для ни- сходящего грамматического разбора с просмотром вперед на -один

символ? Если нет, найдите эквивалентный синтаксис, который удовлетворяет этим ограничениям. Изобразите этот синтаксис в виде синтаксического графа и структуры данных, используемой в программе 5.3.

ssym[;] := semicolon;

mnemonic[lit] := lit ; mnemonic[opr\ := opr; mnemonic[lod] := LODJ mnemonic[sto] := STO; mnemonic[cal] CAL; mnemonic[int] :== iNT; mnemonic[jmp\jmp; mnemonic[jpc] jpc; declbegsys := [constsym, varsym,procsym]; statbegsys := [beginsym, callsym, ifsym, whilesym]; facbegsys := [ident, number, Iparen]; pageiputput); err := 0

cc := 0; cx := 0; := 0; ch := ; kk := al; getsym;

,block(0,0,[period]i-declbegsys+siatbegsys);

ifsym Ф period then error (9);

if да ==; 0 tlien interpret else wnLei еквоб5 in pl/o program; 99: writek end .

Программа 5.6. Транслятор для ПЛ/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