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

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

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

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ символ TAB Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΎΠ³ΠΎ эффСкта; наша строка «инструкций» начинаСтся с ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΊΠΎΠ»ΠΎΠ½ΠΊΠΈ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ Ρ„Π°Π»ΡŒΡˆΠΈΠ²Π°Ρ ΠΌΠ΅Ρ‚ΠΊΠ°... ΠŸΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ: WinCRT Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ. Π£ нас ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.

Π•ΡΡ‚ΡŒ нСсколько способов, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. Один ΠΈΠ· Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ – просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ассСмблСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ я ΠΊΠΎΠ³Π΄Π° Π»ΠΈΠ±ΠΎ использовал, Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΡƒΡŽΡ‚ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ 1 для ΠΌΠ΅Ρ‚ΠΎΠΊ ΠΈ взбунтуСтся ΠΊΠΎΠ³Π΄Π° ΡƒΠ²ΠΈΠ΄ΠΈΡ‚, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΉ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ инструкции. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅, ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ΄Π²ΠΈΠ½ΡƒΡ‚ΡŒ инструкции Π½Π° ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠ»ΠΎΠ½ΠΊΡƒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ассСмблСр счастливым. Π­Ρ‚ΠΎ достаточно просто ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ: просто ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ Π² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅ Emit строку:

Write(TAB, s);

Π½Π°

Write(' ', s);

Π― Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ·Π½Π°Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ сталкивался с этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Ρ€Π°Π½ΡŒΡˆΠ΅ ΠΈ Π½Π°Ρ…ΠΎΠ΄ΠΈΠ» сСбя ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΌ своС ΠΌΠ½Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊ часто ΠΊΠ°ΠΊ Ρ…Π°ΠΌΠ΅Π»Π΅ΠΎΠ½ мСняСт Ρ†Π²Π΅Ρ‚. Для Π½Π°ΡˆΠΈΡ… Ρ†Π΅Π»Π΅ΠΉ, 99% ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈ Π²Ρ‹Π²ΠΎΠ΄Π΅ Π½Π° CRT, Π±Ρ‹Π»ΠΎ Π±Ρ‹ Ρ…ΠΎΡ€ΠΎΡˆΠΎ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ Π°ΠΊΠΊΡƒΡ€Π°Ρ‚Π½ΠΎ сгруппированный Β«ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉΒ» ΠΊΠΎΠ΄. Π‘Ρ‚Ρ€ΠΎΠΊΠ°:

SUB1: MOVE #4,D0

просто выглядит Π±ΠΎΠ»Π΅Π΅ опрятно, Ρ‡Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠΉΡΡ, Π½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄:

SUB1: 

MOVE #4,D0

Π’ тСстовой вСрсии ΠΌΠΎΠ΅Π³ΠΎ ΠΊΠΎΠ΄Π° я Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ PostLabel, которая позволяСт ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ размСщСния ΠΌΠ΅Ρ‚ΠΎΠΊ Π½Π° Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… строках, задСрТивая ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΊΠΈ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½Π° оказалась Π½Π° Ρ‚ΠΎΠΉ ΠΆΠ΅ самой строкС, Ρ‡Ρ‚ΠΎ ΠΈ связанная инструкция. НС ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Ρ‡Π΅ΠΌ час Π½Π°Π·Π°Π΄, моя вСрсия модуля Output прСдоставляла ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ табуляции с использованиСм Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ счСтчика столбцов ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для Π΅Π΅ управлСния. Π― ΠΈΠΌΠ΅Π» Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ довольно изящный ΠΊΠΎΠ΄ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° табуляции с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π°. Π‘Ρ‹Π»ΠΎ уТасноС ΠΈΡΠΊΡƒΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ Π²Π°ΠΌ эту Β«ΠΊΡ€Π°ΡΠΈΠ²ΡƒΡŽΒ» Π²Π΅Ρ€ΡΠΈΡŽ, СдинствСнно Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΡ€Π°ΡΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒΡŽ.

