Главная Терминология Хоора 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 |