Анимация
JavaScript


Главная  Библионтека 

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

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