Анимация
JavaScript
|
Главная Библионтека procedure DoRead; begin MatchCC); GetName; ReadVar; while Look = , do begin MatchC,); GetName; ReadVar; end; Match()); end; { Process a Write Statement } procedure DoWrite; begin MatchCC); Expression; WriteVar; while Look = , do begin MatchC,); Expression; WriteVar; end; Match()); end; Наконец, мы должны расширить процедуру Block для поддержки новых типов операторов: { Parse and Translate a Block of Statements } procedure Block; begin Scan; while not(Token in [e, l]) do begin case Token of i: DoIf; w: DoWhile; R: DoRead; W: DoWrite; else Assignment; end; Scan; end; end; На этом все. Теперь у нас есть язык! ЗАКЛЮЧЕНИЕ К этому моменту мы полностью определили TINY. Он не слишком значителен... в действительности игрушечный комиплятор. TINY имеет только один тип данных и не имеет подпрограмм... но это законченный, пригодный для использования язык. Пока что вы не имеете возможности написать на нем другой компилятор или сделать что-нибудь еще очень серьезное, но вы могли бы писать программы для чтения входных данных, выполнения вычислений и вывода результатов. Не слишком плохо для игрушки. Более важно, что мы имеем твердую основу для дальнейшего развития. Я знаю, что вы будете рады слышать это: в последний раз я начал с создания синтаксического анализатора заново... с этого момента я предполагаю просто добавлять возможности в TINY пока он не превратится в KISS. Ох, будет время, когда нам понадобится попробовать некоторые вещи с новыми копиями Cradle, но как только мы разузнаем как они делаются, они будут встроены в TINY. Какие это будут возможности? Хорошо, для начала нам понадобятся подпрограммы и функции. Затем нам нужна возможность обрабатывать различные типы, включая массивы, строки и другие структуры. Затем нам нужно работать с идеей указателей. Все это будет в следующих главах. В справочных целях полный листинг TINY версии 1.0 показан ниже: program Tinyl0; { Constant Declarations } const TAB = CR = *M; LF = LCount: integer = 0; NEntry: integer = 0; { Type Declarations } type Symbol = string[8]; SymTab = array[1..1000] of Symbol; TabPtr = SymTab; { Variable Declarations } var Look : char; { Lookahead Character } Token: char; { Encoded Token } Value: string[16]; { Unencoded Token const MaxEntry = l00; var ST : array[1..MaxEntry] of Symbol; SType: array[1..MaxEntry] of char; { Definition of Keywords and Token Types } const NKW = 11; NKW1 = 12; const KWlist: array[1..NKW] of Symbol = (IF, ELSE, ENDIF, WHILE, ENDWHILE, READ, WRITE, VAR, BEGIN, END, PROGRAM); const KWcode: string[NKW1] = xileweRWvbep; { Read New Character From Input Stream } procedure GetChar; begin Read(Look); end; { Report an Error } procedure Error(s: string); begin WriteLn; WriteLn(*G, Error: , s, .); end; { Report Error and Halt } procedure Abort(s: string); begin Error(s); Halt; end; 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 |