ΠΡΠ°Π²ΠΈΠ»ΡΠ½Π΅ΠΉ Π±ΡΠ»ΠΎ Π±Ρ Π² ΡΡΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ ΠΏΡΠΎΡΡΠΎ ΡΠ°Π·Π΄Π΅Π»ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π²ΡΠ±ΠΎΡΠΊΠΈ ΡΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΠΏΠΎΠΈΡΠΊΠ° ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ². ΠΠ΅ΡΡΠΈΡ Scan, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Π°Ρ Π½ΠΈΠΆΠ΅, ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ ΠΎΠ½Π° ΠΎΠΏΠ΅ΡΠΈΡΡΠ΅Ρ ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠΎΠΊΠ΅Π½ΠΎΠΌ ΠΈ Π½Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ.
{β}
{ Scan the Current Identifier for Keywords }
procedure Scan;
begin
if Token = 'x' then
Token := KWcode[Lookup(Addr(KWlist), Value, NKW) + 1];
end;
{β}
ΠΠΎΡΠ»Π΅Π΄Π½ΡΡ Π΄Π΅ΡΠ°Π»Ρ. Π ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ΅ Π΅ΡΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΌΠ΅ΡΡ, Π² ΠΊΠΎΡΠΎΡΡΡ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΡ ΡΡΡΠΎΠΊΠΎΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠΊΠ΅Π½Π°. Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΡΠΎ ΡΠ΄Π΅Π»Π°Π½ΠΎ Π΄Π»Ρ ΡΠΎΠ³ΠΎ, ΡΡΠΎΠ±Ρ ΡΠ°Π·Π»ΠΈΡΠ°ΡΡ ΡΠ°Π·Π½ΡΠ΅ END, Π½ΠΎ Π΅ΡΡΡ ΠΈ ΠΏΠ°ΡΠ° Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΡ. (Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΌΠ΅ΡΠΈΡΡ, ΠΌΠ΅ΠΆΠ΄Ρ ΠΏΡΠΎΡΠΈΠΌ, ΡΡΠΎ ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ Π½Π°Π²ΡΠ΅Π³Π΄Π° ΡΡΡΡΠ°Π½ΠΈΡΡ ΠΏΠΎΡΡΠ΅Π±Π½ΠΎΡΡΡ Π² ΡΡΠ°Π²Π½Π΅Π½ΠΈΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² END ΠΊΠΎΠ΄ΠΈΡΡΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΠΈΠ· Π½ΠΈΡ ΡΠ°Π·Π»ΠΈΡΠ½ΡΠΌΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ. ΠΡΡΠΌΠΎ ΡΠ΅ΠΉΡΠ°Ρ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ ΠΈΠ΄Π΅ΠΌ ΠΌΠ°ΡΡΡΡΡΠΎΠΌ Π»Π΅Π½ΠΈΠ²ΠΎΠ³ΠΎ ΡΠ΅Π»ΠΎΠ²Π΅ΠΊΠ°.)
Π‘Π»Π΅Π΄ΡΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ MatchString Π·Π°ΠΌΠ΅ΡΠ°Π΅Ρ ΡΠΈΠΌΠ²ΠΎΠ»ΡΠ½ΠΎ-ΠΎΡΠΈΠ΅Π½ΡΠΈΡΠΎΠ²Π°Π½Π½ΡΡ Match. ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΠΊΠ°ΠΊ ΠΈ Match ΠΎΠ½Π° Π½Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ.
{β}
{ Match a Specific Input String }
procedure MatchString(x: string);
begin
if Value <> x then Expected('''' + x + '''');
Next;
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;
{β}
ΠΠ΅ Π·Π°Π±ΡΠ΄ΡΡΠ΅, ΡΡΠΎ Π½ΠΎΠ²Π°Ρ Π²Π΅ΡΡΠΈΡ Scan Π½Π΅ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°Π΅Ρ Π²Ρ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ, ΠΎΠ½Π° ΡΠΎΠ»ΡΠΊΠΎ ΡΠΊΠ°Π½ΠΈΡΡΠ΅Ρ ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π°. ΠΡ ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΎΠ΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΎΠΉ, ΠΊΠΎΡΠΎΡΡΡ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Block.
Π ΠΎΠ±ΡΠΈΡ ΡΠ΅ΡΡΠ°Ρ , ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΊΠ°ΠΆΠ΄ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Look Π½Π° Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Token. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ:
{β}
{ Parse and Translate a Boolean Expression }
procedure BoolExpression;
begin
BoolTerm;
while IsOrOp(Token) do begin
Push;
case Token of
'|': BoolOr;
'~': BoolXor;
end;
end;
end;
{β}
Π ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°Ρ ΡΠΈΠΏΠ° Add ΠΌΡ Π±ΠΎΠ»ΡΡΠ΅ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Match. ΠΠ°ΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΎΠ»ΡΠΊΠΎ Π²ΡΠ·ΡΠ²Π°ΡΡ Next Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°:
{β}
{ Recognize and Translate an Add }
procedure Add;
begin
Next;
Term;
PopAdd;
end;
{β}
Π£ΠΏΡΠ°Π²Π»ΡΡΡΠΈΠ΅ ΡΡΡΡΠΊΡΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠ΅. ΠΡ ΠΏΡΠΎΡΡΠΎ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ Next Π΄Π»Ρ ΠΏΡΠΎΠ΄Π²ΠΈΠΆΠ΅Π½ΠΈΡ ΡΠ΅ΡΠ΅Π· ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° ΡΠΏΡΠ°Π²Π»ΡΡΡΠΈΡ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΉ:
{β}
{ Recognize and Translate an IF Construct }
procedure Block; Forward;
procedure DoIf;
var L1, L2: string;
begin
Next;
BoolExpression;
L1 := NewLabel;
L2 := L1;
BranchFalse(L1);
Block;
if Token = 'l' then begin
Next;
L2 := NewLabel;
Branch(L2);
PostLabel(L1);
Block;
end;
PostLabel(L2);
MatchString('ENDIF');
end;
{β}
ΠΡΠΎ Π²ΡΠ΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ Tiny Version 1.1, Π΄Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅, Ρ ΡΠ°ΠΊΠΆΠ΅ ΡΠ΄Π΅Π»Π°Π» ΡΡΠ΄ Π΄ΡΡΠ³ΠΈΡ Β«ΡΡΠΎΠ²Π΅ΡΡΠ΅Π½ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠΉΒ», ΠΊΠΎΡΠΎΡΡΠ΅ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ Π½Π΅ Π½ΡΠΆΠ½Ρ. ΠΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅ ΠΊΡΠ°ΡΠΊΠΎ ΡΠ°Π·ΡΡΡΠ½ΠΈΡΡ ΠΈΡ :
1. Π― ΡΠ΄Π°Π»ΠΈΠ» Π΄Π²Π΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Prog ΠΈ Main ΠΈ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½ΠΈΠ» ΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅. ΠΠ½ΠΈ ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΠ»ΠΈ ΡΡΠ½ΠΎΡΡΠΈ... ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΎΠ½ΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π·Π°Π³ΡΡΠ·Π½ΡΠ»ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ.
2. Π― ΡΠ΄Π°Π»ΠΈΠ» ΠΊΠ»ΡΡΠ΅Π²ΡΠ΅ ΡΠ»ΠΎΠ²Π° PROGRAM ΠΈ BEGIN ΠΈΠ· ΡΠΏΠΈΡΠΊΠ° ΠΊΠ»ΡΡΠ΅Π²ΡΡ ΡΠ»ΠΎΠ². ΠΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· Π½ΠΈΡ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅, ΡΠ°ΠΊ ΡΡΠΎ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΠΈΡΠΊΠ°ΡΡ Π΅Π³ΠΎ.
3. ΠΠ±ΠΆΠ΅Π³ΡΠΈΡΡ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ Π½Π° ΡΡΠ΅Π·ΠΌΠ΅ΡΠ½ΠΎΠΉ Π΄ΠΎΠ·Π΅ ΡΠΎΠΎΠ±ΡΠ°Π·ΠΈΡΠ΅Π»ΡΠ½ΠΎΡΡΠΈ, Ρ Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠ» ΡΠ΅Π±Π΅, ΡΡΠΎ TINY ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½ Π±ΡΡΡ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΠΈΡΡΡΠΊΠΈΠΌ ΡΠ·ΡΠΊΠΎΠΌ. ΠΠΎΡΡΠΎΠΌΡ Ρ Π·Π°ΠΌΠ΅Π½ΠΈΠ» ΠΏΡΠΈΡΡΠ΄Π»ΠΈΠ²ΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΡΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΡΡΠ° Π½Π° ΡΠ°ΠΌΡΡ ΠΏΡΠΎΡΡΡΡ ΠΊΠ°ΠΊΡΡ ΠΌΠΎΠ³ ΠΏΡΠΈΠ΄ΡΠΌΠ°ΡΡ. ΠΠΈΠ³Π°Π½ΡΡΠΊΠΈΠΉ ΡΠ°Π³ Π½Π°Π·Π°Π΄ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΠΊΠΎΠ΄Π°, Π½ΠΎ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎΠ΅ ΡΠΏΡΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ°. ΠΠ»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ Π΄ΡΡΠ³ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΌ ΠΌΠ΅ΡΡΠΎΠΌ Π±ΡΠ» Π±Ρ KISS.
4. Π― Π΄ΠΎΠ±Π°Π²ΠΈΠ» Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ ΠΏΡΠΎΠ²Π΅ΡΠΎΠΊ ΠΎΡΠΈΠ±ΠΎΠΊ ΡΠΈΠΏΠ° CheckTable ΠΈ CheckDup ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠ» Π²ΡΡΡΠΎΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠ΄ Π½Π° ΠΈΡ Π²ΡΠ·ΠΎΠ²Ρ. ΠΡΠΎ Π½Π°Π²Π΅Π»ΠΎ ΠΏΠΎΡΡΠ΄ΠΎΠΊ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°Ρ .
5. Π― ΡΠ±ΡΠ°Π» ΠΏΡΠΎΠ²Π΅ΡΠΊΡ ΠΎΡΠΈΠ±ΠΎΠΊ ΠΈΠ· ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΡΠΈΠΏΠ° Store ΠΈ ΠΏΠΎΠΌΠ΅ΡΡΠΈΠ» ΠΈΡ Π² ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊ ΠΊΠΎΡΠΎΡΡΠΌ ΠΎΠ½ΠΈ ΠΎΡΠ½ΠΎΡΡΡΡΡ. Π‘ΠΌΠΎΡΡΠΈΡΠ΅ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Assignment.
6. Π‘ΡΡΠ΅ΡΡΠ²ΠΎΠ²Π°Π»Π° ΠΎΡΠΈΠ±ΠΊΠ° Π² InTable ΠΈ Locate ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΡΡΠ°Π²Π»ΡΠ»Π° ΠΈΡ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ Π²ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ Π²ΠΌΠ΅ΡΡΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π΄ΠΎΡΡΠΎΠ²Π΅ΡΠ½ΡΠΌΠΈ Π΄Π°Π½Π½ΡΠΌΠΈ. Π’Π΅ΠΏΠ΅ΡΡ ΠΎΠ½ΠΈ ΠΏΡΠΎΠ²Π΅ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ ΡΡΠ΅ΠΉΠΊΠΈ. ΠΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π°ΠΌ ΡΡΡΡΠ°Π½ΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ², ΠΊΠΎΡΠΎΡΠ°Ρ Π±ΡΠ»Π° Π² Init.
7. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° AddEntry ΡΠ΅ΠΏΠ΅ΡΡ ΠΈΠΌΠ΅Π΅Ρ Π΄Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ°, ΡΡΠΎ ΠΏΠΎΠΌΠΎΠ³Π°Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΌΠΎΠ΄ΡΠ»ΡΠ½ΠΎΠΉ.
8. Π― ΠΏΠΎΠ΄ΡΠΈΡΡΠΈΠ» ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π½ΠΎΠ²ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ CompareExpression ΠΈ NextExpression.
9. Π― ΡΡΡΡΠ°Π½ΠΈΠ» ΠΎΡΠΈΠ±ΠΊΡ Π² ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Read... ΡΡΠ°ΡΠ°Ρ Π²Π΅ΡΡΠΈΡ Π½Π΅ Π²ΡΠΏΠΎΠ»Π½ΡΠ»Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π° ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΡΡΡ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ.
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
ΠΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Tiny ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅. ΠΠ΅ ΡΡΠΈΡΠ°Ρ ΡΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° PROGRAM ΠΎΠ½ Π°Π½Π°Π»ΠΈΠ·ΠΈΡΡΠ΅Ρ ΡΠΎΡ ΠΆΠ΅ ΡΠ°ΠΌΡΠΉ ΡΠ·ΡΠΊ ΡΡΠΎ ΠΈ ΡΠ°Π½ΡΡΠ΅. ΠΠ½ ΠΏΡΠΎΡΡΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡΠΈΡΠ΅ ΠΈ, ΡΡΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄Π΅ΠΆΠ½ΡΠΉ. ΠΠ½ ΠΌΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ.
Π ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΡΡΠ³ΠΎΠ΅ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅: ΡΠΏΠ΅ΡΠ²Π° ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΡΠΎΡΠ΅ΠΊ Ρ Π·Π°ΠΏΡΡΠΎΠΉ ΠΈ Π²ΡΠ΅, ΡΡΠΎ ΠΏΡΠΈΠ²Π΅Π»ΠΎ ΠΌΠ΅Π½Ρ ΡΠ°ΠΊΠΎΠΌΡ Π±Π΅ΡΠΏΠΎΡΡΠ΄ΠΊΡ. ΠΠ°ΡΠ΅ΠΌ ΠΌΡ Π·Π°ΠΉΠΌΠ΅ΠΌΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°ΠΌΠΈ ΠΈ ΡΠΈΠΏΠ°ΠΌΠΈ. ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠ΅ΠΉ Π΄Π°Π»Π΅ΠΊΠΎ ΠΏΡΠΎΠ΄Π²ΠΈΠ½Π΅Ρ Π½Π°Ρ Π½Π° ΠΏΡΡΠΈ ΠΊ Π²ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ KISS ΠΈΠ· ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Β«ΠΈΠ³ΡΡΡΠ΅ΡΠ½ΡΡ ΡΠ·ΡΠΊΠΎΠ²Β». ΠΡ ΠΏΠΎΠ΄ΠΎΠ±ΡΠ°Π»ΠΈΡΡ ΠΎΡΠ΅Π½Ρ Π±Π»ΠΈΠ·ΠΊΠΎ ΠΊ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΡΠ΅ΡΡΠ΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ.
TINY VERSION 1.1{β}
program Tiny11;
{β}
{ Constant Declarations }
const TAB = ^I;
CR = ^M;
LF = ^J;
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 = 100;
var ST : array[1..MaxEntry] of Symbol;
SType: array[1..MaxEntry] of char;
{β}
{ Definition of Keywords and Token Types }
const NKW = 9;
NKW1 = 10;
const KWlist: array[1..NKW] of Symbol =
('IF', 'ELSE', 'ENDIF', 'WHILE', 'ENDWHILE',
'READ', 'WRITE', 'VAR', 'END');
const KWcode: string[NKW1] = 'xileweRWve';
{β}
{ 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;
{β}
{ Report an Undefined Identifier }
procedure Undefined(n: string);
begin
Abort('Undefined Identifier ' + n);
end;
{β}
{ Report a Duplicate Identifier }
procedure Duplicate(n: string);
begin
Abort('Duplicate Identifier ' + n);
end;
{β}
{ Check to Make Sure the Current Token is an Identifier }
procedure CheckIdent;
begin
if Token <> 'x' then Expected('Identifier');
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 ['|', '~'];
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, CR, LF];
end;
{β}
{ Skip Over Leading White Space }
procedure SkipWhite;
begin
while IsWhite(Look) do
GetChar;
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, NEntry);
end;
{β}
{ Look for Symbol in Table }
function InTable(n: Symbol): Boolean;
begin
InTable := Lookup(@ST, n, NEntry) <> 0;
end;
{β}
{ Check to See if an Identifier is in the Symbol Table }
{ Report an error if it's not. }
procedure CheckTable(N: Symbol);
begin
if not InTable(N) then Undefined(N);
end;
{β}
{ Check the Symbol Table for a Duplicate Identifier }
{ Report an error if identifier is already in table. }
procedure CheckDup(N: Symbol);
begin
if InTable(N) then Duplicate(N);
end;
{β}
{ Add a New Entry to Symbol Table }
procedure AddEntry(N: Symbol; T: char);
begin
CheckDup(N);
if NEntry = MaxEntry then Abort('Symbol Table Full');
Inc(NEntry);
ST[NEntry] := N;
SType[NEntry] := T;
end;
{β}
{ Get an Identifier }
procedure GetName;
begin
SkipWhite;
if Not IsAlpha(Look) then Expected('Identifier');
Token := 'x';
Value := '';
repeat
Value := Value + UpCase(Look);
GetChar;
until not IsAlNum(Look);
end;
{β}
{ Get a Number }
procedure GetNum;
begin
SkipWhite;
if not IsDigit(Look) then Expected('Number');
Token := '#';
Value := '';
repeat
Value := Value + Look;
GetChar;
until not IsDigit(Look);
end;
{β}
{ Get an Operator }
procedure GetOp;
begin
SkipWhite;
Token := Look;
Value := Look;
GetChar;
end;
{β}
{ Get the Next Input Token }
procedure Next;
begin
SkipWhite;
if IsAlpha(Look) then GetName
else if IsDigit(Look) then GetNum
else GetOp;
end;
{β}
{ Scan the Current Identifier for Keywords }
procedure Scan;
begin
if Token = 'x' then
Token := KWcode[Lookup(Addr(KWlist), Value, NKW) + 1];
end;
{β}
{ Match a Specific Input String }
procedure MatchString(x: string);
begin
if Value <> x then Expected('''' + x + '''');
Next;
end;
{β}
{ Output a String with Tab }
procedure Emit(s: string);