Однако, ΠΊΠΎΠ΄ «элСгантной» вСрсии Π±Ρ‹Π» Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ слоТным ΠΈ большим. ПослС этого Ρƒ мСня появилась вторая ΠΌΡ‹ΡΠ»ΡŒ. НСсмотря Π½Π° нашС ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π²ΠΈΠ΄Π΅Ρ‚ΡŒ красивый Π²Ρ‹Π²ΠΎΠ΄, Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π²Π΅ вСрсии MAIN: Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠ΄Π°, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹; ассСмблСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ Ρ†Π΅Π»ΡŒΡŽ ΠΊΠΎΠ΄Π°, Π½Π΅ интСрСсуСт ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΎΠ½ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ красивая вСрсия Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ большС символов, ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ большС дискового пространства ΠΈ дольшС Π°ΡΡΠ΅ΠΌΠ±Π»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. Но красивая вСрсия Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ большС ΠΊΠΎΠ΄Π°, Π½ΠΎ Π΄Π°Π΅Ρ‚ больший Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ», с Π³ΠΎΡ€Π°Π·Π΄ΠΎ большим количСство пустых символов Ρ‡Π΅ΠΌ минимально Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ. ΠšΠΎΠ³Π΄Π° Π²Ρ‹ посмотритС Π½Π° это с Ρ‚Π°ΠΊΠΎΠΉ стороны, Ρ‚ΠΎ Π½Π΅ Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π΅ Ρ‚Π°ΠΊ Π»ΠΈ?

Π’ΠΎ Ρ‡Ρ‚ΠΎ Π½Π°ΠΊΠΎΠ½Π΅Ρ† Ρ€Π΅ΡˆΠΈΠ»ΠΎ для мСня этот вопрос Π±Ρ‹Π»ΠΎ Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π½ΠΈΠ΅ΠΌ ΡΡ‡ΠΈΡ‚Π°Ρ‚ΡŒΡΡ с ΠΌΠΎΠ΅ΠΉ ΠΏΠ΅Ρ€Π²ΠΎΠΉ заповСдью: KISS. Π₯отя я Π±Ρ‹Π» довольно Π³ΠΎΡ€Π΄ всСми своими изящными ΠΏΡ€ΠΈΠ΅ΠΌΡ‡ΠΈΠΊΠ°ΠΌΠΈ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ табуляции, я Π½Π°ΠΏΠΎΠΌΠ½ΠΈΠ» сСбС, Ρ‡Ρ‚ΠΎ пСрСфразируя сСнатора Π‘Π°Ρ€Ρ€ΠΈ Π“ΠΎΠ»Π΄Π²Π°Ρ‚Π΅Ρ€Π°, ΡΠ»Π΅Π³Π°Π½Ρ‚Π½ΠΎΡΡ‚ΡŒ Π² поисках слоТности Π½Π΅ являСтся достоинством. Π”Ρ€ΡƒΠ³ΠΎΠΉ ΠΌΡƒΠ΄Ρ€Ρ‹ΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹ написал: Β«Π›ΡŽΠ±ΠΎΠΉ ΠΈΠ΄ΠΈΠΎΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Роллс-Ройс. ВрСбуСтся Π³Π΅Π½ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ VWΒ». Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ изящная, друТСствСнная табуляции вСрсия Output Π² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ, ΠΈ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π²ΠΈΠ΄ΠΈΡ‚Π΅, это простая компактная VW вСрсия.

ΠœΠΎΠ΄ΡƒΠ»ΡŒ ERROR

Наш ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ошибки. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΠ²Π΅ΠΆΠΈΡ‚ΡŒ Π²Π°ΡˆΡƒ ΠΏΠ°ΠΌΡΡ‚ΡŒ ΠΌΡ‹ возьмСм ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Borland Π² Turbo Pascal – ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π²ΠΎΠΉ ошибкС. Π­Ρ‚ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ наш ΠΊΠΎΠ΄, ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ устраняя Π½Π°Π·ΠΎΠΉΠ»ΠΈΠ²ΡƒΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ восстановлСния послС ошибок, Π½ΠΎ это Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ больший смысл, ΠΏΠΎ ΠΌΠΎΠ΅ΠΌΡƒ мнСнию, Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ срСдС. Π― знаю, Ρ‡Ρ‚ΠΎ это ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠ΅ΠΉ, Π½ΠΎ я ΡΡ‡ΠΈΡ‚Π°ΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ ΡΠΎΠΎΠ±Ρ‰Π°Ρ‚ΡŒ ΠΎΠ±ΠΎ всСх ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π°Π½Π°Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΌΠΎΠΌ, ΠΏΠ΅Ρ€Π΅ΠΆΠΈΡ‚ΠΊΠΎΠΌ со Π²Ρ€Π΅ΠΌΠ΅Π½ ΠΏΠ°ΠΊΠ΅Ρ‚Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€ΠΈΡˆΠ»ΠΎ врСмя ΠΏΡ€Π΅ΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒ. Π’Π°ΠΊ Π²ΠΎΡ‚.

