ΠΠ΄Π½Π°ΠΊΠΎ, ΠΈΠ·-Π·Π° ΡΠΎΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅ΠΏΠΈΡΡΠ²Π°Π½ΠΈΡ ΠΌΠΎΠ΄ΡΠ»Π΅ΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° Ρ Π½Π΅ Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ Π²ΠΊΠ»ΡΡΠΈΡΡ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π² ΠΏΠΎΡΠ»Π΅Π΄Π½ΡΡ Π³Π»Π°Π²Ρ. ΠΠ·-Π·Π° ΡΡΠΎΠ³ΠΎ Π½Π°Ρ Π³Π΅ΡΠΎΠΉ, ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ°Π· Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π±ΡΠ» ΡΠΎΠ»ΡΠΊΠΎ ΡΠ΅Π½ΡΡ ΡΠ΅Π±Ρ ΠΏΡΠ΅ΠΆΠ½Π΅Π³ΠΎ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΡΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ΄, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΡΠΉ Π΄Π»Ρ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΠΎΡΡΠΎΡΡΠ΅Π³ΠΎ ΠΈΠ»ΠΈ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ. ΠΡΠ½ΠΎΠ²Π½ΡΠΌ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΡΡΠΎΠΉ ΡΠ΅ΠΊΡΡΠ΅ΠΉ Π³Π»Π°Π²Ρ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡΠ°ΡΡ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ° Π² Π΅Π³ΠΎ ΠΏΡΠ΅ΠΆΠ½Π΅ΠΉ ΡΠ»Π°Π²Π΅. Π ΡΡΠΎΠΌ ΠΏΡΠΎΡΠ΅ΡΡΠ΅, Ρ Π½Π°Π΄Π΅ΡΡΡ, Π²Ρ Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ΡΠΏΠ΅Π»ΠΈΠ²Ρ, Π΅ΡΠ»ΠΈ ΠΌΡ ΠΈΠ½ΠΎΠ³Π΄Π° Π±ΡΠ΄Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΎΡΠ½ΠΎΠ²Ρ, Ρ ΠΊΠΎΡΠΎΡΡΠ΅ ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ ΠΈ Π΄Π°Π²Π½ΠΎ ΡΠΆΠ΅ ΠΏΡΠΎΡΠ»ΠΈ.
Π‘Π½Π°ΡΠ°Π»Π°, Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΠΎΠ·Π°Π±ΠΎΡΠΈΠΌΡΡ ΠΎ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΊ ΠΊΠΎΡΠΎΡΠΎΠΉ ΠΌΡ ΠΎΠ±ΡΠ°ΡΠ°Π»ΠΈΡΡ ΠΏΡΠ΅ΠΆΠ΄Π΅: Π½Π°ΡΠ° ΡΠ΅ΠΊΡΡΠ°Ρ Π²Π΅ΡΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Factor, ΠΊΠ°ΠΊ ΠΌΡ ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ Π΅Π΅ Π² ΠΠ»Π°Π²Π΅ 15, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΎΡΡΠΈΡΠ°ΡΠ΅Π»ΡΠ½ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. Π§ΡΠΎΠ±Ρ ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎ ΠΌΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΠΌ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ SignedFactor:
{β}
{ Parse and Translate a Factor with Optional Sign }
procedure SignedFactor;
var Sign: char;
begin
Sign := Look;
if IsAddop(Look) then
GetChar;
Factor;
if Sign = '-' then Negate;
end;
{β}
ΠΠ°ΠΌΠ΅ΡΡΡΠ΅, ΡΡΠΎ ΡΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π½ΠΎΠ²ΡΡ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° Negate:
{β}
{ Negate Primary }
procedure Negate;
begin
EmitLn('NEG D0');
end;
{β}
(ΠΠ΄Π΅ΡΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ Π² ΡΡΠΎΠΉ ΡΠ΅ΡΠΈΠΈ Ρ ΡΠΎΠ±ΠΈΡΠ°ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡ Π²Π°ΠΌ Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ. Π― ΡΠ°ΡΡΡΠΈΡΡΠ²Π°Ρ, ΡΡΠΎ Π²Ρ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠΈΠΉ ΠΌΠΎΠ΄ΡΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±Π΅Π· ΠΏΡΠΎΠ±Π»Π΅ΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ. ΠΠ΅ Π·Π°Π±ΡΠ²Π°ΠΉΡΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π² ΡΠ°Π·Π΄Π΅Π» interface ΠΌΠΎΠ΄ΡΠ»Ρ.)
Π ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ·ΠΎΠ² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Factor Π½Π° SignedFactor ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΡΠΉΡΠ΅ ΠΊΠΎΠ΄. Π Π°Π·Π²Π΅ Π½Π΅ Ρ ΠΎΡΠΎΡΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊ Turbo ΠΈ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ make ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π²ΡΠ΅ Π΄Π΅ΡΠ°Π»ΠΈ?
ΠΠ°, Ρ Π·Π½Π°Ρ, ΠΊΠΎΠ΄ Π½Π΅ ΠΎΡΠ΅Π½Ρ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π΅Π½. ΠΡΠ»ΠΈ ΠΌΡ Π²Π²Π΅Π΄Π΅ΠΌ ΡΠΈΡΠ»ΠΎ -3 Π±ΡΠ΄Π΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½ ΡΠ°ΠΊΠΎΠΉ ΠΊΠΎΠ΄:
MOVE #3,D0
NEG D0
ΡΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π³ΡΡΠ±ΠΎ. ΠΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ Π»ΡΡΡΠ΅, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π·Π½Π°ΠΊ ΠΌΠΈΠ½ΡΡ ΠΊ ΡΡΡΠΎΠΊΠ΅, ΠΏΠ΅ΡΠ΅Π΄Π°Π²Π°Π΅ΠΌΠΎΠΉ Π² LoadConstant, Π½ΠΎ ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠΎΠΊ ΠΊΠΎΠ΄Π° Π² SignedFactor ΠΈ Π·Π΄Π΅ΡΡ Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΡ ΡΠΈΠ»ΠΎΡΠΎΡΠΈΡ KISS ΠΎΡΠ΅Π½Ρ Π°Π³ΡΠ΅ΡΡΠΈΠ²Π½ΠΎ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΡΠΊΠ°Π·Π°ΡΡ ΠΏΡΠ°Π²Π΄Ρ, Ρ Π΄ΡΠΌΠ°Ρ ΡΡΠΎ ΠΏΠΎΠ΄ΡΠΎΠ·Π½Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΡΠ»Π°ΠΆΠ΄Π°ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠ΅ΠΉ Β«Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π³ΡΡΠ±ΠΎΠ³ΠΎΒ» ΠΊΠΎΠ΄Π°, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΠΈΠΌΠ΅ΡΡ ΡΠ΄ΠΎΠ²ΠΎΠ»ΡΡΡΠ²ΠΈΠ΅ Π½Π°Π±Π»ΡΠ΄Π°ΡΡ ΠΊΠ°ΠΊ ΠΎΠ½ Π±ΡΠ΄Π΅Ρ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡΡ Π΄ΡΠ°ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π»ΡΡΡΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΠΌΡΡ Π·Π° ΠΌΠ΅ΡΠΎΠ΄Ρ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ.
ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· Π²Π°Ρ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ ΡΠ»ΡΡΠ°Π»ΠΎ ΠΎ ΠΠΆΠΎΠ½Π΅ Π‘ΠΏΡΠ΅Π΅, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΠ΅ ΠΌΠ½Π΅ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ Π΅Π³ΠΎ Π²Π°ΠΌ Π·Π΄Π΅ΡΡ. ΠΠΆΠΎΠ½ ΠΈΠ· ΠΠΎΠ²ΠΎΠΉ ΠΠ΅Π»Π°Π½Π΄ΠΈΠΈ ΠΈ ΠΏΡΠ΅ΠΏΠΎΠ΄Π°Π΅Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΊΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Π΅Π΅ ΡΠ½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠΎΠ². ΠΠΆΠΎΠ½ Π½Π°ΠΏΠΈΡΠ°Π» ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π΄Π»Ρ Motorola 6809, ΠΎΡΠ½ΠΎΠ²Π°Π½Π½ΡΠΉ Π½Π° Π²ΠΎΡΡ ΠΈΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠΌ, ΠΠ°ΡΠΊΠ°Π»Ρ-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΌ ΡΠ·ΡΠΊΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΈ, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΌ Β«WhimsicalΒ». ΠΠΎΠ·Π΄Π½Π΅Π΅ ΠΎΠ½ ΠΏΠ΅ΡΠ΅Π½Π΅Ρ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ Π½Π° 68000 ΠΈ Π½Π΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΡΡΠΎ Π±ΡΠ» Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΡΠΉ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Ρ ΠΈΠΌΠ΅Π» Π΄Π»Ρ ΡΠ²ΠΎΠ΅ΠΉ Π΄ΠΎΠΌΠΎΡΠΎΡΠ΅Π½Π½ΠΎΠΉ ΡΠΈΡΡΠ΅ΠΌΡ Π½Π° 68000.
Π ΡΠ»ΠΎΠ²Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΠΎΠ΄ΠΈΠ½ ΠΈΠ· ΠΌΠΎΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π»Ρ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° β ΠΈΠ·ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΡΠ°Π±ΠΎΡΠ°Π΅Ρ Ρ ΠΏΡΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΎΠΉ ΡΠΈΠΏΠ°:
program main;
begin
end.
ΠΠΎΠΉ ΡΠ΅ΡΡ ΠΈΠ·ΠΌΠ΅ΡΡΠ΅Ρ Π²ΡΠ΅ΠΌΡ, ΡΡΠ΅Π±ΡΠ΅ΠΌΠΎΠ΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ ΠΈ ΡΠ²ΡΠ·ΡΠ²Π°Π½ΠΈΠ΅ ΠΈ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°. ΠΠ΅ΡΡΠΏΠΎΡΠ½ΡΠΉ ΠΏΡΠΎΠΈΠ³ΡΠ°Π²ΡΠΈΠΉ Π² ΡΡΠΎΠΌ ΡΠ΅ΡΡΠ΅ β ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ DEC C Π΄Π»Ρ VAX, ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΠ°ΡΠΈΡ 60 ΡΠ΅ΠΊΡΠ½Π΄ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π½Π° VAX 11/780 ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΡΠΉ ΡΠ°ΠΉΠ» 50k. ΠΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡ ΠΠΆΠΎΠ½Π° Π±Π΅ΡΡΠΏΠΎΡΠ½ΠΎ ΡΠ΅ΠΉΡΠ°Ρ, Π² Π±ΡΠ΄ΡΡΠ΅ΠΌ ΠΈ Π½Π°Π²ΡΠ΅Π³Π΄Π° ΠΊΠΎΡΠΎΠ»Ρ ΠΏΠΎ ΡΠ°ΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ° ΠΊΠΎΠ΄Π°. ΠΠ»Ρ Π΄Π°Π½Π½ΠΎΠΉ ΠΏΡΡΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ Whimsical Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΡΠΎΡΠ½ΠΎ Π΄Π²Π° Π±Π°ΠΉΡΠ°, ΡΠ΅Π°Π»ΠΈΠ·ΡΡ ΠΎΠ΄Π½Ρ ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡ:
RET
Π£ΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Ρ ΠΎΠΏΡΠΈΡ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΠ° Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ include ΡΠ°ΠΉΠ» Π° Π½Π΅ Π°Π²ΡΠΎΠ½ΠΎΠΌΠ½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΠΆΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ Π΄Π°ΠΆΠ΅ ΡΡΠ΅Π·Π°ΡΡ ΡΡΠΎΡ ΡΠ°Π·ΠΌΠ΅Ρ Ρ Π΄Π²ΡΡ Π±Π°ΠΉΡ Π΄ΠΎ Π½ΡΠ»Ρ! ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΡΡΠ΄Π½ΠΎ Π΄ΠΎΠ±ΠΈΡΡΡΡ Π½ΡΠ»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°, Π²Ρ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠ½Ρ?
Π‘Π°ΠΌΠΎ ΡΠΎΠ±ΠΎΠΉ ΡΠ°Π·ΡΠΌΠ΅Π΅ΡΡΡ, ΡΡΠΎ Ρ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΠΠΆΠΎΠ½Π° ΠΊΠ°ΠΊ ΡΠΊΡΠΏΠ΅ΡΡΠ° Π² ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΈ ΠΌΠ½Π΅ Π½ΡΠ°Π²ΠΈΡΡΡ ΡΡΠΎ ΠΎΠ½ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ ΡΠΊΠ°Π·Π°Π»: Β«ΠΡΡΡΠΈΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠΈ β Π½Π΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠΎΠ²Π°ΡΡ Π²ΠΎΠΎΠ±ΡΠ΅, Π° ΠΈΠ·Π½Π°ΡΠ°Π»ΡΠ½ΠΎ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Ρ ΠΎΡΠΎΡΠΈΠΉ ΠΊΠΎΠ΄Β». Π‘Π»ΠΎΠ²Π°, ΠΏΠΎ ΠΊΠΎΡΠΎΡΡΠΌ ΡΡΠΎΠΈΡ ΠΆΠΈΡΡ. ΠΠΎΠ³Π΄Π° ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΡ ΠΌΡ Π±ΡΠ΄Π΅ΠΌ ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΡ ΡΠ²Π΅Π΄ΠΎΠΌΠ»Π΅Π½ΠΈΡ ΠΠΆΠΎΠ½Π° ΠΈ Π½Π°ΡΠΈΠΌ ΠΏΠ΅ΡΠ²ΡΠΌ ΡΠ°Π³ΠΎΠΌ Π±ΡΠ΄Π΅Ρ Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»Π΅Π²ΠΎΠ³ΠΎ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΎΡΠ° ΠΈΠ»ΠΈ Π΄ΡΡΠ³ΠΎΠ³ΠΎ ΠΏΠΎΡΡΡΠ°ΠΊΡΠ½ΠΎΠ³ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²Π°, Π½ΠΎ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²Π° Π²ΡΠ΄Π°Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΠ΅ΡΠ΅Π΄ ΠΎΠΏΡΠΈΠΌΠΈΠ·Π°ΡΠΈΠ΅ΠΉ. ΠΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΌΠ΅ΡΡΡΠ΅ SignedFactor ΠΊΠ°ΠΊ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Ρ ΠΎΡΠΎΡΠ΅Π³ΠΎ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠ° Π½Π° Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΈ ΠΏΠΎΠΊΠ° ΠΎΡΡΠ°Π²ΠΈΠΌ Π΅Π³ΠΎ.
Π’Π΅ΡΠΌΡ ΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ
Π― ΡΠ²Π΅ΡΠ΅Π½ Π²Ρ Π·Π½Π°Π΅ΡΠ΅, ΡΡΠΎ Π±ΡΠ΄Π΅Ρ Π΄Π°Π»ΡΡΠ΅. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΅ΡΠ΅ ΡΠ°Π· ΡΠΎΠ·Π΄Π°ΡΡ ΠΎΡΡΠ°Π»ΡΠ½ΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ, ΠΊΠΎΡΠΎΡΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ· Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠΎ ΠΌΠ΅ΡΠΎΠ΄Ρ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΠΎΠ³ΠΎ ΡΠΏΡΡΠΊΠ°. ΠΡΠ΅ ΠΌΡ Π·Π½Π°Π΅ΠΌ, ΡΡΠΎ ΠΈΠ΅ΡΠ°ΡΡ ΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΡΠ°ΠΊΠ°Ρ:
Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅
ΡΠ΅ΡΠΌ
ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ
ΠΠ΄Π½Π°ΠΊΠΎ ΡΠ΅ΠΉΡΠ°Ρ Π΄Π°Π²Π°ΠΉΡΠ΅ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠΈΠΌ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠΎ ΡΠ°Π³Π°ΠΌ ΠΈ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ ΡΠΎΠ»ΡΠΊΠΎ Ρ Π°Π΄Π΄ΠΈΡΠΈΠ²Π½ΡΠΌΠΈ ΡΠ΅ΡΠΌΠ°ΠΌΠΈ. ΠΠΎΠ΄ Π΄Π»Ρ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ²ΡΠΉ ΡΠ΅ΡΠΌ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ, ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅:
{β}
{ Parse and Translate an Expression }
procedure Expression;
begin
SignedFactor;
while IsAddop(Look) do
case Look of
'+': Add;
'-': Subtract;
end;
end;
{β}
ΠΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Π²ΡΠ·ΡΠ²Π°Π΅Ρ Π΄Π²Π΅ Π΄ΡΡΠ³ΠΈΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π΄Π»Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ:
{β}
{ Parse and Translate an Addition Operation }
procedure Add;
begin
Match('+');
Push;
Factor;
PopAdd;
end;
{β}
{ Parse and Translate a Subtraction Operation }
procedure Subtract;
begin
Match('-');
Push;
Factor;
PopSub;
end;
{β}
ΠΡΠΈ ΡΡΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Push, PopAdd ΠΈ PopSub β Π½ΠΎΠ²ΡΠ΅ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°. ΠΠ°ΠΊ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅Ρ ΠΈΠΌΡ, ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Push Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΊΠΎΠ΄ Π΄Π»Ρ ΠΏΠΎΠΌΠ΅ΡΠ΅Π½ΠΈΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠ° (D0 Π² Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π΄Π»Ρ 68000) Π² ΡΡΠ΅ΠΊ. PopAdd ΠΈ PopSub Π²ΡΡΠ°Π»ΠΊΠΈΠ²Π°ΡΡ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ° ΠΈ ΠΏΡΠΈΠ±Π°Π²Π»ΡΡΡ ΠΈΠ»ΠΈ Π²ΡΡΠΈΡΠ°ΡΡ Π΅Π΅ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠ°. ΠΠΎΠ΄ ΠΏΠΎΠΊΠ°Π·Π°Π½ Π½ΠΈΠΆΠ΅:
{β}
{ Push Primary to Stack }
procedure Push;
begin
EmitLn('MOVE D0,-(SP)');
end;
{β}
{ Add TOS to Primary }
procedure PopAdd;
begin
EmitLn('ADD (SP)+,D0');
end;
{β}
{ Subtract TOS from Primary }
procedure PopSub;
begin
EmitLn('SUB (SP)+,D0');
Negate;
end;
{β}
ΠΠΎΠ±Π°Π²ΡΡΠ΅ ΡΡΠΈ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π² Parser ΠΈ CodeGen ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π° Expression. ΠΡΠ°Π»Ρ!
Π‘Π»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π±ΠΎΡΡ Ρ ΠΌΡΠ»ΡΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠ²Π½ΡΠΌΠΈ ΡΠ΅ΡΠΌΠ°ΠΌΠΈ. Π‘ ΡΡΠΎΠΉ ΡΠ΅Π»ΡΡ ΠΌΡ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Term ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° PopMul ΠΈ PopDiv. ΠΡΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ Π½ΠΈΠΆΠ΅:
{β}
{ Multiply TOS by Primary }
procedure PopMul;
begin
EmitLn('MULS (SP)+,D0');
end;
{β}
{ Divide Primary by TOS }
procedure PopDiv;
begin
EmitLn('MOVE (SP)+,D7');
EmitLn('EXT.L D7');
EmitLn('DIVS D0,D7');
EmitLn('MOVE D7,D0');
end;
{β}
Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡΠΈΠ·Π½Π°ΡΡ, ΡΡΠΎ ΠΏΠΎΠ΄ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π΄Π΅Π»Π΅Π½ΠΈΡ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ΅ΡΠ΅Π³ΡΡΠΆΠ΅Π½Π°, Π½ΠΎ Ρ ΡΡΠΈΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅Π»ΡΠ·Ρ ΠΏΠΎΠ΄Π΅Π»Π°ΡΡ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, Ρ ΠΎΡΡ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡ 68000 ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡ Π²Π΅ΡΡΠΈΠ½Ρ ΡΡΠ΅ΠΊΠ° (TOS), ΠΎΠ½ ΡΡΠ΅Π±ΡΠ΅Ρ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ Π² Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎΠΌ ΠΏΠΎΡΡΠ΄ΠΊΠ΅, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΡΠΎΠΌΡ ΠΊΠ°ΠΊ Π΄Π»Ρ Π²ΡΡΠΈΡΠ°Π½ΠΈΡ. ΠΠΎΡΡΠΎΠΌΡ Π½Π°ΡΠ΅ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΡΠΏΠ°ΡΠ΅Π½ΠΈΠ΅ Π² ΡΠΎΠΌ ΡΡΠΎΠ±Ρ Π²ΡΡΠΎΠ»ΠΊΠ½ΡΡΡ ΡΡΠ΅ΠΊ Π² ΡΠ°Π±ΠΎΡΠΈΠΉ ΡΠ΅Π³ΠΈΡΡΡ (D7), Π²ΡΠΏΠΎΠ»Π½ΠΈΡΡ ΡΠ°ΠΌ Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΈ Π·Π°ΡΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎ Π² Π½Π°Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ ΡΠ΅Π³ΠΈΡΡΡ D0. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π½Π°ΠΊΠΎΠ²ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΡ. ΠΡΠΈΠΌ Π½Π΅ΡΠ²Π½ΠΎ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΡΡ ΡΡΠΎ Π²ΡΠ΅ Π½Π°ΡΠΈ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π±ΡΠ΄ΡΡ 16-ΡΠ°Π·ΡΡΠ΄Π½ΡΠΌΠΈ ΡΠ΅Π»ΡΠΌΠΈ ΡΠΈΡΠ»Π°ΠΌΠΈ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ. ΠΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π·Π°ΡΡΠΎΠ½Π΅Ρ Π½Π°Ρ ΠΏΠΎΠ·Π΄Π½Π΅Π΅, ΠΊΠΎΠ³Π΄Π° ΠΌΡ Π½Π°ΡΠ½Π΅ΠΌ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΡΠΈΠΏΡ Π΄Π°Π½Π½ΡΡ , ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΈΠΏΠΎΠ² ΠΈ Ρ.ΠΏ.
ΠΠ°ΡΠ° ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° Term ΡΡΠΎ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π°Π½Π°Π»ΠΎΠ³ Expression ΠΈ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ ΡΠ°ΠΊ:
{β}
{ Parse and Translate a Term }
procedure Term;
begin
Factor;
while IsMulop(Look) do
case Look of
'*': Multiply;
'/': Divide;
end;
end;
{β}
ΠΠ°Ρ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ ΡΠ°Π³ β ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΈΠΌΠ΅Π½. SignedFactor ΡΠ΅ΠΏΠ΅ΡΡ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ SignedTerm Π° Π²ΡΠ·ΠΎΠ²Ρ Factor Π² Expression, Add, Subtract ΠΈ SignedTerm Π·Π°ΠΌΠ΅Π½ΡΡΡΡΡ Π½Π° Π²ΡΠ·ΠΎΠ² Term:
{β}
{ Parse and Translate a Term with Optional Leading Sign }
procedure SignedTerm;
var Sign: char;
begin
Sign := Look;
if IsAddop(Look) then
GetChar;
Term;
if Sign = '-' then Negate;
end;
{β}
...
{β}
{ Parse and Translate an Expression }
procedure Expression;
begin
SignedTerm;
while IsAddop(Look) do
case Look of
'+': Add;
'-': Subtract;
end;
end;
{β}
ΠΡΠ»ΠΈ ΠΏΠ°ΠΌΡΡΡ ΠΌΠ½Π΅ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΌΡ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ ΡΠΆΠ΅ ΠΈΠΌΠ΅Π»ΠΈ ΠΈ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ SignedFactor ΠΈ SignedTerm. Π£ ΠΌΠ΅Π½Ρ Π±ΡΠ»ΠΈ ΠΏΡΠΈΡΠΈΠ½Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΠ°ΠΊ Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ... ΠΎΠ½ΠΈ ΠΈΠΌΠ΅Π»ΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ ΠΊ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ Π±ΡΠ»Π΅Π²ΠΎΠΉ Π°Π»Π³Π΅Π±ΡΡ ΠΈ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Π±ΡΠ»Π΅Π²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ Β«notΒ». ΠΠΎ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ, Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π½Π΅ Π½ΡΠΆΠ½ΠΎ. Π Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΈ ΡΠΈΠΏΠ°:
βx*y
ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎ, ΡΡΠΎ Π·Π½Π°ΠΊ ΠΈΠ΄Π΅Ρ ΡΠΎ Π²ΡΠ΅ΠΌ ΡΠ΅ΡΠΌΠΎΠΌ x*y Π° Π½Π΅ ΠΏΡΠΎΡΡΠΎ Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ x ΠΈ ΡΠ°ΠΊΠΈΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Expression ΠΈ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½.
ΠΡΠΎΡΠ΅ΡΡΠΈΡΡΠΉΡΠ΅ ΡΡΠΎΡ Π½ΠΎΠ²ΡΠΉ ΠΊΠΎΠ΄, Π²ΡΠΏΠΎΠ»Π½ΠΈΠ² Main. ΠΠ½Π° Π²ΡΠ΅ Π΅ΡΠ΅ Π²ΡΠ·ΡΠ²Π°Π΅Ρ Expression, ΡΠ°ΠΊ ΡΡΠΎ ΡΠ΅ΠΏΠ΅ΡΡ Π²Ρ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Π½Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡΠΌΠΈ, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΌΠΈ Π»ΡΠ±ΡΡ ΠΈΠ· ΡΠ΅ΡΡΡΠ΅Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ.
ΠΠ°ΡΠ΅ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π΅ Π΄Π΅Π»ΠΎ, ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ, ΡΡΠΎ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Factor Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ . ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΡΠ΅ΠΊΡΡΡΠΈΠ²Π½ΡΠΉ Π²ΡΠ·ΠΎΠ² Expression ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΌΠ΅Π½ΡΡΠΈΡΡ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π΄ΠΎ Π½ΡΠ»Ρ. ΠΡΡΡ ΡΡΡΠΎΠΊ, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½ΡΠ΅ Π² Factor, Π²ΡΠΏΠΎΠ»Π½ΡΡ ΡΡΡ ΡΠ°Π±ΠΎΡΡ:
{β}
{ Parse and Translate a Factor }
procedure Factor;
begin
if Look ='(' then begin
Match('(');
Expression;
Match(')');
end
else if IsDigit(Look) then
LoadConstant(GetNumber)
else if IsAlpha(Look)then
LoadVariable(GetName)
else
Error('Unrecognized character ' + Look);
end;
{β}
Π ΡΡΠΎΠΌΡ ΠΌΠΎΠΌΠ΅Π½ΡΡ Π²Π°Ρ Β«ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΒ» Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΌΠ΅ΡΡ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ Π»ΡΠ±ΡΠ΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, ΠΊΠΎΡΠΎΡΡΠ΅ Π²Ρ Π΅ΠΌΡ ΠΏΠΎΠ΄Π±ΡΠΎΡΠΈΡΠ΅. ΠΡΠ΅ Π»ΡΡΡΠ΅, ΡΡΠΎ ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΊΠ»ΠΎΠ½ΠΈΡΡ Π²ΡΠ΅ Π½Π΅Π΄ΠΎΠΏΡΡΡΠΈΠΌΡΠ΅!
ΠΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ
ΠΠΎΠΊΠ° ΠΌΡ Π·Π΄Π΅ΡΡ, ΠΌΡ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ ΡΠ°ΠΊΠΆΠ΅ Π½Π°ΠΏΠΈΡΠ°ΡΡ ΠΊΠΎΠ΄ Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΡΠΌΠΈ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ. ΠΡΠΎΡ ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΡ ΠΈΠΌΡ ΠΊΠΎΠ½Π΅ΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π³Π΄Π΅ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ, Π²ΡΠ·Π²Π°ΡΡ Expression, Π·Π°ΡΠ΅ΠΌ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΡΠΈΡΠ»ΠΎ. ΠΡΠΎΡΠ΅Π΄ΡΡΠ° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Π΄Π°Π»ΡΡΠ΅: