Π’ΠΎΠ³Π΄Π° ΠΌΡ Π·Π°ΠΊΠ°Π½ΡΠΈΠ²Π°Π΅ΠΌ Π²ΡΠ΅ Π΅ΡΠ΅ Π½ΡΠΆΠ΄Π°ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² GetName ΠΈ GetNum, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ ΡΠ°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ ΠΈΡ Π² ΡΠ°Π½Π½ΠΈΡ Π³Π»Π°Π²Π°Ρ .
Π‘Π½Π°ΡΠ°Π»Π° Π²Π°ΠΌ ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡΡΡ, ΡΡΠΎ ΡΡΠΎ ΡΠ°Π³ Π½Π°Π·Π°Π΄ ΠΈ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΏΡΠΈΠΌΠΈΡΠΈΠ²Π½ΡΠΉ ΡΠΏΠΎΡΠΎΠ±. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΆΠ΅, ΡΡΠΎ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠΊΠ°Π½Π΅ΡΠ°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΡΠΊΠ°Π½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½ΡΠΆΠ½Ρ. Π ΡΠ΅Ρ ΠΌΠ΅ΡΡΠ°Ρ , Π³Π΄Π΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° Π½Π΅ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Ρ, ΠΌΡ Π½Π΅ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ, ΠΈΡΠ° ΠΈΡ .
ΠΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠΊΠ°Π½Π΅ΡΠ° ΠΈ ΠΏΠ°ΡΡΠ΅ΡΠ°
Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΎΡ Π²Π°ΡΠΈΠ»ΠΈ Π²ΡΡ ΡΠ΅ΠΎΡΠΈΡ ΠΈ ΠΎΠ±ΡΠΈΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°, Ρ Π½Π°ΠΊΠΎΠ½Π΅Ρ Π³ΠΎΡΠΎΠ² ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠΈΡ ΡΠ²ΠΎΠ΅ Π·Π°ΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΎ ΡΠΎΠΌ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΠΏΠΎΡΠΎΠ±ΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΡΠΎΠΊΠ΅Π½Ρ Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΡΠΌΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡΠΌΠΈ Π² Π½Π°ΡΠ΅ΠΉ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠ΅ΠΉ ΡΠ°Π±ΠΎΡΠ΅. ΠΠ»Ρ ΠΊΡΠ°ΡΠΊΠΎΡΡΠΈ ΠΈ ΠΏΡΠΎΡΡΠΎΡΡ Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΡ ΡΠ°ΠΌ ΡΠ΅Π±Ρ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ ΡΠ°Π½Π΅Π΅: Ρ ΡΠ°Π·ΡΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ ΡΠΏΡΠ°Π²Π»ΡΡΡΡΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΡ (IF) ΠΈ Π½ΠΈΠΊΠ°ΠΊΠΈΡ Π±ΡΠ»Π΅Π²ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠΎΠ³ΠΎ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΄Π»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ. Π Π°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π½Π°Π±ΠΎΡΠ° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π΄ΠΎΠ²ΠΎΠ»ΡΠ½ΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΡΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ.
ΠΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π° Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΡΠΆΠ΅ ΡΡΡΠ΅ΡΡΠ²ΡΡΡ Π² Π½Π°ΡΠΈΡ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ . Π― ΠΏΠΎΡΡΡΠΎΠΈΠ» Π΅Π΅ ΠΎΡΡΠΎΡΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΏΠΈΡΠΎΠ²Π°Π² ΡΡΠΈ ΡΠ°ΠΉΠ»Ρ, Π½ΠΎ Ρ Π½Π΅ ΠΏΠΎΡΠΌΠ΅Ρ ΠΏΠΎΠΏΡΠΎΠ±ΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ²Π΅ΡΡΠΈ Π²Π°Ρ ΡΠ΅ΡΠ΅Π· ΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΡ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ, Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΊΠ°, Π²ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½ΠΈΠΆΠ΅:
{β}
program KISS;
{β}
{ Constant Declarations }
const TAB = ^I;
CR = ^M;
LF = ^J;
{β}
{ Type Declarations }
type Symbol = string[8];
SymTab = array[1..1000] of Symbol;
TabPtr = ^SymTab;
{β}
{ Variable Declarations }
var Look : char; { Lookahead Character }
Lcount: integer; { Label Counter }
{β}
{ 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;
{β}
{ Report What Was Expected }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
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 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;
{β}
{ Match a Specific Input Character }
procedure Match(x: char);
begin
if Look <> x then Expected('''' + x + '''');
GetChar;
SkipWhite;
end;
{β}
{ Skip a CRLF }
procedure Fin;
begin
if Look = CR then GetChar;
if Look = LF then GetChar;
SkipWhite;
end;
{β}
{ Get an Identifier }
function GetName: char;
begin
while Look = CR do
Fin;
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;
{β}
{ Generate a Unique Label }
function NewLabel: string;
var S: string;
begin
Str(LCount, S);
NewLabel := 'L' + S;
Inc(LCount);
end;
{β}
{ Post a Label To Output }
procedure PostLabel(L: string);
begin
WriteLn(L, ':');
end;
{β}
{ Output a String with Tab }
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;
{β}
{ Parse and Translate an Identifier }
procedure Ident;
var Name: char;
begin
Name := GetName;
if Look = '(' then begin
Match('(');
Match(')');
EmitLn('BSR ' + Name);
end
else
EmitLn('MOVE ' + Name + '(PC),D0');
end;
{β}
{ Parse and Translate a Math Factor }
procedure Expression; Forward;
procedure Factor;
begin
if Look = '(' then begin
Match('(');
Expression;
Match(')');
end
else if IsAlpha(Look) then
Ident
else
EmitLn('MOVE #' + GetNum + ',D0');
end;
{β}
{ Parse and Translate the First Math Factor }
procedure SignedFactor;
var s: boolean;
begin
s := Look = '-';
if IsAddop(Look) then begin
GetChar;
SkipWhite;
end;
Factor;
if s then
EmitLn('NEG D0');
end;
{β}
{ Recognize and Translate a Multiply }
procedure Multiply;
begin
Match('*');
Factor;
EmitLn('MULS (SP)+,D0');
end;
{β}
{ Recognize and Translate a Divide }
procedure Divide;
begin
Match('/');
Factor;
EmitLn('MOVE (SP)+,D1');
EmitLn('EXS.L D0');
EmitLn('DIVS D1,D0');
end;
{β}
{ Completion of Term Processing (called by Term and FirstTerm }
procedure Term1;
begin
while IsMulop(Look) do begin
EmitLn('MOVE D0,-(SP)');
case Look of
'*': Multiply;
'/': Divide;
end;
end;
end;
{β}
{ Parse and Translate a Math Term }
procedure Term;
begin
Factor;
Term1;
end;
{β}
{ Parse and Translate a Math Term with Possible Leading Sign }
procedure FirstTerm;
begin
SignedFactor;
Term1;
end;
{β}
{ Recognize and Translate an Add }
procedure Add;
begin
Match('+');
Term;
EmitLn('ADD (SP)+,D0');
end;
{β}
{ Recognize and Translate a Subtract }
procedure Subtract;
begin
Match('-');
Term;
EmitLn('SUB (SP)+,D0');
EmitLn('NEG D0');
end;
{β}
{ Parse and Translate an Expression }
procedure Expression;
begin
FirstTerm;
while IsAddop(Look) do begin
EmitLn('MOVE D0,-(SP)');
case Look of
'+': Add;
'-': Subtract;
end;
end;
end;
{β}
{ Parse and Translate a Boolean Condition }
{ This version is a dummy }
Procedure Condition;
begin
EmitLn('Condition');
end;
{β}
{ Recognize and Translate an IF Construct }
procedure Block;
Forward;
procedure DoIf;
var L1, L2: string;
begin
Match('i');
Condition;
L1 := NewLabel;
L2 := L1;
EmitLn('BEQ ' + L1);
Block;
if Look = 'l' then begin
Match('l');
L2 := NewLabel;
EmitLn('BRA ' + L2);
PostLabel(L1);
Block;
end;
PostLabel(L2);
Match('e');
end;
{β}
{ Parse and Translate an Assignment Statement }
procedure Assignment;
var Name: char;
begin
Name := GetName;
Match('=');
Expression;
EmitLn('LEA ' + Name + '(PC),A0');
EmitLn('MOVE D0,(A0)');
end;
{β}
{ Recognize and Translate a Statement Block }
procedure Block;
begin
while not(Look in ['e', 'l']) do begin
case Look of
'i': DoIf;
CR: while Look = CR do
Fin;
else Assignment;
end;
end;
end;
{β}
{ Parse and Translate a Program }
procedure DoProgram;
begin
Block;
if Look <> 'e' then Expected('END');
EmitLn('END')
end;
{β}
{ Initialize }
procedure Init;
begin
LCount := 0;
GetChar;
end;
{β}
{ Main Program }
begin
Init;
DoProgram;
end.
{β}
ΠΠ°ΡΠ° ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π²:
Π€ΠΎΡΠΌΠ° ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π³ΠΎ FirstTerm ΠΈ Ρ.ΠΏ., Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π²Ρ Π²ΠΈΠ΄Π΅Π»ΠΈ ΡΠ°Π½Π΅Π΅. ΠΡΠΎ Π΅ΡΠ΅ ΠΎΠ΄Π½Π° Π²Π°ΡΠΈΠ°ΡΠΈΡ Π½Π° ΡΡ ΠΆΠ΅ ΡΠ°ΠΌΡΡ ΡΠ΅ΠΌΡ. ΠΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠΉΡΠ΅ ΠΈΠΌ Π²Π΅ΡΡΠ΅ΡΡ Π²Π°ΠΌΠΈ... ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π°Π»ΡΡΠ΅.
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π²ΡΠ·ΠΎΠ²Ρ Fin Π² ΡΡΡΠ°ΡΠ΅Π³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ Π΄Π»Ρ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΡ ΡΡΡΠΎΠΊ.
ΠΡΠ΅ΠΆΠ΄Π΅ ΡΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΡΠΊΠ°Π½Π΅ΡΠ°, ΡΠ½Π°ΡΠ°Π»Π° ΡΠΊΠΎΠΏΠΈΡΡΠΉΡΠ΅ ΡΡΠΎΡ ΡΠ°ΠΉΠ» ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ ΠΎΠ½ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ Π°Π½Π°Π»ΠΈΠ·. ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅ Β«ΠΊΠΎΠ΄Π°Β»: "i" Π΄Π»Ρ IF, "l" Π΄Π»Ρ ELSE ΠΈ "e" Π΄Π»Ρ ELSE ΠΈΠ»ΠΈ ENDIF.
ΠΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΡΠ°Π±ΠΎΡΠ°Π΅Ρ, ΡΠΎΠ³Π΄Π° Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΡΠΏΠ΅ΡΠΈΠΌ. ΠΡΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠΊΠ°Π½Π΅ΡΠ° Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΏΠΎΠΌΠΎΠΆΠ΅Ρ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΏΠ»Π°Π½. ΠΠΎ Π²ΡΠ΅Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°Ρ , ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΌΡ ΠΏΡΠΈΠ΄Π΅ΡΠΆΠΈΠ²Π°Π»ΠΈΡΡ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ, ΡΡΠΎ ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ΅Π³Π΄Π° Π±ΡΡΡ Π½Π΅ΠΏΡΡΡΡΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ. ΠΡ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π·Π°Π³ΡΡΠΆΠ°Π»ΠΈ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ²Π°ΡΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π² Init ΠΈ ΠΏΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ ΠΎΡΡΠ°Π²Π»ΡΠ»ΠΈ Β«ΠΏΠΎΠΌΠΏΡ Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠΉΒ». Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ Ρ Π½ΠΎΠ²ΡΠΌΠΈ ΡΡΡΠΎΠΊΠ°ΠΌΠΈ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΅Π΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΡΠΈΠΌΠ²ΠΎΠ» Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΠΊΠ°ΠΊ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠΉ ΡΠΎΠΊΠ΅Π½.
Π ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ: ΡΠ΅ΠΊΡΡΠΈΠΉ ΠΏΡΠ΅Π΄ΡΠΊΠ°Π·ΡΠ²Π°ΡΠΈΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΠ΅Π³Π΄Π° ΠΎΡΡΠ°Π²Π°ΡΡΡΡ Π½Π° Π½Π°ΡΠ°Π»Π΅ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π»Π΅ΠΊΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ Π½Π° Π½ΠΎΠ²ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅.
ΠΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½Π°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π½ΠΈΠΆΠ΅. Π§ΡΠΎΠ±Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΅Π΅ Ρ ΡΠ΄Π΅Π»Π°Π» ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ:
β’ ΠΠΎΠ±Π°Π²Π»Π΅Π½Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Token ΠΈ Value ΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΡΠΈΠΏΠΎΠ², Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ Π΄Π»Ρ Lookup.
β’ ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ KWList ΠΈ KWcode.
β’ ΠΠΎΠ±Π°Π²Π»Π΅Π½ Lookup.
β’ GetName ΠΈ GetNum Π·Π°ΠΌΠ΅Π½Π΅Π½Ρ ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠΌΠΈ Π²Π΅ΡΡΠΈΡΠΌΠΈ. (ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π²ΡΠ·ΠΎΠ² Lookup Π±ΡΠ» ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ ΠΈΠ· GetName, ΡΠ°ΠΊ ΡΡΠΎ ΠΎΠ½ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π²Π½ΡΡΡΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ).
β’ Π‘ΠΎΠ·Π΄Π°Π½Π° Π½ΠΎΠ²Π°Ρ, ΡΡΠ΄ΠΈΠΌΠ΅Π½ΡΠ°ΡΠ½Π°Ρ Scan, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ GetName Π·Π°ΡΠ΅ΠΌ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°.
β’ Π‘ΠΎΠ·Π΄Π°Π½Π° Π½ΠΎΠ²Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° MatchString, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΈΡΠ΅Ρ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ½ΠΎΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Match, MatchString Π½Π΅ ΡΡΠΈΡΡΠ²Π°Π΅Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ.
β’ ΠΠ·ΠΌΠ΅Π½Π΅Π½ Block Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° Scan.
β’ ΠΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Ρ Π²ΡΠ·ΠΎΠ²Ρ Fin. Fin ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· GetName.
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ:
{β}
program KISS;
{β}
{ Constant Declarations }
const TAB = ^I;
CR = ^M;
LF = ^J;
{β}
{ 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 }
Lcount: integer; { Label Counter }
{β}
{ Definition of Keywords and Token Types }
const KWlist: array [1..4] of Symbol =
('IF', 'ELSE', 'ENDIF', 'END');
const KWcode: string[5] = 'xilee';
{β}
{ 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;
{β}
{ Report What Was Expected }
procedure Expected(s: string);
begin
Abort(s + ' Expected');
end;
{β}
{ Recognize an Alpha Character }
function IsAlpha(c: char): boolean;
begin
IsAlpha := UpCase(c) in ['A'..'Z'];
end;
{β}