Π’ нашСм ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠΌ Cradle ΠΌΡ‹ ΠΈΠΌΠ΅Π»ΠΈ Π΄Π²Π΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок: Error, которая Π½Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»Π°ΡΡŒ, ΠΈ Abort, которая ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π»Π°ΡΡŒ. Но я Π½Π΅ Π΄ΡƒΠΌΠ°ΡŽ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Π»ΠΈΠ±ΠΎ Π½Π°ΠΉΠ΄Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π΅, которая Π½Π΅ останавливаСтся, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Π² Π½ΠΎΠ²ΠΎΠΌ, Ρ‚ΠΎΡ‰Π΅ΠΌ ΠΈ скромном ΠΌΠΎΠ΄ΡƒΠ»Π΅ Errors, ΠΏΠΎΠΊΠ°Π·Π°Π½Π½ΠΎΠΌ Π½ΠΈΠΆΠ΅, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Error Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ мСсто Abort.

{–}

unit Errors;

{–}

interface

procedure Error(s: string);

procedure Expected(s: string);

{–}

implementation

{–}

{ Write error Message and Halt }

procedure Error(s: string);

begin

WriteLn;

WriteLn(^G, 'Error: ', s, '.');

Halt;

end;

{–}

{ Write Β«<something> ExpectedΒ» }

procedure Expected(s: string);

begin

Error(s + ' Expected');

end;

end.

{–}

Как ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ, Π²ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ:

{–}

program Test;

uses WinCRT, Input, Output, Errors;

begin

Expected('Integer');

end.

{–}

Π’Ρ‹ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ строка Β«usesΒ» Π² нашСй основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ становится Π΄Π»ΠΈΠ½Π½Π΅Π΅? Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ. Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΉ вСрсии основная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· нашСго синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ€Π°Π·Π΄Π΅Π» uses Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠ°Ρ€Ρƒ записСй. Но сСйчас Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ самоС Π»ΡƒΡ‡ΡˆΠ΅Π΅ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ всС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² Π½ΠΈΡ….

ЛСксичСский ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·

ΠšΠ»Π°ΡΡΠΈΡ‡Π΅ΡΠΊΠ°Ρ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° компилятора основана Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… модулях для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдоставляСт лСксСмы языка, ΠΈ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пытаСтся ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ смысл Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΊΠ°ΠΊ синтаксичСских элСмСнтов. Если Π²Ρ‹ Π΅Ρ‰Π΅ Π½Π΅ Π·Π°Π±Ρ‹Π»ΠΈ Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄Π΅Π»Π°Π»ΠΈ Π² Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½ΠΈΡ… Π³Π»Π°Π²Π°Ρ…, Π²Ρ‹ вспомнитС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡ‡Ρ‚ΠΈ всСгда ΡΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊΠΎΠΉ элСмСнт языка слСдуСт дальшС, всСго-лишь исслСдуя ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ символ. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Π½Π°ΠΌ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠ°ΠΊ Π΄Π΅Π»Π°Π» Π±Ρ‹ сканСр.

Но Π΄Π°ΠΆΠ΅ хотя здСсь ΠΈ Π½Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹, Π½Π°Π·Π²Π°Π½Π½ΠΎΠΉ Β«ScannerΒ», всС Π΅Ρ‰Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысл ΠΎΡ‚Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ я создал Π΅Ρ‰Π΅ Π΄Π²Π° модуля, Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ…, достаточно ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Scanner ΠΈ Parser. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Scanner содСрТит всС ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, извСстныС ΠΊΠ°ΠΊ распознаватСли. НСкоторыС ΠΈΠ· Π½ΠΈΡ…, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ IsAlpha, ΡΠ²Π»ΡΡŽΡ‚ΡΡ чисто Π±ΡƒΠ»Π΅Π²Ρ‹ΠΌΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€Π΅Π΄ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ символом. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΎΠ±ΠΈΡ€Π°ΡŽΡ‚ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ числовыС константы. ΠœΠΎΠ΄ΡƒΠ»ΡŒ Parser Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ всС ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с рСкурсивным спуском. ΠžΠ±Ρ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Parser содСрТит всю ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ для языка ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ; Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, синтаксис языка Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π² Parser. Π’ идСальном ΠΌΠΈΡ€Π΅ это ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Π²Π΅Ρ€Π½Ρ‹ΠΌ Π² Ρ‚ΠΎΠΉ стСпСни, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ компилятор для компиляции Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… языков просто замСняя СдинствСнный ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Parser.

