ΠΡΠ΅ ΡΡΠΎ ΡΠ»ΡΠΆΠΈΡ ΠΊΠ°ΠΊ ΠΎΠ±ΡΡΡΠ½Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΅Π³ΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°ΡΡ ΡΠΌΠ΅ΡΠ°Π½Π½ΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΈ: Ρ Π½Π΅ Π±ΡΠ΄Ρ Π΅Π΅ ΠΈΠ·Π±Π΅Π³Π°ΡΡ. ΠΠ»Ρ ΡΠ·ΡΠΊΠ°, ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π½ΠΎΠ³ΠΎ Π΄Π»Ρ ΡΠΈΡΡΠ΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΡΠ΅ΠΌ ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ», ΡΠ΅ΠΌ Π»ΡΡΡΠ΅. ΠΡΠ»ΠΈ Π²Ρ Π½Π΅ ΡΠΎΠ³Π»Π°ΡΠ½Ρ, ΠΈ Ρ ΠΎΡΠΈΡΠ΅ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π° ΡΠ°ΠΊΠΈΠ΅ ΡΡΠ»ΠΎΠ²ΠΈΡ, ΠΌΡ ΡΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ, ΠΊΠΎΠ³Π΄Π° Ρ Π½Π°Ρ Π±ΡΠ΄Π΅Ρ ΡΠ°Π±Π»ΠΈΡΠ° ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠΎΠ².
ΠΡΠ»Π΅Π²ΠΎ Β«ANDΒ»
Π‘ ΡΡΠΎ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΡΠΈΠ»ΠΎΡΠΎΡΠΈΠ΅ΠΉ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡΠΈΡΡΡΠΏΠΈΡΡ ΠΊ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Β«andΒ», ΠΊΠΎΡΠΎΡΡΠΉ ΠΏΠΎΠΉΠ΄Π΅Ρ Π² ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Term. Π Π½Π°ΡΡΠΎΡΡΠ΅ΠΌΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²Ρ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π±Π΅Π· ΠΌΠ΅Π½Ρ, Π½ΠΎ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π²ΠΎΡ ΠΊΠΎΠ΄:
Π Scanner:
{β}
function IsMulop(c: char): boolean;
begin
IsMulop := c in ['*','/', '&'];
end;
{β}
Π² Parser:
{β}
procedure Term;
begin
Factor;
while IsMulop(Look) do
case Look of
'*': Multiply;
'/': Divide;
'&': _And;
end;
end;
{β}
{ Parse and Translate a Boolean And Operation }
procedure _And;
begin
Match('&');
Push;
Factor;
PopAnd;
end;
{β}
ΠΈ Π² CodeGen:
{β}
{ And Primary with TOS }
procedure PopAnd;
begin
EmitLn('AND (SP)+,D0');
end;
{β}
ΠΠ°Ρ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ ΡΠ΅ΠΏΠ΅ΡΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°ΡΡ ΠΏΠΎΡΡΠΈ Π»ΡΠ±ΡΠ΅ Π²ΠΈΠ΄Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ Π° ΡΠ°ΠΊΠΆΠ΅ (Π΅ΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅) ΠΈ ΡΠΌΠ΅ΡΠ°Π½Π½ΡΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΡ.
ΠΠΎΡΠ΅ΠΌΡ Π½Π΅ Β«Π²ΡΠ΅ Π²ΠΈΠ΄Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉΒ»? ΠΠΎΡΠΎΠΌΡ ΡΡΠΎ ΠΏΠΎΠΊΠ° ΠΌΡ Π½Π΅ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»Π° Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ Β«notΒ» ΠΈ Ρ Π½ΠΈΠΌ Π²ΡΠ΅ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ»ΠΎΠΆΠ½Π΅Π΅. ΠΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Β«notΒ» ΠΊΠ°ΠΆΠ΅ΡΡΡ Π½Π° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄ ΠΈΠ΄Π΅Π½ΡΠΈΡΠ½ΡΠΌ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ ΡΠ½Π°ΡΠ½ΠΎΠΌΡ ΠΌΠΈΠ½ΡΡΡ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΠΎΠ΅ΠΉ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΌΡΡΠ»ΡΡ Π±ΡΠ»ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π³ΠΎ ΠΈΠ»ΠΈ, '~', Π΄ΡΠ±Π»ΠΈΡΠΎΠ²Π°ΡΡ ΡΠ½Π°ΡΠ½ΡΠΉ Β«notΒ». ΠΡΠΎ Π½Π΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ. ΠΡΠΈ ΠΌΠΎΠ΅ΠΉ ΠΏΠ΅ΡΠ²ΠΎΠΉ ΠΏΠΎΠΏΡΡΠΊΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ° SignedTerm ΠΏΡΠΎΡΡΠΎ ΡΡΠ΅Π΄Π°Π»Π° ΠΌΠΎΠΉ '~' ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ ΡΠΈΠΌΠ²ΠΎΠ» ΠΏΡΠΎΡ ΠΎΠ΄ΠΈΠ» ΠΏΡΠΎΠ²Π΅ΡΠΊΡ Π½Π° addop Π½ΠΎ SignedTerm ΠΈΠ³Π½ΠΎΡΠΈΡΠΎΠ²Π°Π» Π²ΡΠ΅ addop Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ "-". ΠΡΠ»ΠΎ Π±Ρ Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ ΠΏΡΠΎΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π΄ΡΡΠ³ΡΡ ΡΡΡΠΎΠΊΡ Π² SignedTerm, Π½ΠΎ ΡΡΠΎ Π²ΡΠ΅ ΡΠ°Π²Π½ΠΎ Π½Π΅ ΡΠ΅ΡΠΈΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ, ΠΏΠΎΡΠΎΠΌΡ ΡΡΠΎ, Π·Π°ΠΌΠ΅ΡΡΡΠ΅, Expression ΠΏΡΠΈΠ½ΠΈΠΌΠ°Π΅Ρ ΡΠ΅ΡΠΌ ΡΠΎ Π·Π½Π°ΠΊΠΎΠΌ ΡΠΎΠ»ΡΠΊΠΎ Π΄Π»Ρ ΠΏΠ΅ΡΠ²ΠΎΠ³ΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°.
ΠΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ, Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΈΠΏΠ°:
βa * -b
ΠΈΠΌΠ΅Π΅Ρ Π½Π΅Π±ΠΎΠ»ΡΡΠΎΠΉ ΠΈΠ»ΠΈ ΡΠΎΠ²ΡΠ΅ΠΌ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ ΡΠΌΡΡΠ»Π° ΠΈ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΠΌΠ΅ΡΠΈΡΡ Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΎΡΠΈΠ±ΠΊΡ. ΠΠΎ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠ΅Π΅ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Β«notΒ», ΠΈΠΌΠ΅Π΅Ρ ΡΠΎΡΠ½ΡΠΉ ΡΠΌΡΡΠ»:
not a and not b
Π ΡΠ»ΡΡΠ°Π΅ Ρ ΡΡΠΈΠΌΠΈ ΡΠ½Π°ΡΠ½ΡΠΌΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ Π²ΡΠ±ΠΎΡ Π·Π°ΡΡΠ°Π²ΠΈΡΡ ΠΈΡ ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΡΠ°ΠΌΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ ΠΊΠ°ΠΆΠ΅ΡΡΡ ΠΈΡΡΠΊΡΡΡΠ²Π΅Π½Π½ΡΠΌ ΠΏΡΠΈΠ½ΡΠΆΠ΄Π΅Π½ΠΈΠ΅ΠΌ, ΠΆΠ΅ΡΡΠ²ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΏΡΠΈΠΌΠ»Π΅ΠΌΡΠΌ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π½Π° Π°Π»ΡΠ°ΡΠ΅ ΠΏΡΠΎΡΡΠΎΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΠΌΠΎΡΡΠΈ. Π₯ΠΎΡΡ Ρ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ Π·Π° ΡΠΎΡ ΡΠ°Π½Π΅Π½ΠΈΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π½Π°ΡΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΎΡΡΠΎΠΉ, Π½Π°ΡΠΊΠΎΠ»ΡΠΊΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ Π½Π΅ Π΄ΡΠΌΠ°Ρ, ΡΡΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π΄Π΅Π»Π°ΡΡ ΡΡΠΎ Π·Π° ΡΡΠ΅Ρ ΠΏΡΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΡΡΠΈ. ΠΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΠ΄ΠΎΠ±Π½ΡΠ΅ ΡΡΠΎΠΌΡ, ΠΏΡΠΈΠ²Π΅Π΄ΡΡ ΠΊ ΠΏΠΎΡΠ΅ΡΠ΅ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΉ Π΄Π΅ΡΠ°Π»ΠΈ, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎΠ±Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ Β«notΒ» ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅ΠΌ ΠΆΠ΅ ΡΠ°ΠΌΡΠΌ ΡΡΠΎ ΡΠ½Π°ΡΠ½ΡΠΉ ΠΌΠΈΠ½ΡΡ. Π Π°ΡΡΠΌΠΎΡΡΠΈΠΌ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ Β«orΒ», ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΎΠ±ΡΡΠ½ΠΎ Π·Π°ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ ΡΠ°ΠΊ:
a~b ::= (a and not b) or (not a and b)
ΠΡΠ»ΠΈ ΠΌΡ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ Β«notΒ» ΠΈΠ·ΠΌΠ΅Π½ΡΡΡ Π²Π΅ΡΡ ΡΠ΅ΡΠΌ, ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΡΠ΅ΡΠΌ Π² ΠΊΡΡΠ³Π»ΡΡ ΡΠΊΠΎΠ±ΠΊΠ°Ρ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΠΎΠ²Π°Π»ΡΡ Π±Ρ ΠΊΠ°ΠΊ:
not(a and b)
ΡΡΠΎ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ ΡΠΎ ΠΆΠ΅ ΡΠ°ΠΌΠΎΠ΅. Π’Π°ΠΊ ΡΡΠΎ ΡΡΠ½ΠΎ, ΡΡΠΎ ΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠΌ Β«notΒ» Π½ΡΠΆΠ½ΠΎ Π΄ΡΠΌΠ°ΡΡ ΠΊΠ°ΠΊ ΠΎ ΡΠ²ΡΠ·Π°Π½Π½ΠΎΠΌ Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ Π° Π½Π΅ ΡΠ΅ΡΠΌΠΎΠΌ.
ΠΠ΄Π΅Ρ ΠΏΠ΅ΡΠ΅Π³ΡΡΠ·ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ '~' Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ»Π° ΠΈ Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠΉ ΡΠΎΡΠΊΠΈ Π·ΡΠ΅Π½ΠΈΡ. ΠΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΠ½Π°ΡΠ½ΠΎΠ³ΠΎ ΠΌΠΈΠ½ΡΡΠ° ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ Π²ΡΡΠΈΡΠ°Π½ΠΈΡ ΠΈΠ· Π½ΡΠ»Ρ:
βx <=> 0-x
Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΠΌΠΎΠΈΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΡ Π²Π΅ΡΡΠΈΠΉ Expression Ρ ΡΠ΅Π°Π³ΠΈΡΠΎΠ²Π°Π» Π½Π° Π²Π΅Π΄ΡΡΠΈΠΉ addop ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅Π΄Π·Π°Π³ΡΡΠΆΠ°Ρ Π½ΡΠ»Ρ, Π·Π°ΡΠ΅ΠΌ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ ΠΊΠ°ΠΊ Π΅ΡΠ»ΠΈ Π±Ρ ΡΡΠΎ Π±ΡΠ» Π΄Π²ΠΎΠΈΡΠ½ΡΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ. ΠΠΎ Β«notΒ» ΡΡΠΎ Π½Π΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ Ρ Π½ΡΠ»Π΅ΠΌ... ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΏΡΠΎΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠΈΡ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ΅ ΡΠΈΡΠ»ΠΎ. ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ ΠΈΠ»ΠΈ Ρ FFFFh ΠΈΠ»ΠΈ -1.
ΠΠΎΡΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΡ, ΠΊΠ°ΠΆΡΡΠ°ΡΡΡ Π±Π»ΠΈΠ·ΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ½Π°ΡΠ½ΡΠΌ Β«notΒ» ΠΈ ΡΠ½Π°ΡΠ½ΡΠΌ ΠΌΠΈΠ½ΡΡΠΎΠΌ ΡΠ°Π·Π²Π°Π»ΠΈΠ²Π°Π΅ΡΡΡ ΠΏΡΠΈ Π±ΠΎΠ»Π΅Π΅ Π±Π»ΠΈΠ·ΠΊΠΎΠΌ ΠΈΡΡΠ»Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠΈΠΈ. Β«notΒ» ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π° Π½Π΅ ΡΠ΅ΡΠΌ ΠΈ ΠΎΠ½ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡ Π½ΠΈ ΠΊ ΡΠ½Π°ΡΠ½ΠΎΠΌΡ ΠΌΠΈΠ½ΡΡΡ, Π½ΠΈ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅ΠΌΡ ΠΈΠ»ΠΈ. Π‘Π»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ, ΠΎΠ½ Π·Π°ΡΠ»ΡΠΆΠΈΠ²Π°Π΅Ρ ΡΠ²ΠΎΠ΅Π³ΠΎ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ ΡΠΈΠΌΠ²ΠΎΠ»Π° Π΄Π»Ρ Π²ΡΠ·ΠΎΠ²Π°. ΠΠ°ΠΊΠΎΠΉ ΡΠΈΠΌΠ²ΠΎΠ» Π»ΡΡΡΠ΅, ΡΠ΅ΠΌ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΡΠΉ, ΡΠ°ΠΊΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΠΉ Π² Π‘ΠΈ ΡΠΈΠΌΠ²ΠΎΠ» "!"? ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ ΠΏΡΠ°Π²ΠΈΠ»Π° ΡΠΎΠ³ΠΎ ΠΊΠ°ΠΊ ΠΌΡ Π΄ΡΠΌΠ°Π΅ΠΌ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅ΡΡΠΈ ΡΠ΅Π±Ρ Β«notΒ», ΠΌΡ Π΄ΠΎΠ»ΠΆΠ½Ρ Π±ΡΡΡ ΡΠΏΠΎΡΠΎΠ±Π½Ρ Π·Π°ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠ΅Π΅ ΠΈΠ»ΠΈ (ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Ρ ΡΡΠΎ ΡΡΠΎ Π½Π°ΠΌ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡΠ΄Ρ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡΡΡ) Π² ΠΎΡΠ΅Π½Ρ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΡΠΎΡΠΌΠ΅:
a & !b | !a & b
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π½ΠΈΠΊΠ°ΠΊΠΈΡ ΠΊΡΡΠ³Π»ΡΡ ΡΠΊΠΎΠ±ΠΎΠΊ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ β Π²ΡΠ±ΡΠ°Π½Π½ΡΠ΅ Π½Π°ΠΌ ΡΡΠΎΠ²Π½ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ Π·Π°Π±ΠΎΡΡΡΡΡ ΠΎΠ±ΠΎ Π²ΡΠ΅ΠΌ.
ΠΡΠ»ΠΈ Π²Ρ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΡΠ΅ ΡΡΠΈΡΡΠ²Π°ΡΡ ΡΡΠΎΠ²Π½ΠΈ ΠΏΡΠΈΠΎΡΠΈΡΠ΅ΡΠ°, ΡΡΠΎ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΌΠ΅ΡΠ°Π΅Ρ '!' Π½Π° Π²Π΅ΡΡΠΈΠ½Ρ ΠΊΡΡΠΈ. Π£ΡΠΎΠ²Π½ΠΈ ΡΡΠ°Π½ΠΎΠ²ΡΡΡΡ:
!
β (ΡΠ½Π°ΡΠ½ΡΠΉ)
*, /, &
+, -, |, ~
Π Π°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°Ρ ΡΡΠΎΡ ΡΠΏΠΈΡΠΎΠΊ, ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ Π½Π΅ ΡΡΡΠ΄Π½ΠΎ ΡΠ²ΠΈΠ΄Π΅ΡΡ, ΠΏΠΎΡΠ΅ΠΌΡ ΠΌΡ ΠΈΠΌΠ΅Π»ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ ΠΏΡΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠΈ '~' ΠΊΠ°ΠΊ ΡΠΈΠΌΠ²ΠΎΠ»Π° Β«notΒ»!
Π’Π°ΠΊ, ΠΊΠ°ΠΊ ΠΌΡ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΈΡΡΠ΅ΠΌ ΡΡΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°? Π’Π°ΠΊΠΈΠΌ ΠΆΠ΅ ΡΠ°ΠΌΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΡ ΡΠ΄Π΅Π»Π°Π»ΠΈ Ρ SignedTerm, Π½ΠΎ Π½Π° ΡΡΠΎΠ²Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ. ΠΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠΌ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ NotFactor:
{β}
{ Parse and Translate a Factor with Optional Β«NotΒ» }
procedure NotFactor;
begin
if Look ='!' then begin
Match('!');
Factor;
Notit;
end
else
Factor;
end;
{β}
ΠΈ Π²ΡΠ·ΠΎΠ²Π΅ΠΌ Π΅Π΅ ΠΈΠ· Π²ΡΠ΅Ρ ΠΌΠ΅ΡΡ, Π³Π΄Π΅ ΠΌΡ ΠΏΡΠ΅ΠΆΠ΄Π΅ Π²ΡΠ·ΡΠ²Π°Π»ΠΈ Factor, Ρ.Π΅. ΠΈΠ· Term, Multiply, Divide ΠΈ _And. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½ΠΎΠ²ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡΡ Π³Π΅Π½Π΅ΡΠ°ΡΠΈΠΈ ΠΊΠΎΠ΄Π°:
{β}
{ Bitwise Not Primary }
procedure NotIt;
begin
EmitLn('EOR #-1,D0');
end;
{β}
ΠΡΠΏΡΡΠ°ΠΉΡΠ΅ Π΅Π΅ ΡΠ΅ΠΉΡΠ°Ρ Ρ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΠΌΠΈ ΠΏΡΠΎΡΡΡΠΌΠΈ ΡΠ»ΡΡΠ°ΡΠΌΠΈ. Π€Π°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ, ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ ΠΏΡΠΈΠΌΠ΅Ρ Ρ ΠΈΡΠΊΠ»ΡΡΠ°ΡΡΠΈΠΌ ΠΈΠ»ΠΈ:
a&!b|!a&b
ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΊΠΎΠ΄ (Π±Π΅Π· ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠ΅Π², ΠΊΠΎΠ½Π΅ΡΠ½ΠΎ):
MOVE A(PC),DO ; load a
MOVE D0,-(SP) ; push it
MOVE B(PC),DO ; load b
EOR #-1,D0 ; not it
AND (SP)+,D0 ; and with a
MOVE D0,-(SP) ; push result
MOVE A(PC),DO ; load a
EOR #-1,D0 ; not it
MOVE D0,-(SP) ; push it
MOVE B(PC),DO ; load b
AND (SP)+,D0 ; and with !a
OR (SP)+,D0 ; or with first term
ΠΡΠΎ ΡΠΎΡΠ½ΠΎ ΡΠΎ, ΡΡΠΎ ΠΌΡ Ρ ΠΎΡΠ΅Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ. Π’Π°ΠΊ ΡΡΠΎ, ΠΏΠΎ ΠΊΡΠ°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅ΡΠ΅, ΠΈ Π΄Π»Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΈ Π΄Π»Ρ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² Π½Π°Ρ Π½ΠΎΠ²ΡΠΉ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ ΠΈ Π½ΠΎΠ²ΡΠΉ, Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΠΈΠΉ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ, ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΄ΡΡΠ³ Π΄ΡΡΠ³Π°. ΠΠ°ΠΆΠ΅ ΡΠΏΠ΅ΡΠΈΡΠΈΡΠ΅ΡΠΊΠΎΠ΅, Π½ΠΎ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎΠ΅ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ Ρ Π²Π΅Π΄ΡΡΠΈΠΌ addop:
~x
ΠΈΠΌΠ΅Π΅Ρ ΡΠΌΡΡΠ». SignedTerm ΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ Π²Π΅Π΄ΡΡΠΈΠΉ '~' ΠΊΠ°ΠΊ ΠΈ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ:
0~x,
ΡΡΠΎ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΠΎ x.
ΠΠΎΠ³Π΄Π° ΠΌΡ Π²Π·Π³Π»ΡΠ½Π΅ΠΌ Π½Π° ΡΠΎΠ·Π΄Π°Π½Π½ΡΠ΅ Π½Π°ΠΌΠΈ ΠΠΠ€, ΠΌΡ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠΌ, ΡΡΠΎ Π½Π°ΡΠ° Π±ΡΠ»Π΅Π²Π° Π°Π»Π³Π΅Π±ΡΠ° Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ΅ΠΏΠ΅ΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΠ΄Π½Ρ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΡΠΎΠΊΡ:
<not_factor> ::= [!] <factor>
<factor> ::= <variable> | <constant> | '(' <expression> ')'
<signed_term> ::= [<addop>] <term>
<term> ::= <not_factor> (<mulop> <not_factor>)*
<expression> ::= <signed_term> (<addop> <term>)*
<assignment> ::= <variable> '=' <expression>
ΠΡΠΎ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΡΠ»ΡΡΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ Π΄ΠΎΡΡΠΈΠΆΠ΅Π½ΠΈΠΉ. ΠΡΠ΄Π΅Ρ Π»ΠΈ ΡΠΎΡ ΡΠ°Π½ΡΡΡΡΡ Π½Π°ΡΠ° ΡΠ΄Π°ΡΠ° ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΡΠΈΠΌΠ΅ΠΌΡΡ Π·Π° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ? ΠΡ Π²ΡΡΡΠ½ΠΈΠΌ ΡΡΠΎ ΡΠΊΠΎΡΠΎ, Π½ΠΎ ΠΌΡ Π΄ΠΎΠ»ΠΆΡ Π±ΡΠ΄Π΅ΠΌ Π΄ΠΎΠΆΠ΄Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠ΅ΠΉ Π³Π»Π°Π²Ρ. Π£ Π½Π°Ρ Π²ΡΠ΄Π°Π»Π°ΡΡ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠ°Ρ ΠΏΠ°ΡΠ·Π° ΠΈ Ρ Ρ ΠΎΡΡ Π²ΡΠ΄Π°ΡΡ ΡΡΡ Π³Π»Π°Π²Ρ Π² Π²Π°ΡΠΈ ΡΡΠΊΠΈ. Π£ΠΆΠ΅ ΠΏΡΠΎΡΠ΅Π» Π³ΠΎΠ΄ Ρ Π²ΡΠΏΡΡΠΊΠ° ΠΠ»Π°Π²Ρ 15. Π― Π±ΠΎΡΡΡ ΠΏΡΠΈΠ·Π½Π°ΡΡΡΡ, ΡΡΠΎ Π²ΡΡ ΡΡΠ° ΡΠ΅ΠΊΡΡΠ°Ρ Π³Π»Π°Π²Π° Π±ΡΠ»Π° Π³ΠΎΡΠΎΠ²Π° ΡΠΆΠ΅ Π΄Π°Π²Π½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠΎΠ² ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ. ΠΠΎ ΡΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ Π΄Π°Π΅Ρ Π²Π°ΠΌ Π½ΠΈΡΠ΅Π³ΠΎ Ρ ΠΎΡΠΎΡΠ΅Π³ΠΎ, ΡΠΈΠ΄Ρ Π½Π° ΠΌΠΎΠ΅ΠΌ ΠΆΠ΅ΡΡΠΊΠΎΠΌ Π΄ΠΈΡΠΊΠ΅, ΠΈ ΡΠ΄Π΅ΡΠΆΠΈΠ²Π°Ρ Π΅Π΅ ΠΏΠΎΠΊΠ° ΠΏΠΎΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ Π½Π΅ Π±ΡΠ΄ΡΡ ΡΠ΄Π΅Π»Π°Π½Ρ, Ρ Π½Π΅ Π΄Π°Π²Π°Π» Π΅Π΅ Π² Π²Π°ΡΠΈ ΡΡΠΊΠΈ Π²ΡΠ΅ ΡΡΠΎ Π²ΡΠ΅ΠΌΡ. ΠΡΠΈΡΠ»ΠΎ Π²ΡΠ΅ΠΌΡ Π²ΡΠ΄Π°ΡΡ Π΅Π΅ ΡΡΠΎΠ±Ρ Π²Ρ ΡΠΌΠΎΠ³Π»ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· Π½Π΅Π΅ ΡΡΠΎ-Π½ΠΈΠ±ΡΠ΄Ρ ΡΠ΅Π½Π½ΠΎΠ΅. ΠΡΠΎΠΌΠ΅ ΡΠΎΠ³ΠΎ, ΠΈΠΌΠ΅Π΅ΡΡΡ Π±ΠΎΠ»ΡΡΠΎΠ΅ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΡΠ΅ΡΡΠ΅Π·Π½ΡΡ ΡΠΈΠ»ΠΎΡΠΎΡΡΠΊΠΈΡ Π²ΠΎΠΏΡΠΎΡΠΎΠ², ΡΠ²ΡΠ·Π°Π½Π½ΡΡ Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ, ΠΈ Ρ ΠΏΡΠ΅Π΄ΠΏΠΎΡΠ΅Π» Π±Ρ ΡΠΎΡ ΡΠ°Π½ΠΈΡΡ ΠΈΡ Π΄Π»Ρ ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΉ Π³Π»Π°Π²Ρ, Π³Π΄Π΅ Ρ ΡΠΌΠΎΠ³ Π±Ρ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΠΊΠΎΡΡΠ΅ΠΊΡΠ½ΠΎ.
Π Π°Π·Π²Π»Π΅ΠΊΠ°ΠΉΡΠ΅ΡΡ Ρ Π½ΠΎΠ²ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ ΡΠΎΠ½ΠΊΠΎΠΉ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΠΎΠΉ ΠΈ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ, Π° Ρ ΡΠΊΠΎΡΠΎ ΡΠ²ΠΈΠΆΡ Π²Π°Ρ Ρ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΡΠΌΠΈ.