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