На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅, Π΄Π΅Π»Π° ΠΏΠΎΡ‡Ρ‚ΠΈ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π²Π°ΡŽΡ‚ Ρ‚Π°ΠΊΠΈΠΌΠΈ чистыми. ВсС Π΅ΡΡ‚ΡŒ нСбольшая Β«ΡƒΡ‚Π΅Ρ‡ΠΊΠ°Β» синтаксичСских ΠΏΡ€Π°Π²ΠΈΠ» Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π² сканСр. К ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρƒ, ΠΏΡ€Π°Π²ΠΈΠ»Π° составлСния допустимого ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ константы ΠΌΠΎΠ³ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ ΠΎΡ‚ языка ΠΊ языку. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… языках ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎ коммСнтариях Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΈΠΌ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌΠΈ Π² сканСрС, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ ΠΎΠ±Π° модуля вСроятно ΠΏΡ€ΠΈΠ΄ΡƒΡ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ языко-зависимыС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, Π½ΠΎ измСнСния, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для сканнСра, Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ вспомнитС, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ использовали Π΄Π²Π΅ вСрсии ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°: ΠΎΠ΄Π½Π°, которая ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π»Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ использовали Π² рядС Π½Π°ΡˆΠΈΡ… тСстов, ΠΈ другая, которая прСдоставляСт ΠΏΠΎΠ»Π½ΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ ΠΌΠ½ΠΎΠ³ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ раздСляСм Π½Π°ΡˆΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, я Π½Π΅ оТидаю ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ ΠΎΡ‚ использования односимвольной вСрсии, Π½ΠΎ Π½Π΅ потрСбуСтся ΠΌΠ½ΠΎΠ³ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΈΡ… ΠΎΠ±Π΅. Π― создал Π΄Π²Π΅ вСрсии модуля Scanner. ΠŸΠ΅Ρ€Π²Π°Ρ, названная Scanner1, содСрТит ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ распознавания:

{–}

unit Scanner1;

{–}

interface

uses Input, Errors;

function IsAlpha(c: char): boolean;

function IsDigit(c: char): boolean;

function IsAlNum(c: char): boolean;

function IsAddop(c: char): boolean;

function IsMulop(c: char): boolean;

procedure Match(x: char);

function GetName: char;

function GetNumber: char;

{–}

implementation

{–}

{ Recognize an Alpha Character }

function IsAlpha(c: char): boolean;

begin

IsAlpha := UpCase(c) in ['A'..'Z'];

end;

{–}

{ Recognize a Numeric Character }

function IsDigit(c: char): boolean;

begin

IsDigit := c in ['0'..'9'];

end;

{–}

{ Recognize an Alphanumeric Character }

function IsAlnum(c: char): boolean;

begin

IsAlnum := IsAlpha(c) or IsDigit(c);

end;

{–}

{ Recognize an Addition Operator }

function IsAddop(c: char): boolean;

begin

IsAddop := c in ['+','-'];

end;

{–}

{ Recognize a Multiplication Operator }

function IsMulop(c: char): boolean;

begin

IsMulop := c in ['*','/'];

end;

{–}

{ Match One Character }

procedure Match(x: char);

begin

if Look = x then GetChar

else Expected('''' + x + '''');

end;

{–}

{ Get an Identifier }

function GetName: char;

begin

if not IsAlpha(Look) then Expected('Name');

GetName := UpCase(Look);

GetChar;

end;

{–}

{ Get a Number }

function GetNumber: char;

begin

if not IsDigit(Look) then Expected('Integer');

GetNumber := Look;

GetChar;

end;

end.

{–}

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ ΠΊΠΎΠ΄Π° основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ обСспСчиваСт Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Для краткости я Π²ΠΊΠ»ΡŽΡ‡ΠΈΠ» здСсь Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠΌΡ‹ΠΉ ΠΊΠΎΠ΄; ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Ρ‚ΠΎΠΆΠ΅ самоС. НС Π·Π°Π±ΡƒΠ΄ΡŒΡ‚Π΅, Ρ‚Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ имя Scanner1 Π² Ρ€Π°Π·Π΄Π΅Π» Β«usesΒ»: