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

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

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

Однако, ΠΈΠ·-Π·Π° Ρ‚ΠΎΡ‚Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ пСрСписывания ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° я Π½Π΅ Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ способСн Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ Π² послСднюю Π³Π»Π°Π²Ρƒ. Из-Π·Π° этого наш Π³Π΅Ρ€ΠΎΠΉ, синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ послСдний Ρ€Π°Π· Π΅Π³ΠΎ Π²ΠΈΠ΄Π΅Π»ΠΈ, Π±Ρ‹Π» Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Π΅Π½ΡŒΡŽ сСбя ΠΏΡ€Π΅ΠΆΠ½Π΅Π³ΠΎ, содСрТащий Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄, достаточный для Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ показатСля состоящСго ΠΈΠ»ΠΈ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈΠ»ΠΈ константы. ΠžΡΠ½ΠΎΠ²Π½Ρ‹ΠΌ достиТСниСм этой Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π³Π»Π°Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΡ‚Π°Ρ‚ΡŒ восстановлСниС синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² Π΅Π³ΠΎ ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΉ славС. Π’ этом процСссС, я надСюсь, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Ρ‚Π΅Ρ€ΠΏΠ΅Π»ΠΈΠ²Ρ‹, Ссли ΠΌΡ‹ ΠΈΠ½ΠΎΠ³Π΄Π° Π±ΡƒΠ΄Π΅ΠΌ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ основы, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΡ‹ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π΅Π»ΠΎ ΠΈ Π΄Π°Π²Π½ΠΎ ΡƒΠΆΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΈ.

Π‘Π½Π°Ρ‡Π°Π»Π°, Π΄Π°Π²Π°ΠΉΡ‚Π΅ позаботимся ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΌΡ‹ ΠΎΠ±Ρ€Π°Ρ‰Π°Π»ΠΈΡΡŒ ΠΏΡ€Π΅ΠΆΠ΄Π΅: наша тСкущая вСрсия ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ 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, Π·Π°Ρ‚Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ число. ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠΎΠΊΠ°Π·Π°Π½Π° дальшС: