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

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

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

Match('-');

Term;

EmitLn('SUB D1,D0');

EmitLn('NEG D0');

end;

{–}

Π’Π΅ΠΏΠ΅Ρ€ΡŒ наш ΠΊΠΎΠ΄ Π΄Π°ΠΆΠ΅ Π΅Ρ‰Π΅ ΠΌΠ΅Π½Π΅Π΅ эффСктивСн, Π½ΠΎ ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‚! К соТалСнию, ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ условия Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ слСдовали Π² Π½Π΅ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΌ для нас порядкС. ΠžΠΏΡΡ‚ΡŒ, это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Ρ„Π°ΠΊΡ‚ΠΎΠ² ΠΆΠΈΠ·Π½ΠΈ, с ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π²Ρ‹ ΡƒΡ‡ΠΈΡ‚Π΅ΡΡŒ ΠΆΠΈΡ‚ΡŒ. ВсС это возвратится снова, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ нас, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ примСмся Π·Π° Π΄Π΅Π»Π΅Π½ΠΈΠ΅.

Π˜Ρ‚Π°ΠΊ, Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ сумму ΠΈΠ»ΠΈ Ρ€Π°Π·Π½ΠΎΡΡ‚ΡŒ Π΄Π²ΡƒΡ… Ρ†ΠΈΡ„Ρ€. Π Π°Π½Π΅Π΅ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½Ρ‹Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹. Но настоящиС выраТСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ (ΠΈΠ»ΠΈ Π±Π΅ΡΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΡ…). Π’Π΅Ρ€Π½ΠΈΡ‚Π΅ΡΡŒ ΠΈ запуститС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с СдинствСнным Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ символом β€œ1”.

НС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? А ΠΏΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ? ΠœΡ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Π°Π»ΠΈ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, Ρ‡Ρ‚ΠΎ СдинствСнным ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌΠΈ Π²ΠΈΠ΄Π°ΠΌΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ выраТСния с двумя Ρ‚Π΅Ρ€ΠΌΠ°ΠΌΠΈ. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Expression Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° Π±Ρ‹Π»Π° Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΈ с этого Π½Π°Ρ‡Π°Ρ‚ΡŒ созданиС настоящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°.

ΠžΠ±Ρ‰Π°Ρ Ρ„ΠΎΡ€ΠΌΠ° выраТСния

Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΡΡ‚ΠΎΡΡ‚ΡŒ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ Ρ‚Π΅Ρ€ΠΌΠΎΠ², Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Β«addopsΒ» ('+' ΠΈΠ»ΠΈ '-'). Π’ БНЀ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано ΠΊΠ°ΠΊ:

<expression> ::= <term> [<addop> <term>]*

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ выраТСния, Π΄ΠΎΠ±Π°Π²ΠΈΠ² простой Ρ†ΠΈΠΊΠ» ΠΊ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Expression:

{–}

{ Parse and Translate an Expression }

procedure Expression;

begin

Term;

while Look in ['+', '-'] do begin

EmitLn('MOVE D0,D1');

case Look of

'+': Add;

'-': Subtract;

else Expected('Addop');

end;

end;

end;

{–}

Π­Ρ‚Π° вСрсия ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ любоС число Ρ‚Π΅Ρ€ΠΌΠΎΠ², ΠΈ это стоило Π½Π°ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΄Π²ΡƒΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… строк ΠΊΠΎΠ΄Π°. По ΠΌΠ΅Ρ€Π΅ изучСния, Π²Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ это Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€Π½ΠΎ для нисходящих синтаксичСских анализаторов… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколько Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… строк ΠΊΠΎΠ΄Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка. Π­Ρ‚ΠΎ ΠΊΠ°ΠΊ Ρ€Π°Π· Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ наш ΠΏΠΎΡˆΠ°Π³ΠΎΠ²Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ. Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Expression соотвСтствуСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ БНЀ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠ΄Π½Π° ΠΈΠ· характСристик ΠΌΠ΅Ρ‚ΠΎΠ΄Π°. Когда Π²Ρ‹ станСтС спСциалистом этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, Π²Ρ‹ смоТСтС ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ БНЀ Π² ΠΊΠΎΠ΄ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ с Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ, с ΠΊΠ°ΠΊΠΎΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°Π±ΠΈΡ€Π°Ρ‚ΡŒ тСкст Π½Π° ΠΊΠ»Π°Π²ΠΈΠ°Ρ‚ΡƒΡ€Π΅!

