Анимация
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 Error(s: string); begin

WriteLn;

WriteLn(*G, Error: , s, .); end;

{ Report Error and Halt } procedure Abort(s: string); begin

Error(s);

Halt; end;

{ Report What Was Expected } procedure Expected(s: string); begin

Abort(s + Expected); end;

{ Dump the Symbol Table } procedure DumpTable; var i: char; begin

for i := A to Z do

WriteLn(i, , ST[i]);

end;

{ Recognize an Alpha Character } function IsAlpha(c: char): boolean; begin

IsAlpha := UpCase(c) in [A..Z]; end;

{ Recognize a Decimal Digit } function IsDigit(c: char): boolean; begin

IsDigit := c in [0..9]; end;

{ Recognize an AlphaNumeric Character } function IsAlNum(c: char): boolean; begin

IsAlNum := IsAlpha(c) or IsDigit(c); end;

{ Recognize an Addop }

function IsAddop(c: char): boolean;

begin

IsAddop := c in [+, -]; end;

{ Recognize a Mulop }

function IsMulop(c: char): boolean;

begin

IsMulop := c in [*, /]; end;

{ Recognize a Boolean Orop } function IsOrop(c: char): boolean; begin



IsOrop := c in [j, -]; end;

{ Recognize a Relop }

function IsRelop(c: char): boolean;

begin

IsRelop := c in [=, #, <, >]; end;

{ Recognize White Space }

function IsWhite(c: char): boolean;

begin

IsWhite := c in [ , TAB]; end;

{ Skip Over Leading White Space }

procedure SkipWhite;

begin

while IsWhite(Look) do GetChar;

end;

{ Skip Over an End-of-Line }

procedure Fin;

begin

if Look = CR then begin GetChar;

if Look = LF then GetChar;

end; end;

{ Match a Specific Input Character }

procedure Match(x: char);

begin

if Look = x then GetChar else Expected( + x + ); SkipWhite; end;

{ Get an Identifier } function GetName: char; begin

if not IsAlpha(Look) then Expected(Name); GetName := UpCase(Look); GetChar; SkipWhite; end;

{ Get a Number } function GetNum: char; begin

if not IsDigit(Look) then Expected(Integer); GetNum := Look; GetChar; SkipWhite; end;



procedure Emit(s: string); begin

Write(TAB, s); end;

{ Output a String with Tab and CRLF }

procedure EmitLn(s: string);

begin

Emit(s);

WriteLn; end;

{ Initialize } procedure Init; var i: char; begin

for i := A to Z do ST[i] := ?;

GetChar; SkipWhite; end;

{ Main Program } begin Init;

DumpTable; end.

ОК, запустите эту программу. Вы должны получить (очень быстро) распечатку всех букв алфавита (потенциальных идентификаторов) сопровождаемых вопросительным знаком. Не очень захватывающе, но это только начало.

Конечно, вообще-то мы хотим видеть типы только тех переменных, которые были определены. Мы можем устранить другие добавив в DumpTable условие IF. Измените цикл следующим образом: for i := A to Z do if ST[i] <> ? then

WriteLn(i, , ST[i]);

Теперь запустите программу снова. Что вы получили?

Хорошо, это даже более скучно чем раньше! Сейчас вообще ничего не выводится, так как в данный момент ни одно из имен не было обьявлено. Мы можем немного приправить результат вставив в основную программу несколько операторов, объявляющих несколько записей. Попробуйте такие:

ST[A] := a; ST[P] := b; ST[X] := c;

На этот раз, когда вы запустите программу, вы должны получить распечатку, показывающую, что таблица идентификаторов работает правильно.

ДОБАВЛЕНИЕ ЗАПИСЕЙ

Конечно, заполнение таблицы напрямую - довольно плохая практика и она не сможет хорошо нам послужить в будущем. То, что нам нужно, это процедура, добавляющая записи в таблицу. В то же самое время мы знаем, что нам будет необходимо тестировать таблицу для проверки, что мы не объявляем повторно переменную, которая уже



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