Анимация
JavaScript
|
Главная Библионтека { Report What Was Expected } procedure Expected(s: string); begin Abort(s + Expected); end; { Report an Undefined Identifier } procedure Undefined(n: string); begin Abort(Undefined Identifier + n); 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 NewLine; begin while Look = CR do begin GetChar; if Look = LF then GetChar; SkipWhite; end; end; { Match a Specific Input Character } procedure Match(x: char); begin NewLine; if Look = x then GetChar else Expected( + x + ); SkipWhite; end; { Table Lookup } function Lookup(T: TabPtr; s: string; n: integer): integer; var i: integer; found: Boolean; begin found := false; i := n; while (i > 0) and not found do if s = T*[i] then found := true else dec(i); Lookup := i; end; { Locate a Symbol in Table } { Returns the index of the entry. Zero if not present. } function Locate(N: Symbol): integer; begin Locate := Lookup(®ST, n, MaxEntry); end; { Look for Symbol in Table } function InTable(n: Symbol): Boolean; begin InTable := Lookup(®ST, n, MaxEntry) <> 0; end; { Add a New Entry to Symbol Table } procedure AddEntry(N: Symbol; T: char); begin if InTable(N) then Abort(Duplicate Identifier + N); if NEntry = MaxEntry then Abort(Symbol Table Full); Inc(NEntry); ST[NEntry] := N; SType[NEntry] := T; end; { Get an Identifier } procedure GetName; begin NewLine; if not IsAlpha(Look) then Expected(Name); Value := ; while IsAlNum(Look) do begin Value := Value + UpCase(Look); GetChar; end; SkipWhite; end; { Get a Number } function GetNum: integer; var Val: integer; begin NewLine; if not IsDigit(Look) then Expected(Integer); Val := 0; while IsDigit(Look) do begin Val := 10 * Val + Ord(Look) - Ord(0); GetChar; end; GetNum := Val; SkipWhite; end; { Get an Identifier and Scan it for Keywords } procedure Scan; begin GetName; Token := KWcode[Lookup(Addr(KWlist), Value, NKW) + 1]; 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 |