ОК, ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ испытайтС Π΅Π³ΠΎ. Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ «компилятор» ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ любоС допустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π²Ρ‹Π΄Π°Π΅Ρ‚ осмыслСнноС сообщСниС ΠΎΠ± ошибкС для Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹Ρ…. Π§Π΅Ρ‚ΠΊΠΎ, Π΄Π°? Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² нашСй тСстовой вСрсии любоС сообщСниС ΠΎΠ± ошибкС выводится вмСстС с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Но Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, это Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ экран ΠΊΠ°ΠΊ Β«Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»Β» Π² этих экспСримСнтах. Π’ Ρ€Π°Π±ΠΎΡ‡Π΅ΠΉ вСрсии Π²Ρ‹Π²ΠΎΠ΄ Π±ΡƒΠ΄Π΅Ρ‚ раздСлСн… ΠΎΠ΄ΠΈΠ½ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π° экран.

ИспользованиС стСка

Π’ этом мСстС я ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡΡŒ Π½Π°Ρ€ΡƒΡˆΠΈΡ‚ΡŒ своС ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‡Ρ‚ΠΎ я Π½Π΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡŽ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ слоТноС, ΠΏΠΎΠΊΠ° это Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠŸΡ€ΠΎΡˆΠ»ΠΎ достаточно ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ с Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ. Π’ настоящСС врСмя синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ D0 ΠΊΠ°ΠΊ «основной» рСгистр, ΠΈ D1 для хранСния частичной суммы. Π­Ρ‚Π° схСма Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ Π΄Π΅Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Β«addopsΒ» (β€œ+” ΠΈ β€œ-”) ΠΈ Π½ΠΎΠ²ΠΎΠ΅ число прибавляСтся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ появлСния. Но Π² ΠΎΠ±Ρ‰Π΅ΠΌ Ρ„ΠΎΡ€ΠΌΠ΅ ΡΡ‚ΠΎ Π½Π΅ Ρ‚Π°ΠΊ. Рассмотрим, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

1+(2-(3+(4-5)))

Если ΠΌΡ‹ помСстим Β«1Β» Π² D1, Ρ‚ΠΎ Π³Π΄Π΅ ΠΌΡ‹ размСстим Β«2Β»? Π’Π°ΠΊ ΠΊΠ°ΠΊ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π»ΡŽΠ±ΡƒΡŽ ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ слоТности, Ρ‚ΠΎ ΠΌΡ‹ ΠΎΡ‡Π΅Π½ΡŒ быстро ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ всС рСгистры!

К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ Π΅ΡΡ‚ΡŒ простоС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Как ΠΈ всС соврСмСнныС микропроцСссоры, 68000 ΠΈΠΌΠ΅Π΅Ρ‚ стСк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ мСстом для хранСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ числа элСмСнтов. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вмСсто Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΡ‹ Π² D0 ΠΈ D1 Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π·Π°Ρ‚ΠΎΠ»ΠΊΠ½Π΅ΠΌ ΠΈΡ… Π² стСк. Для Ρ‚Π΅Ρ… ΠΊΡ‚ΠΎ Π½Π΅Π·Π½Π°ΠΊΠΎΠΌ с ассСмблСром 68000 – ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ Π² стСк ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ

–(SP)

ΠΈ ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ (SP)+.

Π˜Ρ‚Π°ΠΊ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ EmitLn Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Expression Π½Π°

EmitLn('MOVE D0,-(SP)');

ΠΈ Π΄Π²Π΅ строки Π² Add ΠΈ Subtract:

EmitLn('ADD (SP)+,D0') ΠΈ EmitLn('SUB (SP)+,D0')

соотвСтствСнно. Π’Π΅ΠΏΠ΅Ρ€ΡŒ испытаСм компилятор снова ΠΈ удостовСримся Ρ‡Ρ‚ΠΎ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚.

И снова, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΌΠ΅Π½Π΅Π΅ эффСктивСн, Ρ‡Π΅ΠΌ Π±Ρ‹Π» Π΄ΠΎ этого, Π½ΠΎ это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ шаг, ΠΊΠ°ΠΊ Π²Ρ‹ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚Π΅.

Π£ΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π΅Π½ΠΈΠ΅

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄Π°Π²Π°ΠΉΡ‚Π΅ возьмСмся Π·Π° Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Π΅ Π΄Π΅Π»Π°. Как Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, ΠΊΡ€ΠΎΠΌΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² Β«addopsΒ» ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ другиС… выраТСния ΠΌΠΎΠ³ΡƒΡ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ умноТСния ΠΈ дСлСния. Π’Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ сущСствуСт нСявный ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ иСрархия, связанная с выраТСниями, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² выраТСниях Ρ‚ΠΈΠΏΠ°

2 + 3 * 4,

ΠΌΡ‹ Π·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ сначала ΡƒΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ, Π° Π·Π°Ρ‚Π΅ΠΌ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ. (Π’ΠΈΠ΄ΠΈΡ‚Π΅, Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ стСк? )

Π’ Ρ€Π°Π½Π½ΠΈΠ΅ Π΄Π½ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ компиляторов, люди использовали Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ довольно слоТныС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² соблюдались. Но, оказываСтся, всС ΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½ΠΈ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π½ΠΈΡ… Π½Π°ΠΌ Π½Π΅ нуТСн… эти ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Ρ‹ Π² нашСй Ρ‚Π΅Ρ…Π½ΠΈΠΊΠ΅ нисходящСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π”ΠΎ сих ΠΏΠΎΡ€ СдинствСнной Ρ„ΠΎΡ€ΠΌΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ примСняли для Ρ‚Π΅Ρ€ΠΌΠ° Π±Ρ‹Π»Π° Ρ„ΠΎΡ€ΠΌΠ° ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ дСсятичной Ρ†ΠΈΡ„Ρ€Ρ‹. Π’ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±Ρ‰Π΅ΠΉ Ρ„ΠΎΡ€ΠΌΠ΅ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ (product of factors), Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ

<term> ::= <factor> [ <mulop> <factor ]*

Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ? На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ это Ρ‚ΠΎΠΆΠ΅, Ρ‡Π΅ΠΌ Π±Ρ‹Π» Ρ€Π°Π½Π½Π΅Π΅ Ρ‚Π΅Ρ€ΠΌ – ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠΉ Ρ†ΠΈΡ„Ρ€ΠΎΠΉ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Ρ‚Π΅Ρ€ΠΌ ΠΈΠΌΠ΅Π΅Ρ‚ Ρ‚Ρƒ ΠΆΠ΅ Ρ„ΠΎΡ€ΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. ЀактичСски, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ это Π² наш компилятор остороТно скопировав ΠΈ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π². Но Π²ΠΎ ΠΈΠ·Π±Π΅ΠΆΠ°Π½ΠΈΠ΅ Π½Π΅Ρ€Π°Π·Π±Π΅Ρ€ΠΈΡ…ΠΈ Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ ΠΏΠΎΠ»Π½Ρ‹ΠΉ листинг всСх ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. (Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ способ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ ΠΌΡ‹ измСняСм порядок ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ² Π² Divide.)

{–}

{ Parse and Translate a Math Factor }

procedure Factor;

begin

EmitLn('MOVE #' + GetNum + ',D0')

end;

{–}

{ Recognize and Translate a Multiply }

procedure Multiply;

begin

Match('*');

Factor;

EmitLn('MULS (SP)+,D0');

end;

{–}

{ Recognize and Translate a Divide }

procedure Divide;

begin

Match('/');

Factor;

EmitLn('MOVE (SP)+,D1');

EmitLn('DIVS D1,D0');

end;

{–}

{ Parse and Translate a Math Term }

procedure Term;

begin

Factor;

while Look in ['*', '/'] do begin

EmitLn('MOVE D0,-(SP)');

case Look of

'*': Multiply;

'/': Divide;

else Expected('Mulop');

end;

end;

end;

{–}

{ Recognize and Translate an Add }

procedure Add;

begin

Match('+');

Term;

EmitLn('ADD (SP)+,D0');

end;

{–}

{ Recognize and Translate a Subtract }

procedure Subtract;

begin

Match('-');

Term;

EmitLn('SUB (SP)+,D0');

EmitLn('NEG D0');

end;

{–}

{ Parse and Translate an Expression }

procedure Expression;

begin

Term;

while Look in ['+', '-'] do begin

EmitLn('MOVE D0,-(SP)');

case Look of

'+': Add;

'-': Subtract;

else Expected('Addop');

end;

end;

end;

{–}

ΠšΠΎΠ½Ρ„Π΅Ρ‚ΠΊΠ°! ΠŸΠΎΡ‡Ρ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ транслятор Π² 55 строк Паскаля! ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ Π½Π°Ρ‡ΠΈΠ½Π°Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, Ссли Π½Π΅ ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ. Π—Π°ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅, ΠΌΡ‹ Π½Π΅ пытаСмся ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ сСйчас самый ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄.

