ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² написании студСнчСских Ρ€Π°Π±ΠΎΡ‚
АнтистрСссовый сСрвис

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° транслятора с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подмноТСства языка высокого уровня

ΠšΡƒΡ€ΡΠΎΠ²Π°ΡΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈΠ£Π·Π½Π°Ρ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒΠΌΠΎΠ΅ΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… этапов: лСксичСского, синтаксичСского ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ичСского Π°Π½Π°Π»ΠΈΠ·ΠΎΠ², Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ машинного ΠΊΠΎΠ΄Π°. Помимо этого, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ зависит ΠΎΡ‚ ΡΠ΅Ρ€Π²ΠΈΡΠΎΠ², прСдоставляСмых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой ΠΈ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ»ΠΈ графичСский интСрфСйс), ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° транслятора с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подмноТСства языка высокого уровня (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

" Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° транслятора с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ подмноТСства языка высокого уровня" .

транслятор лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Как извСстно, Ρ†Π΅Π»ΡŒΡŽ трансляции являСтся ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ‚Скст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ понятСн адрСсату. Π’ ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ адрСсата ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΡΡ‚ΡƒΠΏΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΈ Ρ‚СхничСскоС срСдство. Π‘Π»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, с Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ΠΌ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… систСм Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° качСствСнного транслятора остаётся Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ Ρ‚Π΅ΠΌΠΎΠΉ. Π˜Π·Π²Π΅ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ транслятор ΠΈΠΌΠ΅Π΅Ρ‚ ряд характСристик:

Β· ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° исходного (Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ) тСкста.

Β· ΠšΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° всСвозмоТных ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций.

Β· Π£Π½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

Β· ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π°.

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

Β· ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ синтаксис языка Π² Π‘НЀ. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ символ ΠΈ Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ» для Π΄Π°Π½Π½ΠΎΠ³ΠΎ языка.

Β· Π‘ΠΎΠ·Π΄Π°Ρ‚ΡŒ каркас транслятора.

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Π° лСксСм.

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΊ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ польской записи.

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°.

1.ВСорСтичСская Ρ‡Π°ΡΡ‚ΡŒ.

1.1 Вранслятор.

Вранслятор — ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ»ΠΈ тСхничСскоС срСдство, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π΅Π΅ Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ЦСль трансляции — ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ тСкст с ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ понятСн адрСсату тСкста. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ-трансляторов, адрСсатом являСтся тСхничСскоС устройство (процСссор) ΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°-ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€.

Π―Π·Ρ‹ΠΊ процСссоров (ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄) ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹ΠΌ. Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ машинного язык высокого уровня, Π½ΠΎ ΠΎΠ½ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ»Π° Π² ΡΠΈΠ»Ρƒ слоТности ΠΈ Π΄ΠΎΡ€ΠΎΠ³ΠΎΠ²ΠΈΠ·Π½Ρ‹. Вранслятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ язык, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ нСпосрСдствСнно процСссором, называСтся компилятором.

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… этапов: лСксичСского, синтаксичСского ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ичСского Π°Π½Π°Π»ΠΈΠ·ΠΎΠ², Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ машинного ΠΊΠΎΠ΄Π°. Помимо этого, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ зависит ΠΎΡ‚ ΡΠ΅Ρ€Π²ΠΈΡΠΎΠ², прСдоставляСмых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой ΠΈ ΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄ ΠΈΠ»ΠΈ графичСский интСрфСйс), ΠΈ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с ΡΡ‚ΠΈΠΌΠΈ сСрвисами. БвязываниС со ΡΡ‚атичСскими Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ выполняСтся Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ΠΎΠΌ связСй ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ (ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ собой ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΈΠ»ΠΈ Π±Ρ‹Ρ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒΡŽ компилятора), Π° Ρ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΠΈΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ связываниС выполняСтся ΠΏΡ€ΠΈ Π½Π°Ρ‡Π°Π»Π΅ исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠΎΠΌ.

Достоинство компилятора: ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· ΠΈ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π½Π΅ Ρ‚рСбуСтся Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠΉ. БоотвСтствСнно, Π½Π΅ Ρ‚рСбуСтся Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ компилятора Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΉ машинС, для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ компилируСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°. НСдостаток: ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ этап компиляции замСдляСт написаниС ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΡƒ ΠΈ Π·Π°Ρ‚рудняСт исполнСниС Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ…, нСслоТных ΠΈΠ»ΠΈ Ρ€Π°Π·ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

