procedure Block; Forward;
procedure DoIf;
var L1, L2: string;
begin
BoolExpression;
L1 := NewLabel;
L2 := L1;
BranchFalse(L1);
Block;
if Token = 'l' then begin
L2 := NewLabel;
Branch(L2);
PostLabel(L1);
Block;
end;
PostLabel(L2);
MatchString('ENDIF');
end;
{β}
{ Parse and Translate a WHILE Statement }
procedure DoWhile;
var L1, L2: string;
begin
L1 := NewLabel;
L2 := NewLabel;
PostLabel(L1);
BoolExpression;
BranchFalse(L2);
Block;
MatchString('ENDWHILE');
Branch(L1);
PostLabel(L2);
end;
{β}
{ 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;
else Assignment;
end;
Scan;
end;
end;
{β}
{ Parse and Translate Global Declarations }
procedure TopDecls;
begin
Scan;
while Token <> 'b' do begin
case Token of
'v': Decl;
else Abort('Unrecognized Keyword ' + Value);
end;
Scan;
end;
end;
{β}
{ Parse and Translate a Main Program }
procedure Main;
begin
MatchString('BEGIN');
Prolog;
Block;
MatchString('END');
Epilog;
end;
{β}
{ Parse and Translate a Program }
procedure Prog;
begin
MatchString('PROGRAM');
Header;
TopDecls;
Main;
Match('.');
end;
{β}
{ Initialize }
procedure Init;
var i: char;
begin
for i := 'A' to 'Z' do
ST[i] := ' ';
GetChar;
Scan;
end;
{β}
ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡΠ»ΠΈ Π²ΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΡΠ΄Π΅Π»Π°Π½Ρ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ, Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ΅ΠΏΠ΅ΡΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²ΡΠ³Π»ΡΠ΄ΡΡ ΠΊΠ°ΠΊ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. (ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠ΄Π΅Π»Π°Π»ΠΈ Π²ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ, Π½Π΅ ΠΎΡΡΠ°ΠΈΠ²Π°ΠΉΡΠ΅ΡΡ. ΠΠΎΠ»Π½ΡΠΉ Π»ΠΈΡΡΠΈΠ½Π³ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΡ Π΄Π°Π½ Π½ΠΈΠΆΠ΅.)
Π Π°Π±ΠΎΡΠ°Π΅Ρ? ΠΡΠ»ΠΈ Π΄Π°, ΡΠΎ ΠΌΡ ΠΏΠΎΡΡΠΈ Π΄ΠΎΠΌΠ°. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ Π½Π΅Π±ΠΎΠ»ΡΡΠΈΠΌΠΈ ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΡΠΌΠΈ, ΠΌΡ ΡΠΆΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΠΏΡΠΈΠ³ΠΎΠ΄Π½ΡΠΉ Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ. ΠΠΌΠ΅ΡΡΡΡ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΎΠ±Π»Π°ΡΡΠ΅ΠΉ, ΡΡΠ΅Π±ΡΡΡΠΈΡ ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΡ.
ΠΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ
ΠΠ΄Π½Π° ΠΈΠ· Π½ΠΈΡ β ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅, ΡΡΠ΅Π±ΡΡΡΠ΅Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΠΈΠΌΠ΅Π½ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ . Π’Π΅ΠΏΠ΅ΡΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°, ΡΡΠΎ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ Π½Π°ΡΠΈΠ½Π°Π΅Ρ ΠΊΠ°Π·Π°ΡΡΡΡ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΡΠΌ ΠΈ Π½Π΅Π½ΡΠΆΠ½ΡΠΌ. Π Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΡΠΎ ΡΠ°ΠΊ. Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ Π΅Π³ΠΎ Π΄ΠΎΡΡΠΎΠΈΠ½ΡΡΠ²ΠΎ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΎΠ½ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ². ΠΠΎ ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π΄Π»Ρ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Π΅ΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠΎΠ² ΠΈ ΠΎΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ ΡΠ½ΠΈΡΡΠΎΠΆΠ΅Π½ΠΎ.
ΠΡ ΡΠΆΠ΅ Π΄Π΅Π»Π°Π»ΠΈ ΡΡΠΎΡ ΡΠ°Π³ ΠΏΡΠ΅ΠΆΠ΄Π΅. ΠΠ° ΡΡΠΎΡ ΡΠ°Π·, ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Ρ ΡΠ΄Π΅Π»Π°Ρ ΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π΄ΡΡΠ³ΠΎΠΌΡ. Π― Π΄ΡΠΌΠ°Ρ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½Π½ΡΠΉ Π·Π΄Π΅ΡΡ, ΡΠΎΡ ΡΠ°Π½ΠΈΡ ΠΏΡΠΎΡΡΠΎΡΡ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ.
ΠΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΡΡΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² Π½Π° Pascal ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΡΠΈΠΏΠ° Π·Π°ΠΏΠΈΡΡ ΠΈ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΊΠ°ΠΊ ΠΌΠ°ΡΡΠΈΠ²Π° ΡΠ°ΠΊΠΈΡ Π·Π°ΠΏΠΈΡΠ΅ΠΉ. ΠΠ΄Π΅ΡΡ, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π½Π°ΠΌ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ ΠΏΠΎΠΊΠ° Π½Π΅ Π½ΡΠΆΠ½ΠΎ ΠΏΠΎΠ»Π΅ ΡΠΈΠΏΠ° (ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΏΠΎΠΊΠ° ΡΡΠΎ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½Π½ΡΠΉ ΡΠΈΠΏ), ΡΠ°ΠΊ ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ°ΡΡΠΈΠ² ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ². ΠΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΡΠ²ΠΎΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΡΡΠ΅ΡΡΠ²ΡΡΡΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Lookup Π΄Π»Ρ ΠΏΠΎΠΈΡΠΊΠ° Π² ΡΠ°Π±Π»ΠΈΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΡΠ°ΠΊΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Π² ΡΠΏΠΈΡΠΊΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ². ΠΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, Π΄Π°ΠΆΠ΅ ΠΊΠΎΠ³Π΄Π° Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ Π±ΠΎΠ»ΡΡΠ΅ ΠΏΠΎΠ»Π΅ΠΉ, ΠΌΡ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ ΡΠΎΡ ΡΠ°Π½ΡΡ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΠΎΠ»Ρ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΡ ΠΌΠ°ΡΡΠΈΠ²Π°Ρ .
ΠΠΎΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°ΡΡ. Π‘ΠΏΠ΅ΡΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π½ΠΎΠ²ΡΡ ΡΠΈΠΏΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Π½ΡΡ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ:
NEntry: integer = 0;
ΠΠ°ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ² ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
const MaxEntry = 100;
var ST : array[1..MaxEntry] of Symbol;
(ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ST Π½Π΅ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ ΠΊΠ°ΠΊ SymTab. ΠΡΠΎ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΠ΅ Π»ΠΈΠΏΠΎΠ²ΠΎΠ΅, ΡΡΠΎΠ±Ρ Π·Π°ΡΡΠ°Π²ΠΈΡΡ Lookup ΡΠ°Π±ΠΎΡΠ°ΡΡ. SymTab Π·Π°Π½ΡΠ»Ρ Π±Ρ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ°ΠΌΡΡΠΈ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΠΎΠ±ΡΡΠ²Π»ΡΠ΅ΡΡΡ).
ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ InTable.
{β}
{ Look for Symbol in Table }
function InTable(n: Symbol): Boolean;
begin
InTable := Lookup(@ST, n, MaxEntry) <> 0;
end;
{β}
ΠΠ°ΠΌ ΡΠ°ΠΊΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π½ΠΎΠ²Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° AddEntry, ΠΊΠΎΡΠΎΡΠ°Ρ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½ΠΎΠ²ΡΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠ°Π±Π»ΠΈΡΡ:
{β}
{ 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;
{β}
ΠΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅ΡΡΡ ΠΈΠ· Alloc:
{β}
{ Allocate Storage for a Variable }
procedure Alloc(N: Symbol);
begin
if InTable(N) then Abort('Duplicate Variable Name ' + N);
AddEntry(N, 'v');
.
.
.
{β}
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π²ΡΠ΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π½Π°ΡΡΠΎΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΠΉ ΡΠΈΠΌΠ²ΠΎΠ». ΠΠ½ΠΈ Π²ΠΊΠ»ΡΡΠ°ΡΡ LoadVar ΠΈ Store (ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΡΠΈΠΏ Ρ char Π½Π° string) ΠΈ Factor, Assignment ΠΈ Decl (ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Value[1] Π½Π° Value).
ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ Π²Π΅ΡΡ: ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Init Π΄Π»Ρ ΠΎΡΠΈΡΡΠΊΠΈ ΠΌΠ°ΡΡΠΈΠ²Π° ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
{β}
{ Initialize }
procedure Init;
var i: integer;
begin
for i := 1 to MaxEntry do begin
ST[i] := '';
SType[i] := ' ';
end;
GetChar;
Scan;
end;
{β}
ΠΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠ°Π±ΠΎΡΠ°ΡΡ. ΠΡΠΏΡΡΠ°ΠΉΡΠ΅ Π΅Π΅ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΠ΅, ΡΡΠΎ Π²Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΠ΅ ΠΈΠΌΠ΅Π½Π° ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ .
Π‘Π½ΠΎΠ²Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ
Π£ Π½Π°Ρ ΠΎΡΡΠ°Π»ΠΎΡΡ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎΠ΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ β ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ. ΠΠ΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· ΠΎΠ΄ΠΈΠ½ΠΎΡΠ½ΡΡ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ², Π½ΠΎ Π΄ΡΡΠ³ΠΈΠ΅ ΡΡΠ΅Π±ΡΡΡ Π΄Π²ΡΡ . ΠΡΠΎ '<=' ΠΈ '>='. Π― ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΠ°ΡΠΊΠ°Π»Π΅Π²ΡΠΊΠΎΠ΅ '<>' Π΄Π»Ρ Β«Π½Π΅ ΡΠ°Π²Π½ΠΎΒ» Π²ΠΌΠ΅ΡΡΠΎ '#'.
ΠΠ°ΠΊ Π²Ρ ΠΏΠΎΠΌΠ½ΠΈΡΠ΅, Π² Π³Π»Π°Π²Π΅ 7 Ρ ΡΠΊΠ°Π·Π°Π», ΡΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΠΏΠΎΡΠΎΠ± ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ β Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΈΡ Π² ΡΠΏΠΈΡΠΎΠΊ ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ² ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ ΠΎΡΡΡΠΊΠΈΠ²Π°ΡΡ ΠΈΡ . ΠΠΎ, ΠΎΠΏΡΡΡ, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΡΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π΄ΠΎ ΡΡΠΎΠ³ΠΎ ΠΌΡ Ρ Π½Π°Ρ Π±ΡΠ»Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΡΠΊΠ°Π½Π΅ΡΠ° Π½Π°ΡΠ°Π»ΠΎΠΌ ΡΡΠ²Π΅ΡΠΆΠ΄Π΅Π½ΠΈΡ.
Π― ΡΠΏΠΎΠΌΡΠ½ΡΠ» ΡΠΎΠ³Π΄Π°, ΡΡΠΎ ΠΌΡ Π²ΡΠ΅ ΠΆΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ Π½Π΅ΠΏΡΠΈΡΡΠ½ΠΎΡΡΠ΅ΠΉ Ρ ΡΡΠΈΠΌ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ ΠΎΠ½ΠΈ ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Ρ Π² ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠΈ. ΠΡΠ»ΠΎ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΈΡ ΠΏΡΠΎΡΡΠΎ ΠΊΠ°ΠΊ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠ΅ ΡΠ»ΡΡΠ°ΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ ΠΈΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ.
Π’ΡΠ΅Π±ΡΠ΅ΠΌΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π²Π»ΠΈΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π½Π° ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Relation ΠΈ Π΅Π΅ Π΄ΡΡΠ·Π΅ΠΉ. Π‘ΠΏΠ΅ΡΠ²Π°, Π½Π°ΠΌ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΡΡΡΡ Π΅ΡΠ΅ Π΄Π²Π΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°:
{β}
{ Set D0 If Compare was <= }
procedure SetLessOrEqual;
begin
EmitLn('SGE D0');
EmitLn('EXT D0');
end;
{β}
{ Set D0 If Compare was >= }
procedure SetGreaterOrEqual;
begin
EmitLn('SLE D0');
EmitLn('EXT D0');
end;
{β}
ΠΠ°ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π½ΠΈΠΆΠ΅:
{β}
{ Recognize and Translate a Relational Β«Less Than or EqualΒ» }
procedure LessOrEqual;
begin
Match('=');
Expression;
PopCompare;
SetLessOrEqual;
end;
{β}
{ Recognize and Translate a Relational Β«Not EqualsΒ» }
procedure NotEqual;
begin
Match('>');
Expression;
PopCompare;
SetNEqual;
end;
{β}
{ Recognize and Translate a Relational Β«Less ThanΒ» }
procedure Less;
begin
Match('<');
case Look of
'=': LessOrEqual;
'>': NotEqual;
else begin
Expression;
PopCompare;
SetLess;
end;
end;
end;
{β}
{ Recognize and Translate a Relational Β«Greater ThanΒ» }
procedure Greater;
begin
Match('>');
if Look = '=' then begin
Match('=');
Expression;
PopCompare;
SetGreaterOrEqual;
end
else begin
Expression;
PopCompare;
SetGreater;
end;
end;
{β}
ΠΡΠΎ Π²ΡΠ΅, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ. Π’Π΅ΠΏΠ΅ΡΡ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ. ΠΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅.
ΠΠ²ΠΎΠ΄/ΠΡΠ²ΠΎΠ΄
Π’Π΅ΠΏΠ΅ΡΡ Ρ Π½Π°Ρ Π΅ΡΡΡ ΠΏΠΎΠ»Π½ΡΠΉ, ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΡΠ·ΡΠΊ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠ³ΠΎ ΡΠΌΡΡΠ°ΡΡΠ΅Π³ΠΎ ΡΠ°ΠΊΡΠ°: Ρ Π½Π°Ρ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΏΠΎΡΠΎΠ±Π° ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ»ΠΈ Π²ΡΠ²Π΅ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅. ΠΠ°ΠΌ Π½ΡΠΆΠ½Ρ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°.
Π‘ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅, ΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½Π½ΠΎΠ΅ Π² C ΠΈ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½Π½ΠΎΠ΅ Π² Ada ΠΈ Modula-2, ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π²ΡΠ²Π΅ΡΡΠΈ I/O ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΠ· ΡΠ°ΠΌΠΎΠ³ΠΎ ΡΠ·ΡΠΊΠ° ΠΈ ΠΏΡΠΎΡΡΠΎ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΈΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. ΠΡΠΎ Π±ΡΠ»ΠΎ Π±Ρ ΠΏΡΠ΅ΠΊΡΠ°ΡΠ½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΌΡ ΠΏΠΎΠΊΠ° Π½Π΅ ΠΈΠΌΠ΅Π΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΡΡΠ΅Π΄ΡΡΠ² ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ. Π Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, Ρ ΡΡΠΈΠΌ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΠΎΠΌ Π²Ρ ΡΡΠΎΠ»ΠΊΠ½Π΅ΡΠ΅ΡΡ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ ΡΠΏΠΈΡΠΊΠ° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ². Π ΠΠ°ΡΠΊΠ°Π»Π΅ I/O ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Π²ΡΡΡΠΎΠ΅Π½Ρ Π² ΡΠ·ΡΠΊ, ΠΏΠΎΡΡΠΎΠΌΡ ΡΡΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ, Π΄Π»Ρ ΠΊΠΎΡΠΎΡΡΡ ΡΠΏΠΈΡΠΎΠΊ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ ΠΈΠΌΠ΅ΡΡ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ². Π C ΠΌΡ ΠΏΡΠΈΠΌΠΈΡΡΠ΅ΠΌΡΡ Ρ ΠΊΠ»ΡΠ΄ΠΆΠ°ΠΌΠΈ ΡΠΈΠΏΠ° scanf ΠΈ printf ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°ΡΡ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΎΠ² Π² Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ. Π Ada ΠΈ Modula-2 ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π½Π΅ΡΠ΄ΠΎΠ±Π½ΡΠΉ (ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΉ!) ΡΠΏΠΎΡΠΎΠ± ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠ³ΠΎ Π²ΡΠ·ΠΎΠ²Π° Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
Π’Π°ΠΊ ΡΡΠΎ Ρ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠΈΡΠ°Ρ ΠΠ°ΡΠΊΠ°Π»Π΅Π²ΡΠΊΠΈΠΉ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ Π²ΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π²Π²ΠΎΠ΄Π°/Π²ΡΠ²ΠΎΠ΄Π°, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ ΠΌΡ Π½Π΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌΡΡ Π² ΡΡΠΎΠΌ.
ΠΠ°ΠΊ ΠΎΠ±ΡΡΠ½ΠΎ, Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½Ρ Π΅ΡΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°. ΠΠ½ΠΈ, ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΠ°ΠΌΡΠ΅ ΠΏΡΠΎΡΡΡΠ΅ ΠΈΠ· Π²ΡΠ΅Ρ , ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ Π²ΡΠ΅, ΡΡΠΎ ΠΌΡ Π΄Π΅Π»Π°Π΅ΠΌ ΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π΄Π»Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΡΠ°Π±ΠΎΡΡ.
{β}
{ Read Variable to Primary Register }
procedure ReadVar;
begin
EmitLn('BSR READ');
Store(Value);
end;
{β}
{ Write Variable from Primary Register }
procedure WriteVar;
begin
EmitLn('BSR WRITE');
end;
{β}
ΠΠ΄Π΅Ρ ΡΠΎΡΡΠΎΠΈΡ Π² ΡΠΎΠΌ, ΡΡΠΎ READ Π·Π°Π³ΡΡΠΆΠ°Π΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° Π² D0, Π° WRITE Π²ΡΠ²ΠΎΠ΄ΠΈΡ Π΅Π³ΠΎ ΠΎΡΡΡΠ΄Π°.
ΠΡΠΈ Π΄Π²Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΡΡ ΡΠΎΠ±ΠΎΠΉ Π½Π°ΡΡ ΠΏΠ΅ΡΠ²ΡΡ Π²ΡΡΡΠ΅ΡΡ Ρ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΡΠ½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°Ρ ... ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°Ρ Run Time Library (RTL). ΠΠΎΠ½Π΅ΡΠ½ΠΎ ΠΊΡΠΎ-ΡΠΎ (Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΌΡ) Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΡΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π½ΠΎ ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡΡΡΡ Π½Π΅ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΡΡΡΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. Π― Π΄Π°ΠΆΠ΅ Π½Π΅ Π±ΡΠ΄Ρ Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡΡΡΡ ΠΎ ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π·Π΄Π΅ΡΡ ΡΡΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ΠΈ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ ΠΎΡΠ΅Π½Ρ ΠΠ‘-Π·Π°Π²ΠΈΡΠΈΠΌΡ. Π― ΠΏΡΠΎΡΡΠΎ ΡΠΊΠ°ΠΆΡ, ΡΡΠΎ Π΄Π»Ρ SK*DOS ΠΎΠ½ΠΈ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎ ΠΏΡΠΎΡΡΡ... ΠΏΠΎΡΡΠΈ ΡΡΠΈΠ²ΠΈΠ°Π»ΡΠ½Ρ. ΠΠ΄Π½Π° ΠΈΠ· ΠΏΡΠΈΡΠΈΠ½, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ Ρ Π½Π΅ Π±ΡΠ΄Ρ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ ΠΈΡ Π·Π΄Π΅ΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π½ΠΎΠ²ΡΠ΅ Π²ΠΈΠ΄Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΏΡΠΈΠ³Π»Π°ΡΠ΅Π½ΠΈΠ΅ Π² READ ΠΈΠ»ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ ΠΏΠΎΠ²ΡΠΎΡΠΈΡΡ ΠΎΡΠΈΠ±ΠΎΡΠ½ΡΠΉ Π²Π²ΠΎΠ΄.