ΠšΡ€ΡƒΠ³Π»Ρ‹Π΅ скобки

ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΡ‚ΡŒ эту Ρ‡Π°ΡΡ‚ΡŒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΊΡ€ΡƒΠ³Π»Ρ‹Ρ… скобок. Как Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, скобки ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠΎΠΌ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ измСнСния ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ². Π’Π°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ

2*(3+4) ,

скобки Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ слоТСниС ΠΏΠ΅Ρ€Π΅Π΄ ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. Но, Ρ‡Ρ‚ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, скобки Π΄Π°ΡŽΡ‚ Π½Π°ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ для опрСдСлСния Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ любой стСпСни слоТности, ΠΊΠ°ΠΊ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

(1+2)/((3+4)+(5-6))

ΠšΠ»ΡŽΡ‡ΠΎΠΌ ΠΊ Π²ΡΡ‚Ρ€Π°ΠΈΠ²Π°Π½ΠΈΡŽ скобок Π² наш синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ являСтся ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ зависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ слоТно Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² скобки, для ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠΉ части ΠΌΠΈΡ€Π° ΠΎΠ½ΠΎ выглядит ΠΊΠ°ΠΊ простой ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ. Π­Ρ‚ΠΎ ΠΎΠ΄Π½Π° ΠΈΠ· Ρ„ΠΎΡ€ΠΌ для показатСля:

<factor> ::= (<expression>)

Π—Π΄Π΅ΡΡŒ появляСтся рСкурсия. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ содСрТит ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈ Ρ‚.Π΄. Π΄ΠΎ бСсконСчности.

Π‘Π»ΠΎΠΆΠ½ΠΎ это ΠΈΠ»ΠΈ Π½Π΅Ρ‚, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± этом, Π΄ΠΎΠ±Π°Π²ΠΈΠ² нСсколько строчСк Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Factor:

{–}

{ Parse and Translate a Math Factor }

procedure Expression; Forward;

procedure Factor;

begin

if Look = '(' then begin

Match('(');

Expression;

Match(')');

end

else

EmitLn('MOVE #' + GetNum + ',D0');

end;

{–}

Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅ снова, ΠΊΠ°ΠΊ Π»Π΅Π³ΠΊΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½ΡΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΈ ΠΊΠ°ΠΊ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΊΠΎΠ΄ Паскаля соотвСтствуСт ΡΠΈΠ½Ρ‚аксису БНЀ.

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ распознаСт допустимыС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΈ ΠΎΡ‚ΠΌΠ΅Ρ‡Π°Π΅Ρ‚ нСдопустимыС сообщСниями ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

Π£Π½Π°Ρ€Π½Ρ‹ΠΉ минус

На Π΄Π°Π½Π½ΠΎΠΌ этапС ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΏΠΎΡ‡Ρ‚ΠΈ Π»ΡŽΠ±Ρ‹Π΅ выраТСния, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ? ОК, Ρ‚ΠΎΠ³Π΄Π° испробуйтС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅:

–1

Опс! Он Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π½Π΅ ΠΏΡ€Π°Π²Π΄Π° Π»ΠΈ? ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Expression ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС числа Π±ΡƒΠ΄ΡƒΡ‚ Ρ†Π΅Π»Ρ‹ΠΌΠΈ ΠΈ спотыкаСтся Π½Π° Π·Π½Π°ΠΊΠ΅ минус. Π’Ρ‹ Π½Π°ΠΉΠ΄Π΅Ρ‚Π΅, Ρ‡Ρ‚ΠΎ +3 Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Ρ‡Ρ‚ΠΎ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Ρ‚ΠΈΠΏΠ°:

–(3-2).

БущСствуСт ΠΏΠ°Ρ€Π° способов для исправлСния этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π‘Π°ΠΌΡ‹ΠΉ Π»Π΅Π³ΠΊΠΈΠΉ (хотя ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ самый Π»ΡƒΡ‡ΡˆΠΈΠΉ) способ – Π²ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ноль Π² Π½Π°Ρ‡Π°Π»ΠΎ выраТСния, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎΠ±Ρ‹ -3 стал 0-3. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это Π² ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ вСрсии Expression:

{–}

{ Parse and Translate an Expression }

procedure Expression;

begin