1.2 ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Π’ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ лСксичСский Π°Π½Π°Π»ΠΈΠ· — процСсс аналитичСского Ρ€Π°Π·Π±ΠΎΡ€Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠ°ΠΊ исходный ΠΊΠΎΠ΄ Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· ΡΠ·Ρ‹ΠΊΠΎΠ² программирования) с Ρ†Π΅Π»ΡŒΡŽ получСния Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹Ρ… «Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ» (ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ΅ Π±ΡƒΠΊΠ² Π² ΡΠ»ΠΎΠ²Π°). Π“Ρ€ΡƒΠΏΠΏΠ° символов Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, идСнтифицируСмая Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ процСсса ΠΊΠ°ΠΊ Ρ‚ΠΎΠΊΠ΅Π½, называСтся лСксСмой. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° производится распознаваниС ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксСм ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ символов.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, лСксичСский Π°Π½Π°Π»ΠΈΠ· производится с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠ³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ языка ΠΈΠ»ΠΈ Π½Π°Π±ΠΎΡ€Π° языков. Π―Π·Ρ‹ΠΊ, Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅ Π΅Π³ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°, Π·Π°Π΄Π°Ρ‘Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ лСксСм, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π²ΡΡ‚Ρ€Π΅Ρ‚ΠΈΡ‚ΡŒΡΡ Π½Π° Π²Ρ…ΠΎΠ΄Π΅ процСсса.

Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ принято ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ процСсс лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°, рассматривая Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов ΠΊΠ°ΠΊ ΠΏΠΎΡ‚ΠΎΠΊ символов. ΠŸΡ€ΠΈ Ρ‚Π°ΠΊΠΎΠΉ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсс ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ управляСт Π²Ρ‹Π±ΠΎΡ€ΠΊΠΎΠΉ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°. РаспознаваниС лСксСм Π² ΠΊΠΎΠ½Ρ‚СкстС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ производится ΠΏΡƒΡ‚Ρ‘ΠΌ ΠΈΡ… ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ классификации) согласно ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌ (ΠΈΠ»ΠΈ классам) Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², опрСдСляСмых Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ языка. ΠŸΡ€ΠΈ этом любая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (лСксСма), которая согласно Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π° ΠΊΠ°ΠΊ Ρ‚ΠΎΠΊΠ΅Π½ языка, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ рассматриваСтся ΠΊΠ°ΠΊ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉΡ‚ΠΎΠΊΠ΅Π½-ошибка.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅ структуры, содСрТащСй ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Ρ‚ΠΎΠΊΠ΅Π½Π° (ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ класса Ρ‚ΠΎΠΊΠ΅Π½Π°) ΠΈ, Ссли Π½ΡƒΠΆΠ½ΠΎ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов лСксСмы, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΠΎΠΉ ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ°.

ЦСль Ρ‚Π°ΠΊΠΎΠΉ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚ΡŒ Π²Ρ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ для Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для грамматичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΈ ΠΈΠ·Π±Π°Π²ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ лСксичСских подробностСй Π² ΠΊΠΎΠ½Ρ‚Скстно-свободной Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ (Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΎ Π±Ρ‹ ΠΊ ΡƒΡΠ»ΠΎΠΆΠ½Π΅Π½ΠΈΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ).

