Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«Π”Π°Π²Π°ΠΉΡ‚Π΅ создадим компилятор!Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 62

Автор Π”ΠΆΠ΅ΠΊ ΠšΡ€Π΅Π½ΡˆΠΎΡƒ

ВсС это слуТит ΠΊΠ°ΠΊ объяснСниС ΠΌΠΎΠ΅Π³ΠΎ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΠΊΠ°ΠΊ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ смСшанной Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΈ: я Π½Π΅ Π±ΡƒΠ΄Ρƒ Π΅Π΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Для языка, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΠΎΠ³ΠΎ для систСмного программирования, Ρ‡Π΅ΠΌ мСньшС ΠΏΡ€Π°Π²ΠΈΠ», Ρ‚Π΅ΠΌ Π»ΡƒΡ‡ΡˆΠ΅. Если Π²Ρ‹ Π½Π΅ согласны, ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° Ρ‚Π°ΠΊΠΈΠ΅ условия, ΠΌΡ‹ смоТСм ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это, ΠΊΠΎΠ³Π΄Π° Ρƒ нас Π±ΡƒΠ΄Π΅Ρ‚ Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

Π‘ΡƒΠ»Π΅Π²ΠΎ Β«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. Π― боюсь ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ вся эта тСкущая Π³Π»Π°Π²Π° Π±Ρ‹Π»Π° Π³ΠΎΡ‚ΠΎΠ²Π° ΡƒΠΆΠ΅ Π΄Π°Π²Π½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ. Но эта информация совсСм Π½Π΅ Π΄Π°Π΅Ρ‚ Π²Π°ΠΌ Π½ΠΈΡ‡Π΅Π³ΠΎ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π³ΠΎ, сидя Π½Π° ΠΌΠΎΠ΅ΠΌ ТСстком дискС, ΠΈ удСрТивая Π΅Π΅ ΠΏΠΎΠΊΠ° ΠΏΠΎΠΊΠ° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ сдСланы, я Π½Π΅ Π΄Π°Π²Π°Π» Π΅Π΅ Π² ваши Ρ€ΡƒΠΊΠΈ всС это врСмя. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя Π²Ρ‹Π΄Π°Ρ‚ΡŒ Π΅Π΅ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ смогли ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΠ· Π½Π΅Π΅ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ†Π΅Π½Π½ΠΎΠ΅. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, имССтся большоС количСство ΡΠ΅Ρ€ΡŠΠ΅Π·Π½Ρ‹Ρ… философских вопросов, связанных с ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ, ΠΈ я ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Π΅Π» Π±Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΈΡ… для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π»Π°Π²Ρ‹, Π³Π΄Π΅ я смог Π±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ.

Π Π°Π·Π²Π»Π΅ΠΊΠ°ΠΉΡ‚Π΅ΡΡŒ с Π½ΠΎΠ²ΠΎΠΉ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΎΠΉ Π°Ρ€ΠΈΡ„ΠΌΠ΅Ρ‚ΠΈΠΊΠΎΠΉ ΠΈ логичСским Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ, Π° я скоро ΡƒΠ²ΠΈΠΆΡƒ вас с ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡΠΌΠΈ.