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

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

While/do

begin < g then g :~ g~f; i(g < fihmf : f-g;

end ; begin

X m; у :- n; call multiply; X := 25; у 3; call divide; X :== 84; у :- 36; callcrf; call x; X := gcd; gcd ~x tl5

ti3 Щ

end .

- tl7 . t 5 t?

PROGRAM INCOMPLETE

(5.20)

Bee же ясно, что никакая схема, которая достаточно эф-)ективно транслирует правильные предложения, не сможет ак же эффективно справляться со всеми возможными неправильными конструкциями. Да и как может быть иначе!

~Q begin У-

оператор

оператор


Рис. 5 6. Синтаксис с модифицированным составным оператором.

Любая схема восстановления, реализованная с раразумными затратами, потерпит неудачу, т. е. не сможет адекватно обработать некоторые ошибочные конструкции. Однако хороший транслятор должен обладать такими важными свойствами:

1. Никакая входная последовательность не должна приводить к катастрофе.

2. Все конструкции, которые по определению языка являются незаконными, должны обнаруживаться и отмечаться.



program PLO (input ,oiifput);

[транслятор с ПЛ/О с восстановлением при синтаксических ошибг label 99; -

шi%inorw - И; [количество зарезервированных слов)

txmax - 100; [длина таблицы имен]

птах - 14; [максимальное количество цифр в числах)

aJ - 10; [длина имен)

type symbol =

(nul, ident, number, plus, minus, times, slash, oddsym,

eql, neq, Iss, kg, gtr, geg, Iparen, rparen, comma, semicolon,

period, becomes, beginsym, endsym, ifsym, thensym, ,:Whilesym, dosym, callsym, constsym, varsym,procsym);

alfa =! packed array [1.. al] of char; object = (constant variable, procedure);

symset = set of symbol; var ch: char; [последний прочитанный входной символ}

sym: symbol; [последний прочитанный символ языка]

id: alfa; [последнее прочитанное имя]

пит: integer; [последнее прочитанное число]

сс: integer; [счетчик символов]

11: integer; [длина строки]

кк: integer;

line: array [1.. 81] of char] a: alfa;

Word: array [1.. nor\v\ of alfa; тут: &xtuy[\. .nor\v\ of symbol; ssym: йпйу [char] of symbol; .declbegsys, statbegsys,facbegsys: symset; table.: array [0.. txmax] of record name: alfa; kind: object

end ; .

procedure error (n: integer); begin writehC \cc, f, n: 2); end [error];

procedure test (s\,sl: symset; n: integer); begin if-i(sym in si) then

begin OTo/(n); si := si -f s2; while ~(sym in si) do getsym

end [test];



jitoceuate Mock (tx: integer; fsys: symset); procedure enter (k: object); begin [запись объекта в таблицу]

tx := tx + 1;

with table[tx] do

begin name := id; kind := k;

end end [enter] ;

fimction position (id: alfa): integer;

var i: integer; begin [поиск имени id в таблице]

tableiO] .name ;- id; i := tx;

while table[i] .name Ф- id do t ;= /-1;

position := i end {position} ;

procedure constdeclaration; begin if sym - ident then begin getsym;

if sym in [e/, fecowej] then begin if jvm = becomes then error (\); getsym;

ifsym - number then

begin enter (constant); getsym end

else error (2) . . end else error (3) end else error (4) end {constdeclaration} ;

procedure rardeclaration; begin if sym ~ ident then

begin enter (variable); getsym end else error (4) end {vardeclaration} ; ptoceuute statement (fsys; symset); var i: integer;

procedure expression (fsys: symset); procedure term (fsys: symset); procedure factor (fsys: symset);

var i: integer: begin test (facbegsys, fsys, 24); While sym in facbegsys do




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