1.3 БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Π’ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΠΊΠ΅, синтаксичСский Π°Π½Π°Π»ΠΈΠ· — это процСсс сопоставлСния Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ лСксСм (слов, Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²) языка с Π΅Π³ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° (синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся совмСстно с Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (парсСр) — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΠ»ΠΈ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ синтаксичСский Π°Π½Π°Π»ΠΈΠ·.

ΠŸΡ€ΠΈ парсингС исходный тСкст прСобразуСтся Π² ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ — Π² Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΎΡ‚Ρ€Π°ΠΆΠ°Π΅Ρ‚ ΡΠΈΠ½Ρ‚Π°ΠΊΡΠΈΡ‡Π΅ΡΠΊΡƒΡŽ структуру Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° являСтся синтаксичСская структура прСдлоТСния, прСдставлСнная Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° зависимостСй, Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ Π΄Π΅Ρ€Π΅Π²Π° ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΡ…, Π»ΠΈΠ±ΠΎ Π² Π²ΠΈΠ΄Π΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ способов прСдставлСния.

1.4 Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°.

ПослСднСй Ρ„Π°Π·ΠΎΠΉ компиляции являСтся гСнСрация ΠΊΠΎΠ΄Π°. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ выполнСния этой Ρ„Π°Π·Ρ‹ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π² Π²Ρ‹ΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹Ρ… ΠΊΠΎΠ΄Π°Ρ… Ρ‚ΠΎΠΉ Π­Π’Πœ, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ. Однако Π² Ρ€ΡΠ΄Π΅ случаСв Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка транслятора ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ассСмблСр. Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСра. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡ΠΈΡ‚ΡŒ написаниС Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠ΄ΠΈΡ‚ΡŒ Π΅Π³ΠΎ ΠΎΡ‚ ΠΏΠΎΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΡ… сообраТСний, связанных с ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ особСнностями ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Π­Π’Πœ, Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ гипотСтичСский процСссор (Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΌΠ°ΡˆΠΈΠ½Ρƒ). Π­Ρ‚ΠΎΡ‚ процСссор Π½Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π½Π° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ (Π² Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅). ΠŸΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ Π΅Π³ΠΎ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ максимальная простота ΠΈ, Π² Ρ‚ΠΎ ΠΆΠ΅ врСмя, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π³ΠΊΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π½Π° Π½Π΅ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡΠ·Ρ‹ΠΊΠ°Ρ…, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ выполнСния Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹Ρ… Ρ€Π°Π±ΠΎΡ‚ ΠΈ ΠΊΡƒΡ€ΡΠΎΠ²ΠΎΠ³ΠΎ проСктирования. ΠžΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ всС дСйствия Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π΄ элСмСнтами Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π² Π°Ρ€ΠΈΡ„мСтичСских ΠΈ Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΠΈΡ… опСрациях Π½Π΅Ρ‚ нСобходимости Π² ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΈ адрСса ΠΎΠΏΠ΅Ρ€Π°Π½Π΄ΠΎΠ². Если опСрация ΠΈΠΌΠ΅Π΅Ρ‚ 2 ΠΎΠΏΠ΅Ρ€Π°Π½Π΄Π°, Ρ‚ΠΎ Π΅Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ пСрСнос элСмСнта ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€-аккумулятор ΠΈ «ΠΏΠΎΠ½ΠΈΠΆΠ΅Π½ΠΈΠ΅» Π½Π° ΠΎΠ΄ΠΈΠ½ элСмСнт Π²Π½ΠΈΠ· указатСля стСка. Π’Ρ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Π½Π΄, оказавшийся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка, подаСтся нСпосрСдствСнно Π² ΠΠ›Π£. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка вмСсто Π½Π΅Π³ΠΎ.

2.ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ.

2.1 Бинтаксис языка Π² БНЀ. Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ символ ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π’Π°Ρ€ΠΈΠ°Π½Ρ‚ задания:

<οΏ½ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°> := <�ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…><�ОписаниС вычислСний><�ОписаниС вычислСний> := Begin<�Бписок присваиваний>End<�ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…> := Int<�Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…> |.

Int<�Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…><�ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…>

<�Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…> := <οΏ½Π˜Π΄Π΅Π½Ρ‚>; | <οΏ½Π˜Π΄Π΅Π½Ρ‚> ,<�Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…><�Бписок присваиваний>:= <οΏ½ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅> |.

<οΏ½ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅><�Бписок присваиваний><οΏ½ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅> := <οΏ½Π˜Π΄Π΅Π½Ρ‚> := <οΏ½Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> ;

<οΏ½Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> := <οΏ½Π£Π½.ΠΎΠΏ.><οΏ½ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅> | <οΏ½ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅><οΏ½ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>: = (<οΏ½Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>) | <οΏ½ΠžΠΏΠ΅Ρ€Π°Π½Π΄> |.

< ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ><οΏ½Π‘ΠΈΠ½.ΠΎΠΏ.><οΏ½ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

<οΏ½Π£Π½.ΠΎΠΏ.> := «-» .

<οΏ½Π‘ΠΈΠ½.ΠΎΠΏ.> := «-» | «+» | «*» | «/» .

<οΏ½ΠžΠΏΠ΅Ρ€Π°Π½Π΄> := <οΏ½Π˜Π΄Π΅Π½Ρ‚> |.

<οΏ½Π˜Π΄Π΅Π½Ρ‚> := <οΏ½Π‘ΡƒΠΊΠ²Π°><οΏ½Π˜Π΄Π΅Π½Ρ‚> | <οΏ½Π‘ΡƒΠΊΠ²Π°>

:= <οΏ½Π¦ΠΈΡ„Ρ€Π°> | <οΏ½Π¦ΠΈΡ„Ρ€Π°>

Π€ΠΎΡ€ΠΌΠ° БСкуса — Наура — Π½Π°Π±ΠΎΡ€ ΠΏΡ€Π°Π²ΠΈΠ», ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΠΌ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ любоС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅.

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° опрСдСляСтся, ΠΊΠ°ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ Ρ‡Π΅Ρ‚Π²Π΅Ρ€ΠΊΠ° Vt — Π°Π»Ρ„Π°Π²ΠΈΡ‚, символы ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ ΠΈΠ· Π½ΠΈΡ… строятся Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ; VnΠ°Π»Ρ„Π°Π²ΠΈΡ‚, символы ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ называСтся Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ (Π½Π΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°ΠΌΠΈ), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ построСнии Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ. P — Набор ΠΏΡ€Π°Π²ΠΈΠ», ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ строится Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°; S — Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ.

НСтСрминалы:

N={.

S=<οΏ½ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°>

D=<�ОбъявлСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…>

F=<�ОписаниС вычислСний>

P=<οΏ½ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ>

V=<�Бписок ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…>

I=<οΏ½Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€>

G=<�Бписок присваиваний>

A=<οΏ½ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅>

E=<οΏ½Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

H=<οΏ½ΠŸΠΎΠ΄Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

O=<οΏ½ΠžΠΏΠ΅Ρ€Π°Π½Π΄>

C=.

N=<οΏ½Π¦ΠΈΡ„Ρ€Π°>

}.

Π’Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹:

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ΡΠ»ΠΎΠ²Π°ΡΠ·Ρ‹ΠΊΠ°:

T={begin, end, integer, print}.

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ:

R={:=, .();}.

Алфавит:

A=…

Π‘ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

B=;

Унарная опрСация:

U={-}.

Π¦ΠΈΡ„Ρ€Ρ‹:

C=…

ΠŸΡ€Π°Π²ΠΈΠ»Π°:

1. S=DF.

2. F=begin G end.

3. G=A.

4. G=AG.

5. A=I:=E.

6. I=LI.

7. I=L.

8. E=UH.

9. E=H.

10. H=(E).

11. H=O.

12. H= HBH.

13. O=I.

14. O=C.

15. C=NC.

16. C=N.

17. D=integer V.

18. V=I;

19. V=I, V.

20. P=print I.

2.2 ΠšΠ°Ρ€ΠΊΠ°Ρ транслятора.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, транслятор состоит ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ², ΠΊ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ относятся парсСр Ρ„Π°ΠΉΠ»ΠΎΠ² исходного языка, Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°.

Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ классы ΠΈ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠ΅ΠΌ для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ всСх частСй транслятора:

.

.

///ΠŸΠ°Ρ€ΡΠ΅Ρ€

publicstaticclassReader.

.

.

///ЛСксичСскийанализатор

publicstaticclassLexicalAnalyzer.

.

.

///ЛСксСмы.

publicenumLexems.

{.

None, Name, Number, Begin, End, Multiplication, Division,.

Plus, Minus, Equal, NotEqual, Less, LessOrEqual, More, MoreOrEqual, Int,.

Print, LeftBracket, RightBracket, Semi, Comma, EOF, Determine,.

LongInt, Until, Do, EndUntil.

}.

.

.

///ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ΡΠ»ΠΎΠ²ΠΎ.

internalstructKeyWord.

{.

publicstring word;

publicLexemslex;

}.

.

.

///ΠšΠ°Ρ‚Π΅Π³ΠΎΡ€ΠΈΡ.

publicenumtCat.

{.

Const, Var, Type.

}.

.

.

///Π’ΠΈΠΏ.

publicenumtType.

{.

None, Int, LInt, Bool.

}.

.

.

///Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

publicstructIdentificator.

{.

publicstring name;

publictCat category;

publictType type;

}.

.

.

///Π’Π°Π±Π»ΠΈΡ†Π°ΠΈΠΌΠ΅Π½.

publicstaticclassNameTable.

.

.

///БинтаксичСскийанализатор

publicstaticclassSyntaxAnalyzer.

.

.

/// Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ постфиксной записи.

publicstaticclassPostFix.

.

.

///Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΊΠΎΠ΄Π°.

publicstaticclassCodeGenerator.

Π”Π°Π»ΡŒΡˆΠ΅ создаСм Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΉ для ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ интСрфСйс (рис.1), с Π²Π΅Ρ€Ρ…Π½ΠΈΠΌ мСню:

Рис. 1 Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ прилоТСния.

2.3 ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

Для задания Ρ‚ΠΈΠΏΠ° лСксСмы ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ пСрСчислСниС, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ Π² ΡΠ΅Π±Ρ всС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ языкС Ρ‚ΠΈΠΏΡ‹: ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Ρ‡ΠΈΡΠ»Π°.

publicenumLexems.

{.

None, Name, Number, Begin, End, Multiplication, Division,.

Plus, Minus, Equal, NotEqual, Less, LessOrEqual, More, MoreOrEqual, Int,.

Print, LeftBracket, RightBracket, Semi, Comma, EOF, Determine,.

LongInt, Until, Do, EndUntil.

}.

Π”Π°Π»Π΅Π΅ создаСм ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ структуру, ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π΄Π°Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ лСксСмы:

.

.

///ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ΡΠ»ΠΎΠ²ΠΎ.

internalstructKeyWord.

{.

publicstring word;

publicLexemslex;

}.

publicstaticvoid Initialize ().

{.

keywords = newKeyWord[10];

keywordPointer = 0;

currentLexem = 0;

currentName = null;

AddKeyword («Begin», Lexems. Begin);

AddKeyword («End», Lexems. End);

AddKeyword («Integer», Lexems.Int);

AddKeyword («Long Integer», Lexems. LongInt);

AddKeyword («Print», Lexems. Print);

AddKeyword («UNTIL», Lexems. Until);

AddKeyword («DO», Lexems. Do);

AddKeyword («ENDUNTIL», Lexems. EndUntil);

}.

Π’ Ρ€Π°ΠΌΠΊΠ°Ρ… класса LexicalAnalyzerΠ±ΡƒΠ΄Π΅ΠΌ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°: Ρ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов языка ΠΈ ΠΈΡ… Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅, Ρ€Π°Π·Π±ΠΎΡ€ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ лСксСмы Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Π΅Ρ‘ Ρ‚ΠΈΠΏΠ°.

.

.

///ЛСксичСскийанализатор

publicstaticclassLexicalAnalyzer.

{.

privatestaticKeyWord[] keywords;

privatestaticintkeywordPointer;

privatestaticstringcurrentName;

privatestaticLexemscurrentLexem;

.

.

///Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

publicstaticvoid Initialize ().

{.

keywords = newKeyWord[10];

keywordPointer = 0;

currentLexem = 0;

currentName = null;

AddKeyword («Begin», Lexems. Begin);

AddKeyword («End», Lexems. End);

AddKeyword («Integer», Lexems.Int);

AddKeyword («Long Integer», Lexems. LongInt);

AddKeyword («Print», Lexems. Print);

AddKeyword («UNTIL», Lexems. Until);

AddKeyword («DO», Lexems. Do);

AddKeyword («ENDUNTIL», Lexems. EndUntil);

}.

.

.

///ВСкущССимя.

publicstaticstringCurrentName.

{.

get.

{.

returncurrentName;

}.

}.

.

.

///ВСкущаялСксСма.

publicstaticLexemsCurrentLexem.

{.

get.

{.

returncurrentLexem;

}.

}.

.

.

///Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ΡΠ»ΠΎΠ²ΠΎ.

///слово.

///лСксСма.

publicstaticboolAddKeyword (string keyword, Lexemslex).

{.

if (keywordPointer.

{.

KeyWord kw = newKeyWord ();

kw.word = keyword;

kw.lex = lex;

keywords[keywordPointer++] = kw;

returntrue;

}.

returnfalse;

}.

.

.

///ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ΡΠ»ΠΎΠ²ΠΎ.

///слово.

publicstaticLexemsGetKeyword (string keyword).

{.

for (inti = keywordPointer — 1; i>= 0; i—).

{.

if (keywords[i]. word == keyword).

{.

return keywords[i]. lex;

}.

}.

returnLexems.Name;

}.

.

.

///Π Π°Π·ΠΎΡŒΡ€Π°Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ лСксСму.

publicstaticvoidParseNextLexem ().

{.

while (char.IsWhiteSpace (Reader.CurrentChar)).

Reader.ReadNextChar ();

if (char.IsLetter (Reader.CurrentChar)).

ParseIdentificator ();

elseif (char.IsDigit (Reader.CurrentChar)).

ParseNumber ();

elseif (Reader.CurrentChar == 'n').

{.

Reader.ReadNextChar ();

currentLexem = Lexems. None;

}.

elseif (Reader.CurrentChar == '<').

{.

Reader.ReadNextChar ();

if (Reader.CurrentChar == '=').

{.

Reader.ReadNextChar ();

currentName = «<=»;

currentLexem = Lexems. LessOrEqual;

}.

else.

{.

currentName = «<» ;

currentLexem = Lexems. Less;

}.

}.

elseif (Reader.CurrentChar == '>').

{.

Reader.ReadNextChar ();

if (Reader.CurrentChar == '=').

{.

Reader.ReadNextChar ();

currentName = «>=»;

currentLexem = Lexems. MoreOrEqual;

}.

else.

{.

currentName = «>» ;

currentLexem = Lexems. More;

}.

}.

elseif (Reader.CurrentChar == '=').

{.

Reader.ReadNextChar ();

if (Reader.CurrentChar == '=').

{.

Reader.ReadNextChar ();

currentName = «==»;

currentLexem = Lexems. Equal;

}.

else.

{.

currentName = «=»;

currentLexem = Lexems. Determine;

}.

}.

elseif (Reader.CurrentChar == '!').

{.

Reader.ReadNextChar ();

if (Reader.CurrentChar == '=').

{.

Reader.ReadNextChar ();

currentName = «≠»;

currentLexem = Lexems. NotEqual;

}.

else.

Errors.Error («ΠΠ΅ΠΈΠ·Π²Π΅ΡΡ‚Π½Ρ‹ΠΉ символ»);

}.

elseif (Reader.CurrentChar == '+').

{.

Reader.ReadNextChar ();

currentName = «+» ;

currentLexem = Lexems. Plus;

}.

elseif (Reader.CurrentChar == '*').

{.

Reader.ReadNextChar ();

currentName = «*» ;

currentLexem = Lexems. Multiplication;

}.

elseif (Reader.CurrentChar == '/').

{.

Reader.ReadNextChar ();

currentName = «/» ;

currentLexem = Lexems. Division;

}.

elseif (Reader.CurrentChar == ',').

{.

Reader.ReadNextChar ();

currentName = «,» ;

currentLexem = Lexems. Comma;

}.

elseif (Reader.CurrentChar == ';').

{.

Reader.ReadNextChar ();

currentName = «;» ;

currentLexem = Lexems. Semi;

}.

elseif (Reader.CurrentChar == '(').

{.

Reader.ReadNextChar ();

currentName = «(«;

currentLexem = Lexems. LeftBracket;

}.

elseif (Reader.CurrentChar == ')').

{.

Reader.ReadNextChar ();

currentName = «)» ;

currentLexem = Lexems. RightBracket;

}.

elseif (Reader.CurrentChar == char. MinValue).

{.

currentName = «EOF» ;

currentLexem = Lexems. EOF;

}.

else.

Errors.Error («ΠΠ΅Π΄ΠΎΠΏΡƒΡΡ‚ΠΈΠΌΡ‹ΠΉ символ!»);

}.

.

.

///Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

privatestaticvoidParseIdentificator ().

{.

stringidentificator = string. Empty;

int count = 0;

do.

{.

identificator += Reader. CurrentChar;

if (identificator == «Long»).

{.

Reader.ReadNextChar ();

identificator += Reader. CurrentChar;

count++;

}.

Reader.ReadNextChar ();

if (++count > 20).

Errors.Error («Chars overflow»);

}.

while (char.IsLetter (Reader.CurrentChar));

currentName = identificator;

currentLexem = GetKeyword (identificator);

}.

.

.

///Π Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡ‡ΠΈΡΠ»ΠΎ.

privatestaticvoidParseNumber ().

{.

string number = string. Empty;

do.

{.

number += Reader. CurrentChar;

Reader.ReadNextChar ();

}.

while (char.IsDigit (Reader.CurrentChar));

try.

{.

Int32.Parse (number);

}.

catch (OverflowException).

{.

Errors.Error («ΠΠ΅ ΡΠ²Π»ΡΠ΅Ρ‚ся числом»);

}.

currentName = number;

currentLexem = Lexems. Number;

}.

}.

2.3 БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€.

ПослС Ρ‚ΠΎΠ³ΠΎ ΠΊΠ°ΠΊ Π±Ρ‹Π» создан класс classReader, Π΄Π°Π»Π΅Π΅ Π½Π°Ρ‡Π½Π΅ΠΌ Π·Π°ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΠΎΠΌ.

НапишСм класс ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ, которая Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π²Π΅Ρ‡Π°Ρ‚ΡŒ Π·Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ выраТСния Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΡƒΡŽ ΠΏΠΎΠ»ΡŒΡΠΊΡƒΡŽ запись:

publicstaticclassPostFix.

{.

privatestaticList res;

privatestaticStack stack;

.

.

///Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

publicstaticvoid Initialize ().

{.

res = newList ();

stack = newStack ();

}.

.

.

///Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ.

publicstaticvoid Add (Lexemslexem).

{.

switch (lexem).

{.

caseLexems.Name:

{.

string temp = LexicalAnalyzer. CurrentName;

res.Add (temp);

}.

break;

caseLexems.Number:

{.

string temp = LexicalAnalyzer. CurrentName;

res.Add (temp);

}.

break;

caseLexems.LeftBracket:

{.

stack.Push (Lexems.LeftBracket);

}.

break;

caseLexems.RightBracket:

{.

while (stack.Peek () ≠ Lexems. LeftBracket).

{.

res.Add (ConvertToString (stack.Pop ()));

}.

stack.Pop ();

}.

break;

caseLexems.Minus:

caseLexems.Plus:

{.

Lexemslex = newLexems ();

if (stack.Count> 0).

lex = stack. Peek ();

while (lex == Lexems.Plus.

|| lex == Lexems.Minus.

|| lex == Lexems.Multiplication.

|| lex == Lexems. Division).

{.

res.Add (ConvertToString (stack.Pop ()));

if (stack.Count> 0).

lex = stack. Peek ();

else.

break;

}.

stack.Push (lexem);

}.

break;

caseLexems.Multiplication:

caseLexems.Division:

{.

Lexemslex = newLexems ();

if (stack.Count> 0).

lex = stack. Peek ();

while (lex == Lexems.Multiplication.

|| lex == Lexems. Division).

{.

res.Add (ConvertToString (stack.Pop ()));

if (stack.Count> 0).

lex = stack. Peek ();

else.

break;

}.

stack.Push (lexem);

}.

break;

caseLexems.Determine:

{.

stack.Push (lexem);

}.

break;

}.

}.

Π”Π°Π»Π΅Π΅ создаСм Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… частСй исходного ΠΊΠΎΠ΄Π°: Π‘Π»ΠΎΠΊ объявлСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π±Π»ΠΎΠΊ нСпосрСдствСнно выполнСния ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ опСрация, Π±Π»ΠΎΠΊ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ, Π±Π»ΠΎΠΊ Ρ†ΠΈΠΊΠ»Π° UNTIL.

publicstaticvoidCompille ().

{.

PostFix.Initialize ();

CodeGenerator.DeclairDataSegment ();

LexicalAnalyzer.Initialize ();

NameTable.Initialize ();

ParseVariables ();

CodeGenerator.DeclairVariables ();

CodeGenerator.DeclairSegmentOfStackAndCode ();

CheckLexem (Lexems.Semi);

if (LexicalAnalyzer.CurrentLexem == Lexems. Begin).

LexicalAnalyzer.ParseNextLexem ();

ParseInstructionSequence ();

CheckLexem (Lexems.End);

CodeGenerator.DeclairEndMainProc ();

CodeGenerator.DeclairPrint ();

CodeGenerator.DeclairCodeEnd ();

if (Errors.ErrorsCount == 0).

Errors.Error («Compille success»);

}.

publicstaticvoidParseCycle ().

{.

CheckLexem (Lexems.Until);

CodeGenerator.AddLabel ();

stringupperLabel = CodeGenerator. GetCurrentLabel ();

CodeGenerator.AddLabel ();

stringlowerLabel = CodeGenerator. GetCurrentLabel ();

CodeGenerator.AddInstruction (upperLabel + «:»);

ParseExpression ();

CheckLexem (Lexems.Do);

ParseInstructionSequence ();

CheckLexem (Lexems.EndUntil);

CodeGenerator.AddInstruction («jmp «+ upperLabel);

CodeGenerator.AddInstruction (lowerLabel + «:»);

}.

staticvoidParseVariables ().

{.

CheckLexem (Lexems.None);

CheckLexem (Lexems.Int);

if (LexicalAnalyzer.CurrentLexem ≠ Lexems.Name).

Errors.Error («ΠΠ΅ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ»);

else.

{.

NameTable.AddIdentificator (LexicalAnalyzer.CurrentName, tCat. Var);

LexicalAnalyzer.ParseNextLexem ();

}.

while (LexicalAnalyzer.CurrentLexem == Lexems. Comma).

{.

LexicalAnalyzer.ParseNextLexem ();

if (LexicalAnalyzer.CurrentLexem ≠ Lexems.Name).

Errors.Error («ΠΠ΅ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ»);

else.

{.

NameTable.AddIdentificator (LexicalAnalyzer.CurrentName, tCat. Var);

LexicalAnalyzer.ParseNextLexem ();

}.

}.

2.4 Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΊΠΎΠ΄Π°.

LITconst — ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒΠΊΠΎΠ½ΡΡ‚Π°Π½Ρ‚ΡƒΠ²Π²Π΅Ρ€ΡˆΠΈΠ½ΡƒΡΡ‚Π΅ΠΊΠ°.

LOAD n — ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π½ΡƒΡŽ ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ n Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

STO n — запись значСния ΠΈΠ· Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ n (присваиваниС).

JMP k — бСзусловный ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k.

JEQ k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k Π² ΡΠ»ΡƒΡ‡Π°Π΅ равСнства Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка.

JLT k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k, Ссли число Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка мСньшС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ числа стСка.

JLE k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k, Ссли число Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка мСньшС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π·Π° Π½ΠΈΠΌ числу стСка.

JGT k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k, Ссли число Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка большС ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ числа стСка.

JGE k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k, Ссли число Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка большС ΠΈΠ»ΠΈ Ρ€Π°Π²Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ Π·Π° Π½ΠΈΠΌ числу стСка.

JNE k — ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π΅, располоТСнной ΠΏΠΎ Π°Π΄Ρ€Π΅ΡΡƒ k Π² ΡΠ»ΡƒΡ‡Π°Π΅ нСравСнства Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка.

ADR — содСрТимоС рСгистра адрСса Π΄Π°Π½Π½Ρ‹Ρ… помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

STAD — содСрТимоС Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹ стСка помСщаСтся Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ адрСса Π΄Π°Π½Π½Ρ‹Ρ….

ADD — слоТСниС Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

MUL — ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

SUB — Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½ΠΈΠ΅ элСмСнта Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ элСмСнта стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

DIV — Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ элСмСнта стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

AND — логичСскоС «Π˜» (логичСскоС ΡƒΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΠ΅) Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

OR — логичСскоС «Π˜Π›Π˜» (логичСскоС слоТСниС) Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка.

DIV — Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ Π·Π° Π½ΠΈΠΌ.

XOR — слоТСниС ΠΏΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΡŽ 2 Π΄Π²ΡƒΡ… Π²Π΅Ρ€Ρ…Π½ΠΈΡ… элСмСнтов стСка, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ помСщаСтся Π² Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ стСка. NOT — знаковая инвСрсия элСмСнта Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка.

NOL — поразрядная логичСская инвСрсия элСмСнта Π² Π²Π΅Ρ€ΡˆΠΈΠ½Π΅ стСка. NOP — пустая опСрация .

Π’Π°ΠΊ ΠΊΠ°ΠΊ наш транслятор являСтся ΠΎΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΌ, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° Π±ΡƒΠ΄ΡƒΡ‚ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒΡΡ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. По ΠΌΠ΅Ρ€Π΅ выполнСния синтаксичСского Ρ€Π°Π·Π±ΠΎΡ€Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈ Π°ΡΡΠ΅ΠΌΠ±Π»Π΅Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Для удобства Π±ΡƒΠ΄Π΅ΠΌ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ строк.

.

.

/// Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π°.

publicstaticclassCodeGenerator.

{.

privateconstint MAX_NUMBER_STRINGS = 1000;

privatestaticstring[] code = newstring[MAX_NUMBER_STRINGS];

privatestaticintcodePointer = 0;

privatestaticintcountLabels = 0;

.

.

///Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΠΈΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡŽ.

publicstaticvoidAddInstruction (stringinstraction).

{.

code[codePointer++] = instraction;

}.

.

.

///Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒΠΌΠ΅Ρ‚ΠΊΡƒ.

publicstaticvoidAddLabel ().

{.

countLabels++;

}.

.

.

///Π’Π΅Ρ€Π½ΡƒΡ‚ΡŒΡ‚Π΅ΠΊΡƒΡ‰ΡƒΡŽΠΌΠ΅Ρ‚ΠΊΡƒ.

publicstaticstringGetCurrentLabel ().

{.

return" label" + countLabels. ToString ();

}.

.

.

///ΠžΠΏΠΈΡΠ°Ρ‚ΡŒΡΠ΅Π³ΠΌΠ΅Π½Ρ‚Π΄Π°Π½Π½Ρ‹Ρ….

publicstaticvoidDeclairDataSegment ().

{.

AddInstruction («data segment para public «data» «);

}.

.

.

/// ΠžΠΏΠΈΡΠ°Ρ‚ΡŒ сСгмСнт стэка ΠΈ ΠΊΠΎΠ΄Π°.

publicstaticvoidDeclairSegmentOfStackAndCode ().

{.

AddInstruction («PRINT_BUF DB ' ' DUP (10)»);

AddInstruction («BUFEND DB '$'»);

AddInstruction («data ends»);

AddInstruction («stk segment stack»);

AddInstruction («db 256 dup („?“)»);

AddInstruction («stk ends»);

AddInstruction («code segment para public «code» «);

AddInstruction («main proc»);

AddInstruction («assume cs: code, ds: data, ss: stk»);

AddInstruction («movax, data»);

AddInstruction («movds, ax»);

}.

.

.

/// ΠžΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅Ρ† Π³Π»Π°Π²Π½ΠΎΠΉ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹.

publicstaticvoidDeclairEndMainProc ().

{.

AddInstruction («mov ax, 4c00h»);

AddInstruction («int 21h»);

AddInstruction («main endp»);

}.

.

.

/// ΠžΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Π΅ΠΉ сСгмСнта ΠΊΠΎΠ΄Π°.

publicstaticvoidDeclairCodeEnd ().

{.

AddInstruction («code ends»);

AddInstruction («end main»);

}.

.

.

///ΠžΠΏΠΈΡΠ°Ρ‚ΡŒΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅.

publicstaticvoidDeclairVariables ().

{.

LinkedListNode node = NameTable.GetIdentificators.First;

while (node ≠ null).

{.

if (SyntaxAnalyzer.Type == tType.Int).

AddInstruction (node.Value.name + «dw 1»);

if (SyntaxAnalyzer.Type == tType. LInt).

AddInstruction (node.Value.name + «dl 1»);

node = node. Next;

}.

}.

.

.

///ΠžΠΏΠΈΡ‡Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ Π²Ρ‹Π²ΠΎΠ΄Π° Π½Π° ΠΏΠ΅Ρ‡Π°Ρ‚ΡŒ.

publicstaticvoidDeclairPrint ().

{.

AddInstruction («PRINT PROC NEAR»);

AddInstruction («MOV CX, 10»);

AddInstruction («MOV DI, BUFEND — PRINT_BUF»);

AddInstruction («PRINT_LOOP:»);

AddInstruction («MOV DX, 0»);

AddInstruction («DIV CX»);

AddInstruction («ADD DL, '0'»);

AddInstruction («MOV [PRINT_BUF + DI — 1], DL»);

AddInstruction («DEC DI»);

AddInstruction («CMP AL, 0»);

AddInstruction («JNE PRINT_LOOP»);

AddInstruction («LEA DX, PRINT_BUF»);

AddInstruction («ADD DX, DI»);

AddInstruction («MOV AH, 09H»);

AddInstruction («INT 21H»);

AddInstruction («RET»);

AddInstruction («PRINT ENDP»);

}.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ арифмСтичСских (ΠΈ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ) ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² ΡΠ·Ρ‹ΠΊΠ΅ ассСмблСр ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ€Π°Π±ΠΎΡ‚Π° с Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ. Π’Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Ρ‡ΠΈΡΠ»ΠΎΠ²ΡƒΡŽ константу ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ) Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ инструкция mov. ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ для арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ Π½ΠΈΠΆΠ΅.

Π’Π°Π±Π»ΠΈΡ†Π°.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΡ.

Π˜Π½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΡ ассСмблСра.

add.

;

sub.

*.

mul.

div.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΠΊΠΎΠ΄ для выраТСния a + b Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

mov ax, a.

movbx b.

addax, bx.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ этой ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄ Π±ΡƒΠ΄Π΅Ρ‚ сохранСн Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€Π΅ ax. Но Π² ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΠΈ со ΡΠ»ΠΎΠΆΠ½Ρ‹ΠΌΠΈ выраТСниями Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΄Π΅-Ρ‚ΠΎ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. Для этих Ρ†Π΅Π»Π΅ΠΉ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ассСмблСрный стСк: инструкция push — ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ значСния рСгистра Π½Π° Π²Π΅Ρ€Ρ…ΡƒΡˆΠΊΡƒ стСка, pop — ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· ΡΡ‚Π΅ΠΊΠ° Π² Ρ€Π΅Π³ΠΈΡΡ‚Ρ€. ПослС ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π°Ρ‚ΠΎΠΌΠ°Ρ€Π½ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΡΡ‚Π΅ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΡΡ‚ΡŒ Π΅Π³ΠΎ.

3.ВСстированиС прилоТСния.

Π’Π°ΠΊ ΠΊΠ°ΠΊ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ошибки Π½Π° Π»ΡŽΠ±ΠΎΠΌ ΠΈΠ· Ρ‚Ρ€Π΅Ρ… этапов выполнСния, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. Π‘ΡƒΠ΄Π΅ΠΌ ΠΏΠΎΠ΄Π°Π²Π°Ρ‚ΡŒ Π΅ΠΉ Π½Π° Π²Ρ…ΠΎΠ΄ нСсколько ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠ² исходного ΠΊΠΎΠ΄Π°, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ, Ρ‚Π°ΠΊ ΠΈ Π·Π°Π²Π΅Π΄ΠΎΠΌΠΎ Π½Π΅ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ этапы выполнСния.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1:

Inta, s, r;

Begin.

a=c+b;

Print a;

End.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

Π’Π°Π±Π»ΠΈΡ†Π° ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2:

Integer a, s, r;

Begin.

s=5;

r=9;

u=0;

a=s+r;

s=((a*4)/2)ggg*r+10;

EndΠ Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π’Π°Π±Π»ΠΈΡ†Π°.

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅.

Π’ Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Π΅ Π±Ρ‹Π»Π° рассмотрСна Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° транслятора, Π² ΡΡ€Π΅Π΄Π΅ VisualStudio 2008, Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C#.

ΠŸΠΎΡΡ‚Π°Π²Π»Π΅Π½Π½Π°Ρ Ρ†Π΅Π»ΡŒ Π±Ρ‹Π»Π° достигнута ΠΏΡƒΡ‚Ρ‘ΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‡:

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ошибок Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС трансляции.

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ с ΠΎΡ‚Π»Π°Π²Π»ΠΈΠ²Π°Π½ΠΈΠ΅ΠΌ ошибок Π½Π° Π΄Π°Π½Π½ΠΎΠΌ этапС трансляции.

Β· ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ ΠΊΠΎΠ΄Π° основных Π±Π»ΠΎΠΊΠΎΠ² исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠΌΡƒ языку, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±Π»ΠΎΠΊΠΎΠ² SWITCH ΠΈ WHILE.

Β· ΠŸΡ€ΠΎΠ²Π΅Π΄Π΅Π½ΠΎ тСстированиС прилоТСния, для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

Β· .

ΠŸΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ вСсь тСкст
Π—Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ„ΠΎΡ€ΠΌΡƒ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