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

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° компилятора языка Π‘++

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

НаиболСС эффСктивныС нисходящиС ΠΈ Π²ΠΎΡΡ…одящиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΡΡ‚ΠΈΡ… классов, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ LLΠΈ LR-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, достаточно Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ для описания основных синтаксичСских конструкций языков программирования. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‡Π°Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с LL-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с LL-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° компилятора языка Π‘++ (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

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

Врансляторы дСлятся Π½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈΡΠΏΠΎΠ»Π½ΡΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ сразу ΠΆΠ΅ Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ построчно ΠΈΠ»ΠΈ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ послС ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ язык, ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΉ ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΡ‹ΠΉ нСпосрСдствСнно процСссором. НСкоторыС компиляторы способны вСсти сСбя ΠΊΠ°ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹, ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ нСпосрСдствСнно Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ.

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

Π—Π°Π΄Π°Ρ‡Π΅ΠΉ Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹ являСтся ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅, ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ части компилятора языка Π‘++. Π―Π·Ρ‹ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π‘++.

ВрСбования ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора

Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ трСбования ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора, Π½Π° ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€Π΅Π½ΠΈΠ΅ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Ρ‹ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ:

Β· ΠΏΠΎΠ»Π½ΠΎΡ‚Π° ΠΈ ΠΊΠΎΠ½Ρ„ΠΎΡ€ΠΌΠ½ΠΎΡΡ‚ΡŒ стандарту языка — рСализация Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ всС свойства языка Π‘++, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π΅, ΠΈ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»Π½ΠΎΠ΅ соотвСтствиС стандарту;

Β· ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ — рСализация Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ ΠΎΠ±Ρ‰Π½ΠΎΡΡ‚ΡŒ с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π·Π°Π΄Π°Ρ‡ΠΈ трансляции, Π½ΠΎ ΠΈ Ρ†Π΅Π»Ρ‹ΠΉ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π½Π°Π΄ тСкстами Π‘++ (Π°Π½Π°Π»ΠΈΠ· ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΠ·Π²Π»Π΅Ρ‡Π΅Π½ΠΈΠ΅ сСмантичСской ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈ Ρ‚. Π΄.);

Β· ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ — рСализация Π΄ΠΎΠ»ΠΆΠ½Π° ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, ΡΡ€Π°Π²Π½ΠΈΠΌΡƒΡŽ с ΡΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹ΠΌΠΈ компиляторами Π‘++.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° компилятора

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции состоит ΠΈΠ· ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… этапов.

1. ЛСксичСский Π°Π½Π°Π»ΠΈΠ·. На ΡΡ‚ΠΎΠΌ этапС ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов исходного Ρ„Π°ΠΉΠ»Π° прСобразуСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ лСксСм.

2. БинтаксичСский (грамматичСский) Π°Π½Π°Π»ΠΈΠ·. ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ лСксСм прСобразуСтся Π² Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π°.

3. БСмантичСский Π°Π½Π°Π»ΠΈΠ·. Π”Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° обрабатываСтся с Ρ†Π΅Π»ΡŒΡŽ установлСния Π΅Π³ΠΎ сСмантики (смысла) — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, привязка ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊ ΠΈΡ… Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΡΠΌ, Ρ‚ΠΈΠΏΠ°ΠΌ, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° совмСстимости, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ Ρ‚. Π΄. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ называСтся «ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ прСдставлСниСм/ΠΊΠΎΠ΄ΠΎΠΌ», ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ Ρ€Π°Π·Π±ΠΎΡ€Π°, Π½ΠΎΠ²Ρ‹ΠΌ Π΄Π΅Ρ€Π΅Π²ΠΎΠΌ, абстрактным Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠΌΠ°Π½Π΄ ΠΈΠ»ΠΈ Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π΅Ρ‰Ρ‘, ΡƒΠ΄ΠΎΠ±Π½Ρ‹ΠΌ для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

4. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ. ВыполняСтся ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ ΠΈΠ·Π»ΠΈΡˆΠ½ΠΈΡ… конструкций ΠΈ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° с ΡΠΎΡ…Ρ€Π°Π½Π΅Π½ΠΈΠ΅ΠΌ Π΅Π³ΠΎ смысла. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… уровнях ΠΈ ΡΡ‚Π°ΠΏΠ°Ρ… — Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°Π΄ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π°Π΄ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ.

5. ГСнСрация ΠΊΠΎΠ΄Π°. Из ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния пороТдаСтся ΠΊΠΎΠ΄ Π½Π° Ρ†Π΅Π»Π΅Π²ΠΎΠΌ языкС.

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

ЛСксичСский Π°Π½Π°Π»ΠΈΠ· — пСрвая Ρ„Π°Π·Π° компиляции. На ΡΡ‚ΠΎΠΌ этапС исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Ρ‚ранслируСмом языкС прСобразовываСтся Π² ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ лСксСм, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌ лСксичСским классам. Π’ Ρ‚Π°ΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ.

Помимо этого лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ:

Β· отбрасываниС ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² (ΠΏΡ€ΠΎΠ±Π΅Π», символы табуляции ΠΈ Π½ΠΎΠ²ΠΎΠΉ строки, Π° Ρ‚Π°ΠΊΠΆΠ΅, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ символы, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠ΅ΡΡ для отдСлСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π΄Ρ€ΡƒΠ³ ΠΎΡ‚ Π΄Ρ€ΡƒΠ³Π° Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅);

Β· синхронизация сообщСний ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… с ΠΈΡΡ…ΠΎΠ΄Π½Ρ‹ΠΌ тСкстом ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ (лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΡ‚ΡΠ»Π΅ΠΆΠΈΠ²Π°Ρ‚ΡŒ количСство символов Π½ΠΎΠ²ΠΎΠΉ строки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π»ΠΎΡΡŒ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ строки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠ½Π° ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π°);

БущСствуСт нСсколько способов Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°: ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Π΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹ ΠΈΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² (lex, Flex, gplex, OOlex).

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ нСпрямой лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ².

НСпрямой лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ рСализуСтся ΠΊΠ°ΠΊ ΡΠΎΠ²ΠΎΠΊΡƒΠΏΠ½ΠΎΡΡ‚ΡŒ нСзависимых ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ², ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ лСксСмам, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌ Π’ΠΈΡ€Ρ‚Π°.

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ прСдставлСн ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ, ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²Π»ΡΡŽΡ‰Π΅ΠΉ ΠΈΠΌΠΈΡ‚Π°Ρ†ΠΈΡŽ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΎΠ² ΠΎΡ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ состояния ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ….

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ:

Β· ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡΠΎΡΡ‚ΠΎΡΠ½ΠΈΡŽ ставится Π² ΡΠΎΠΎΡ‚вСтствии ΠΌΠ΅Ρ‚ΠΊΠ°;

Β· Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Π΅ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ условными ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ;

Β· Ссли Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ являСтся истиной, проводится ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° контСкста, бСрСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ символ ΠΈ ΠΎΡΡƒΡ‰Π΅ΡΡ‚вляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° Π½ΠΎΠ²ΡƒΡŽ ΠΌΠ΅Ρ‚ΠΊΡƒ (Π² Π½ΠΎΠ²ΠΎΠ΅ состояниС);

Β· процСсс повторяСтся Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° Π½Π΅ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… состояний.

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

Алгоритм Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ лСксСмы Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ Π½Π° ΠΊΠ»Π°ΡΡΡ‹: ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹, ΠΏΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ‚ΠΎΡ€Ρ‹, символы, скобки, числа.

ОписаниС класса:

class KeyWord

{ private:

list keyword; //список ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… слов

public:

KeyWord ();

bool operator ()(const AnsiString s); //провСряСт ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΡΠΏΠΈΡΠΊΡƒ

};

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² vector sym_table (посимвольно).

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° symbol ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ символ, строку, столбСц, Π΄Π»ΠΈΠ½Ρƒ символа ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π°.

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ vector scaner_result.

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° cell содСрТит описаниС Ρ‚ΠΈΠΏΠ°, саму лСксСму, строку, столбСц, Π΄Π»ΠΈΠ½Ρƒ лСксСмы ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΡŽ ΠΎΡ‚ Π½Π°Ρ‡Π°Π»Π°.

Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π° sym_table провСряСтся Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ классу лСксСм, Ссли функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ истина, Ρ‚ΠΎ ΡΠΈΠΌΠ²ΠΎΠ» пСрСписываСтся Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ curr_cell (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ структуры cell) ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ символу, Ρ‚Π°ΠΊ ΠΆΠ΅ провСряСм Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΊ ΡΡ‚ΠΎΠΌΡƒ ΠΆΠ΅ классу лСксСм, Ссли функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ лоТь, Ρ‚ΠΎ Π·Π°ΠΏΠΈΡΡ‹Π²Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curr_cell Π² ΠΌΠ°ΡΡΠΈΠ² scanner_result, обнуляСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ curr_cell, провСряСм Ссли Π»ΠΈ Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ sym_table Π΅Ρ‰Π΅ символы, Ссли ΠΎΠ½ Π½Π΅ ΠΏΡƒΡΡ‚ΠΎΠΉ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΠΌ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌΡƒ.

Π”Π°Π½Π½Ρ‹Π΅ ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… хранятся Π² ΠΌΠ°ΡΡΠΈΠ²Π΅ error_result.

Как Ρ‚ΠΎΠ»ΡŒΠΊΠΎ массив sym_table оказался пуст, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²ΠΎΠ² scanner_result ΠΈ error_result выводятся Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠΉ для Ρ€Π°Π·Π±ΠΎΡ€Π°, прСдставлСн Π² ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ А. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΊΠΎΠ΄Π° лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ прСдставлСн Π½Π° Ρ€ΠΈΡΡƒΠ½ΠΊΠ΅ 1.

Рисунок 1 — Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π’ Ρ„Π°Π·Π΅ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ошибки — Π½Π΅ Π·Π°ΠΊΡ€Ρ‹Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Π°Ρ строка, ошибка Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ вСщСствСнной константы, ошибка Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ символьной константы.

Π’Π°ΠΊ «ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости» лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΡƒΠ·ΠΊΠ°, Ρ‚ΠΎ Π±Π΅Π· ΠΏΠΎΠΌΠΎΡ‰ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² компилятора Π΅ΠΌΡƒ достаточно слоТно ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ошибки Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ссли Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ F Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅ встрСтился Π² ΠΊΠΎΠ½Ρ‚СкстС F=a*33. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ F ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ лСксСмой, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ этот Ρ‚ΠΎΠΊΠ΅Π½ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ «ΠΠ΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ».

Рисунок 2 — Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌΠΈ ошибками ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², записанная Π² ΠΌΠ°ΡΡΠΈΠ² scaner_result пСрСдаСтся синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ Ρ„Π°Π·Π΅.

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

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· — вторая Ρ„Π°Π·Π° компиляции. На ΡΡ‚ΠΎΠΌ этапС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², созданной лСксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΈΠ»ΠΈ парсСр, Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² для транслируСмого языка ΠΈ Π½Π° Π²Ρ‹Ρ…ΠΎΠ΄Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒΡΡ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ прСдставлСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‚ ΡΠΈΠ½Ρ‚аксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΎΠΆΠΈΠ΄Π°ΡŽΡ‚ΡΡ сообщСния ΠΎΠ±ΠΎ всСх выявлСнных ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…. Π’ ΡΠ»ΡƒΡ‡Π°Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ строит Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ части компилятора для дальнСйшСй ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Рисунок 3 — ΠœΠ΅ΡΡ‚ΠΎ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π² ΠΌΠΎΠ΄Π΅Π»ΠΈ компилятора Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Ρ„ΠΎΡ€ΠΌΡ‹ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ прСдставлСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€ΠΎΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ абстрактноС синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ.

ΠœΠ΅Ρ‚ΠΎΠ΄Ρ‹, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ примСняСмыС Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Π°Ρ…, ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ нисходящиС (свСрху Π²Π½ΠΈΠ· — top-down) ΠΈΠ»ΠΈ восходящиС (снизу Π²Π²Π΅Ρ€Ρ… — bottom-up). Как слСдуСт ΠΈΠ· Π½Π°Π·Π²Π°Π½ΠΈΠΉ, нисходящиС синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ строят Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΎΡ‚ ΠΊΠΎΡ€Π½Ρ ΠΈ Π»ΠΈΡΡ‚ΡŒΡΠΌ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ восходящиС Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ с Π»ΠΈΡΡ‚ΡŒΠ΅Π² ΠΈ ΠΈΠ΄ΡƒΡ‚ ΠΊ ΠΊΠΎΡ€Π½ΡŽ. Π’ ΠΎΠ±ΠΎΠΈΡ… случаях Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° сканируСтся посимвольно слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ.

НаиболСС эффСктивныС нисходящиС ΠΈ Π²ΠΎΡΡ…одящиС ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΠΎΠ΄ΠΊΠ»Π°ΡΡΠ°ΠΌΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ, ΠΎΠ΄Π½Π°ΠΊΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΈΠ· ΡΡ‚ΠΈΡ… классов, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ LLΠΈ LR-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, достаточно Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ для описания основных синтаксичСских конструкций языков программирования. Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ синтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‡Π°Ρ‰Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с LL-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ; Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ΠΈΠΊΠ°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с LL-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ. БинтаксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹ для большСго класса LR-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… инструмСнтов.

Π’Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° являСтся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставлСниС Π΄Π΅Ρ€Π΅Π²Π° Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΠΎΡ‚ΠΎΠΊΠ° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΎΡ‚ Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ имССтся мноТСство Π·Π°Π΄Π°Ρ‡, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒ процСсс Ρ€Π°Π·Π±ΠΎΡ€Π°, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ сбор ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Ρ‚ΠΎΠΊΠ΅Π½Π°Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов, Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΈΠΏΠΎΠ² ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²ΠΈΠ΄ΠΎΠ² сСмантичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Ρ‚Π°ΠΊΠΆΠ΅ гСнСрация ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Алгоритм Ρ€Π°Π±ΠΎΡ‚Ρ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

Π‘ΠΎΠ·Π΄Π°Π½Π° структура TLexeme, пСрСмСнная curr_par Ρ‚ΠΈΠΏΠ° cell, Π² Π½Π΅Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· ΠΌΠ°ΡΡΠΈΠ²Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€. Из ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ curr_cell Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ Π² ΠΌΠ°ΡΡΠΈΠ² Lexemes. Π”Π°Π»ΡŒΡˆΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΌΠ°ΡΡΠΈΠ²ΠΎΠΌ Lexemes.

struct TLexeme

{ String type; //Ρ‚ΠΈΠΏ Ρ‚ΠΎΠΊΠ΅Π½Π°

String body; //сам Ρ‚ΠΎΠΊΠ΅Π½

int position; //строка

};

TLexeme* Lexemes; // НайдСнныС лСксСмы: Ρ‚ΠΈΠΏ, Ρ‚Π΅Π»ΠΎ, строка

cell curr_par; //ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ структуры (сама структура Π² 1. h)

int Number = Form1->scaner_result.size (); //ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅ΠΌ количСство лСксСм

Lexemes = new TLexeme [Number]; //Π½Π΅ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ лСксСмы

for (int i=0, j=0; i

{ //Π² «ΡΡ‚Ρ€ΠΎΠΊΡƒ» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π‘ΠžΠ›Π¬Π¨ΠžΠ“Πž массива

curr_par=Form1->scaner_result[j];

//сразу записываСм Π² Π½ΠΎΠ²Ρ‹ΠΉ

Lexemes[j]. type=curr_par.type;

Lexemes[j].body=curr_par.value;

Lexemes[j].position=curr_par.str;

j++;

}

Π”Π°Π»ΡŒΡˆΠ΅ ΠΏΠΎ Ρ†ΠΈΠΊΠ»Ρƒ провСряСм ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ лСксСмы ΠΊ ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ синтаксичСской конструкции.

Если лСксСма ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ конструкции, записываСм Π΅Π΅ Π² ΠΊΠΎΡ€Π΅Π½ΡŒ, ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, для Ρ‚Π΅Π»Π°, Ссли это Ρ†ΠΈΠΊΠ», структура, функция (Ρ‚.Π΅. для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² {}) вызываСтся рСкурсия.

if (Lexemes[i]. body=="struct")

{ add_tabs (dest, tabs);

dest<<" struct" <<'n';

tabs++; i++;

if (Lexemes[i]. type=="Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€")

{ add_tabs (dest, tabs);

dest<<" Имя" <<'n';

tabs++;

add_tabs (dest, tabs);

dest<<<'n';

i++; tabs—;

}

add_tabs (dest, tabs);

dest<<" {}" <<'n';

if (Lexemes[i]. body=="{")

{ //i++;

i=MakeBinTree (dest, tabs, tabs, i,1," @#$%^&(«, tecFN); //Π²Ρ‹Π·ΠΎΠ² рСкурсии для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² {}

i++;

//tabs—;

}

if (Lexemes[i]. type=="Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€") //18:48 Π΄ΠΎΠ±Π°Π²ΠΈΠ»Π° условиС, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹Π²ΠΎΠ΄ΠΈΠ»ΠΈΡΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ структуры

{ while (Lexemes[i]. type=="Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€" || Lexemes[i]. body==",")

{ if (Lexemes[i]. type=="Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€")

{ add_tabs (dest, tabs);

dest<<<'n';

}

i++;

}

}

tabs—;

}

Π˜Π·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π΄Π΅Ρ€Π΅Π²ΠΎ записываСтся Π² Ρ‚Скстовый Ρ„Π°ΠΉΠ», ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ вСсь массив, Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Ρ‚Скстового Ρ„Π°ΠΉΠ»Π° Π·Π°Π³Ρ€ΡƒΠΆΠ°ΡŽΡ‚ΡΡ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ TreeView.

Для записи ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ‚Скстовый Ρ„Π°ΠΉΠ» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ функция add_tabs.

void add_tabs (ofstream &dest, int tabs)

{ //ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, ΠΈΠ΄Ρƒ ΠΏΠΎ Ρ†ΠΈΠΊΠ»Ρƒ ΡΡ‚Π°Π²Π»ΡŽ Ρ‚Π°Π±ΡƒΠ»ΡΡ†ΠΈΡŽ

for (int j=0;j

dest<<'t';

}

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π° строится синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ Рисунок 4.

БинтаксичСскиС ошибки Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π½Π΅Π²Π΅Ρ€Π½ΠΎ поставлСнныС Ρ‚ΠΎΡ‡ΠΊΠΈ с Π·Π°ΠΏΡΡ‚ΠΎΠΉ ΠΈΠ»ΠΈ лишниС Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ скобки, отсутствиС условий (для ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° while), отсутствиС Ρ‚Π΅Π»Π° (switch, while, do while), Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ΅ количСсво ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (for), Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ Ρ‚ΠΈΠΏ (Ссли пСрСмСнная Π½Π΅ Π±Ρ‹Π»Π° объявлСна).

Рисунок 4 — Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Рисунок 5 — Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° с Π½Π°ΠΉΠ΄Π΅Π½Π½Ρ‹ΠΌΠΈ ошибками

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

БСмантичСский Π°Π½Π°Π»ΠΈΠ· — Ρ‚Ρ€Π΅Ρ‚ΡŒΡ Ρ„Π°Π·Π° компиляции. Π’Π°ΠΊ ΠΊΠ°ΠΊ Π½Π° ΡΡ‚Π°ΠΏΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Π½Π΅Ρ‚ достаточной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ…, парсСр провСряСт лишь Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². Π—Π°Π΄Π°Ρ‡Π° сСмантичСского Π°Π½Π°Π»ΠΈΠ·Π° состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ ΠΈ ΠΏΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ соотвСтствиС Ρ‚ΠΈΠΏΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. Π’ ΡΠ»ΡƒΡ‡Π°Π΅, ΠΊΠΎΠ³Π΄Π° Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚, Π½ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ нСявноС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, сСмантичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ привСдСния Ρ‚ΠΈΠΏΠΎΠ² Π² Π°Π±ΡΡ‚Ρ€Π°ΠΊΡ‚Π½ΠΎΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ…ΠΎΠ΄Π΅.

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

Рисунок 6 — ΠŸΠΎΡΡ‚Ρ€ΠΎΠ΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

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

Π’ Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Π΅ Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°Π·Ρ‹ компиляции:

1) лСксичСский Π°Π½Π°Π»ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ являСтся Ρ‚Π°Π±Π»ΠΈΡ†Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ²;

2) синтаксичСский Π°Π½Π°Π»ΠΈΠ· Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° Π² ΡΠ»ΡƒΡ‡Π°Π΅ коррСктности Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°;

3) построСна Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

Π Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ позволяСт Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ ΠΈ *.cpp, *.h, *.c, *.hpp.

Для Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ компилятора Π±Ρ‹Π» Π²Ρ‹Π±Ρ€Π°Π½ Π½Π΅ ΡΠ°ΠΌΡ‹ΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄, Ρ‚.ΠΊ. ΡƒΠΆΠ΅ сущСствуСт мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ лСксичСского ΠΈ ΡΠΈΠ½Ρ‚аксичСского Π°Π½Π°Π»ΠΈΠ·Π°, использованиС ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… позволяСт ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΈ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ.

1. Ахо, Π›Π°ΠΌ, Π‘Π΅Ρ‚ΠΈ, Ульман. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹: ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΡ‹, Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΈ ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, 2-Π΅ ΠΈΠ·Π΄.: ΠŸΠ΅Ρ€. Ρ Π°Π½Π³Π». — Πœ.: ООО «Π˜.Π”. Π’ΠΈΠ»ΡŒΡΠΌΡ», 2008. — 1184 с.: ΠΈΠ».

2. Мозговой М. Π’. Классика программирования: Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹, языки, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Ρ‹, компиляторы. ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. — Π‘Пб.: Наука ΠΈ Π’Π΅Ρ…Π½ΠΈΠΊΠ°, 2006. — 320 с.: ΠΈΠ».

3. БСрСбряков Π’. А., Π“Π°Π»ΠΎΡ‡ΠΊΠΈΠ½ М. П. ΠžΡΠ½ΠΎΠ²Ρ‹ конструирования компиляторов, Москва, 2001. — 224с.

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ А

ВСкст тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Ρ€Π°Π±ΠΎΡ‚Ρ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

#include

/*fbdfbdfbdfbdf fhdfh/* fdhfghf

ghfgh */

//—————-;

int main ()

{const n=34u, m=12LU;

const l=12.6f, t=23.6L;

float u=11e-10f;

int a=0012, b=0xabcd, c=-12; float d=07;

float a=12.11, t=12e2, u=-0.23e-12;

char a='a', t='', v='123', k='xab';

char t[]="gfbfgnft" «» hmnghjmh

jyhjghghjgh" ;

&=

>>=

new

signed

inline

return 0;

}

ВСкст тСстовой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Ρ€Π°Π±ΠΎΡ‚Ρ‹ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

#include

//test

enum RET {red, green=1}

int main (int s, double z)

{ int a, b=4,c=0,d=121, q;

a=10;

if ((a+b* c)<10 && c

{ for (int i=0; i<5; i++)

{ q+=1;

do {++a;}

while (b+a<20)

}

}

/*/*olololo

123 */

if (a<10)

if (b>10 && b<15)

{ int s=b; }

else s=a;

return s;

}

//——————————;

ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π‘

Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ лСксСм

bool Punkt: operator () (const AnsiString s)

{ return find (punkt.begin (), punkt. end (), s)≠punkt.end ();

}

Punkt:Punkt ()

{ punkt. push_back («…»); punkt. push_back («;»);

punkt.push_back («:»); punkt. push_back («,»);

ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ

if (ISpunkt (sym_table[i]. chr))

{ int len=0;

curr_cell.str=sym_table[i]. str;

curr_cell.sym=sym_table[i].sym;

curr_cell.pos=pos;

curr="" ;

do {curr+=sym_table[i++]. chr; len++; pos++;}

while (ISpunkt (sym_table[i]. chr));

if (ISpunkt (curr))

curr_cell.type="ΠŸΡƒΠ½ΠΊΡ‚ΡƒΠ°Ρ‚ΠΎΡ€" ;

curr_cell.value=curr;

curr_cell.len=len;

result.push_back (curr_cell);

i—;

continue;

}

Ѐункция провСряСт Π½Π° Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ арифмСтичСских ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ

int if_there_arifmetic_ops (long ii)

{ TLexeme* Lexemes; // НайдСнныС лСксСмы: Ρ‚ΠΈΠΏ, Ρ‚Π΅Π»ΠΎ, строка

cell curr_par; //ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ структуры (сама структура Π² 1. h)

int Number=Form1->scaner_result.size ();

Lexemes = new TLexeme [Number]; //Π½Π΅ΠΉΠ΄Π΅Π½Π½Ρ‹Π΅ лСксСмы

for (int t=0, j=0; t

{ //Π² «ΡΡ‚Ρ€ΠΎΠΊΡƒ» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌ Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· Π‘ΠžΠ›Π¬Π¨ΠžΠ“Πž массива

curr_par=Form1->scaner_result[j];

//сразу записываСм Π² Π½ΠΎΠ²Ρ‹ΠΉ

Lexemes[j]. type=curr_par.type;

Lexemes[j].body=curr_par.value;

Lexemes[j].position=curr_par.str;

j++;

}

int f=0;

long i;

int cs=0;//Π‘Ρ‡Π΅Ρ‚ скобок

for (i=ii;i

Lexemes[i]. body=="<"

return f;

delete []Lexemes;

}

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