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

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹-компилятора

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

РаспознаватСлСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² являСтся функция Ident, 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант — функция FConst, римских констант — функция Rome. ВсС ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Ссли лСксСма распознана ΠΈ — 1 Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. РаспознаватСлСм Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов являСтся функция Termin. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3, Ссли лСксСма — ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово, 1 — Ссли Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, 2 — Ссли Π·Π½Π°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Если лСксСма Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

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

  • Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅
    • 1. Анализ задания
    • 2. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    • 2.1 Π’Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ…
    • 2.2 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π½Ρ‹Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ для распознавания лСксСм
    • 2.3 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ
    • 2.3.1 Автомат для распознавания ΠΈΠΌΡ‘Π½
    • 2.3.2 Автомат для распознавания 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант
    • 2.3.3 Автомат для распознавания римских констант
    • 2.3.4 ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚
    • 2.4 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°
    • 2.4.1 Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксСм
    • 2.4.2 РаспознаваниС лСксСм
    • 2.4.3 РСализация лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    • 2.4.4 ВСстированиС лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    • 3. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    • 3.1 Π£Ρ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ задания
    • 3.2 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°
    • 3.3 Алгоритмы Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ
    • 3.3.1 Ѐункция Lex_Progr
    • 3.3.2 Ѐункция Lex_Descr_List
    • 3.3.3 Ѐункция Lex_Descr
    • 3.3.4 Ѐункция Lex_Name_List
    • 3.3.5 Ѐункция Lex_Oper_List
    • 3.3.6 Ѐункция Lex_Assign
    • 3.3.7 Ѐункция Lex_Exp
    • 3.3.8 Ѐункция Lex_Simple_Exp
    • 3.3.9 Ѐункция Lex_Term
    • 3.3.10 Ѐункция Lex_mnozh
    • 3.3.12 Ѐункция Lex_Body
    • 3.4 ВСксты Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€
    • 3.5 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°
    • 4. РСализация Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½ΠΎΠ³ΠΎ компилятора
    • 4.1 Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования Π΄Π²ΡƒΡ…Ρ„Π°Π·Π½ΠΎΠ³ΠΎ компилятора
    • 5. ОписаниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    • 5.1 ΠžΠ±Ρ‰ΠΈΠ΅ свСдСния ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
    • 5.2 Π’Ρ‹Π·ΠΎΠ² ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°
    • 5.3 Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
    • 5.4 Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅
    • 5.5 ОписаниС логичСской структуры ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    • 5.5.1 Π€Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    • 5.5.2 ΠžΠ±Ρ‰Π΅Π΅ описаниС Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹
    • Бписок использованной Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹

По ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π­Π’Πœ компиляторы относятся ΠΊ ΡΠΈΡΡ‚Π΅ΠΌΠ½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ. Π˜Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ являСтся ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с ΡΠ·Ρ‹ΠΊΠ° высокого уровня Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΡΡŽΡ‚ся Ρ‚Π°ΠΊΠΈΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ ΠΈΠ»ΠΈ слои ΠΊΠ°ΠΊ Π°Π»Ρ„Π°Π²ΠΈΡ‚, лСксика, синтаксис ΠΏΡ€ΠΈ сохранСнии сСмантики.

Алфавит — Π½Π°Π±ΠΎΡ€ допустимых символов ΠΈ Π·Π½Π°ΠΊΠΎΠ², ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… строятся элСмСнтарныС конструкции языка. ΠžΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² Π»Π΅ΠΊΡΠ΅ΠΌΡ‹.

ЛСксСма — ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ нСдСлимая конструкция, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ смысл.

Π‘Π»ΠΎΠ²Π° (лСксСмы) ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ΡΡ Π² ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ (ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹) согласно ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ синтаксиса.

Бинтаксис — описаниС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… конструкций языка ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈΠ» получСния ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹Ρ… конструкций языка.

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ состоит ΠΈΠ· ΡΡ‚Π°ΠΏΠΎΠ² Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΈΠ½Ρ‚Π΅Π·Π°. Π’ Π°Π½Π°Π»ΠΈΠ· Π²Ρ…ΠΎΠ΄ΠΈΡ‚ лСксичСский, синтаксичСский ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ичСский Π°Π½Π°Π»ΠΈΠ·.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ· состоит ΠΈΠ· Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡ лСксСм, ΠΈΡ… ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ.

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ структур языка, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ прСдлоТСния ΠΈΠ»ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΈ Π²ΡΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ†Π΅Π»ΠΎΠΌ.

1. Анализ задания

Π—Π°Π΄Π°Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚ΡŒ Π½Π° 3 части: лСксичСский Π°Π½Π°Π»ΠΈΠ·, синтаксичСский Π°Π½Π°Π»ΠΈΠ·, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° компилятора Π² Ρ†Π΅Π»ΠΎΠΌ

ЛСксичСский Π°Π½Π°Π»ΠΈΠ· Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ этапы:

ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ исходного тСкста Π² Π΄Π»ΠΈΠ½Π½ΡƒΡŽ строку;

Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксичСских Π΅Π΄ΠΈΠ½ΠΈΡ† (лСксСм);

распознаваниС Ρ‚ΠΈΠΏΠΎΠ² лСксСм;

Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ лСксСм Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹;

сохранСниС Ρ‚Π°Π±Π»ΠΈΡ† Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ².

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ лСксСм:

ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹;

ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова;

16-Ρ€ΠΈΡ‡Π½Ρ‹Π΅ ΠΈ Ρ€ΠΈΠΌΠΊΠΈΠ΅ константы;

Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ;

Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ.

Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ (ΠΈΠΌΠ΅Π½Π°)

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π±ΡƒΠΊΠ²Ρ‹, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ символы ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ Π±ΡƒΠΊΠ²Ρ‹, Ρ‚Π°ΠΊ ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ Π·Π½Π°ΠΊ подчСркивания (`_'). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ со ΡΠ»ΡƒΠΆΠ΅Π±Π½Ρ‹ΠΌΠΈ словами.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹:

`var15', `n'. Π˜Ρ… ΡΠ»Π΅Π΄ΡƒΠ΅Ρ‚ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ².

ΠšΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова

Π­Ρ‚ΠΎΡ‚ класс лСксСм, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, описываСтся Ρ‚Π΅ΠΌ ΠΆΠ΅ синтаксисом, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹. ОсновноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ всС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова Π·Π°Ρ€Π°Π½Π΅Π΅ пСрСчислСны ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ³Ρ€Π°Π΅Ρ‚ Π² ΡΠ·Ρ‹ΠΊΠ΅ свою ΠΎΡΠΎΠ±ΡƒΡŽ Ρ€ΠΎΠ»ΡŒ. Оно Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌΠΈ словами. ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡ‚Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова ΠΎΡ‚ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΈΠΌΠ΅Π½, Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΌΠ΅ΠΆΠ΄Ρƒ собой ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ· Π½ΠΈΡ… свои (ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅) значСния.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова:

`program', `var', `integer', `begin', `repeat', `until', `end', ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов.

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹.

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

ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° считаСтся римской, Ссли ΠΎΠ½Π° состоит ΠΈΠ· Π·Π½Π°ΠΊΠ° ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠ² `X','V' ΠΈ `I' ΠΈ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π° ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ составлСния римских констант. Она считаСтся 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ, Ссли начинаСтся с ΡΠΈΠΌΠ²ΠΎΠ»Π° `$' ΠΈ Π·Π½Π°ΠΊΠ° ΠΈ ΡΠΎΡΡ‚ΠΎΠΈΡ‚ ΠΈΠ· Ρ†ΠΈΡ„Ρ€ ΠΈ Π±ΡƒΠΊΠ² `A'. 'F'. ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ, это зависит ΠΎΡ‚ Π·Π½Π°ΠΊΠ° послС символа `$'.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΡ‚ΡŒ константы:

`$+00', `$-0A' - ΠΊΠ°ΠΊ 16-Ρ€ΠΈΡ‡Π½Ρ‹Π΅;

`-XII' - ΠΊΠ°ΠΊ Ρ€ΠΈΠΌΡΠΊΡƒΡŽ.

Π­Ρ‚ΠΈ лСксСмы ΠΎΠ½ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ констант с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΈΡ… Ρ‚ΠΈΠΏΠ° ('16-Ρ€ΠΈΡ‡. ' - для 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ константы, 'римск. ' - для римской константы) ΠΈ ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ дСсятичной Ρ„ΠΎΡ€ΠΌΡ‹.

Π—Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ.

Π˜Ρ… ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ состоит Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ — ΠΈΠ»ΠΈ Π΄Π²ΡƒΡ…ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’ Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Π΄Π²ΡƒΡ…ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Π’Π°ΠΊΠΈΠ΅ лСксСмы лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ (Π΄Π²ΡƒΡ…ΡΠΈΠΌΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π΅ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ) ΠΈ Π·Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΈΡ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

ΠžΠ΄Π½ΠΎΡΠΈΠΌΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅: `-', `<';

Π”Π²ΡƒΡ…ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅: `: ='.

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

К Π½ΠΈΠΌ относятся ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ символы, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠ΅ конструкции языка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:; |, |. | (|) | ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹ | символы табуляции ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π½Π° Π½ΠΎΠ²ΡƒΡŽ строку. Они ΠΌΠΎΠ³ΡƒΡ‚ Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ Π² ΡΠΈΠ½Ρ‚аксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ лСксСм, Π»ΠΈΠ±ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΉ лСксСмы ΠΈ ΠΏΡ€ΠΎΠΏΡƒΡΠΊΠ°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ Π²Π²ΠΎΠ΄Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ. НСкоторыС ΠΈΠ· ΡΡ‚ΠΈΡ… символов ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠ³Ρ€Π°Ρ‚ΡŒ Ρ€ΠΎΠ»ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ичСском описании ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… конструкций языка.

Π’ Π΄Π°Π½Π½ΠΎΠΌ Π·Π°Π΄Π°Π½ΠΈΠΈ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ:

`; ', `: ', `. ',' (`,') '.

Π“Ρ€Π°Π½ΠΈΡ†Π°ΠΌΠΈ лСксСм ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ, Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, ΠΏΡ€ΠΎΠ±Π΅Π»Ρ‹.

Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ Π΄Π²Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ:

распознаваниС ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ языка;

ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΠΈ конструкций.

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

Π’ ΠΏΡ€ΠΎΡ†Π΅ΡΡΠ΅ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° всСго исходного тСкста Π² Ρ†Π΅Π»ΠΎΠΌ ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ прСдлоТСния Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π²Π° направлСния двиТСния ΠΏΠΎ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»: свСрху Π²Π½ΠΈΠ· ΠΈ ΡΠ½ΠΈΠ·Ρƒ Π²Π²Π΅Ρ€Ρ….

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

Π”Π΅Ρ€Π΅Π²ΠΎ Π²Ρ‹Π²ΠΎΠ΄Π° состоит ΠΈΠ· Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠ³ΠΎ) ΡƒΠ·Π»Π°. Π’ Π½Π΅Π³ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Π΅Ρ‰Π΅ ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Π΅ ΡƒΠ·Π»Ρ‹ ΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΠ΅ ΡƒΠ·Π»Ρ‹.

КаТдой Π²Π΅Ρ‚Π²ΠΈ соотвСтствуСт ΠΎΠ΄Π½ΠΎ ΠΈΠ· ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΊΠΎΠ΄ΠΎΠ² лСксСм, сформированная Π½Π° ΡΡ‚Π°Π΄ΠΈΠΈ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°.

Π’Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ — сообщСниС ΠΎΠ± ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Π°Π½Π°Π»ΠΈΠ·Π° ΠΈΠ»ΠΈ сообщСниС ΠΎΠ± ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ…ся ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ….

2. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

2.1 Π’Ρ‹Π±ΠΎΡ€ ΠΈ ΠΎΠ±ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠ΅ структур Π΄Π°Π½Π½Ρ‹Ρ…

1. Π’Π°Π±Π»ΠΈΡ†Π° констант ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²

Для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ Const_tab, содСрТащих ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

НомСр лСксСмы.

ЛСксСма.

Π’ΠΈΠΏ константы (16-ричная ΠΈΠ»ΠΈ римская).

Π¨ΠΈΡ€ΠΈΠ½Π° константы.

10-тичная Ρ„ΠΎΡ€ΠΌΠ°.

ЛСвая Π²Π΅Ρ‚Π²ΡŒ Π΄Π΅Ρ€Π΅Π²Π° (Π½ΠΎΠΌΠ΅Ρ€ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΡŒΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ).

ΠŸΡ€Π°Π²Π°Ρ Π²Π΅Ρ‚Π²ΡŒ Π΄Π΅Ρ€Π΅Π²Π° (Π½ΠΎΠΌΠ΅Ρ€ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€Π°Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΡŒΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ).

ΠŸΡƒΡ‚ΡŒ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Ρƒ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π²Ρ‹Ρ… ΠΈ ΠΏΡ€Π°Π²Ρ‹Ρ… Π²Π΅Ρ‚Π²Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта).

2. Π’Π°Π±Π»ΠΈΡ†Π° Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² Π²ΠΈΠ΄Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π²

Для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅Π½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ Term_tab, содСрТащих ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

НомСр лСксСмы.

ЛСксСма.

Π Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ (Ссли лСксСма являСтся Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎ ΡΡ‚ΠΎ ΠΏΠΎΠ»Π΅ Ρ€Π°Π²Π½ΠΎ 1, Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ 0).

Π—Π½Π°ΠΊ опСрация (Ссли лСксСма являСтся Π·Π½Π°ΠΊΠΎΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ‚ΠΎ ΡΡ‚ΠΎ ΠΏΠΎΠ»Π΅ Ρ€Π°Π²Π½ΠΎ 1, Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ 0).

ΠšΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово (Ссли лСксСма являСтся ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹ΠΌ словом, Ρ‚ΠΎ ΡΡ‚ΠΎ ΠΏΠΎΠ»Π΅ Ρ€Π°Π²Π½ΠΎ 1, Ссли Π½Π΅Ρ‚, Ρ‚ΠΎ 0)

ЛСвая Π²Π΅Ρ‚Π²ΡŒ Π΄Π΅Ρ€Π΅Π²Π° (Π½ΠΎΠΌΠ΅Ρ€ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся Π»Π΅Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΡŒΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ).

ΠŸΡ€Π°Π²Π°Ρ Π²Π΅Ρ‚Π²ΡŒ Π΄Π΅Ρ€Π΅Π²Π° (Π½ΠΎΠΌΠ΅Ρ€ элСмСнта, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся ΠΏΡ€Π°Π²ΠΎΠΉ Π²Π΅Ρ‚Π²ΡŒΡŽ для Π΄Π°Π½Π½ΠΎΠ³ΠΎ).

ΠŸΡƒΡ‚ΡŒ ΠΊ ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚Ρƒ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ (ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π»Π΅Π²Ρ‹Ρ… ΠΈ ΠΏΡ€Π°Π²Ρ‹Ρ… Π²Π΅Ρ‚Π²Π΅ΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ Π΄Π°Π½Π½ΠΎΠ³ΠΎ элСмСнта).

3. Для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ‚ΠΎΠ΄ с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

Для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ Id_tab, содСрТащих ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

Бсылка Π½Π° ΡΠ»Π΅ΠΌΠ΅Π½Ρ‚ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠΈ.

НомСр.

ЛСксСма.

Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС Ρ…ΡΡˆ-функция вычисляСтся ΠΏΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρƒ дСлСния, Ρ‚. Π΅.

h (k): = {K/Π±}

Π³Π΄Π΅ K — ΠΊΠ»ΡŽΡ‡ записи, Π± — Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ коэффициСнт

Для Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ³ΠΎ распрСдСлСния Π΄Π°Π½Π½Ρ‹Ρ… Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ коэффициСнт Π± ΠΏΡ€ΠΈΠΌΠ΅ΠΌ:

Π±= Li+2

Π³Π΄Π΅ L — количСство символов i-Ρ‚ΠΎΠΉ строки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

Код K Ρ€Π°ΡΡΡ‡ΠΈΡ‚ываСтся ΠΊΠ°ΠΊ сумма ASCII-ΠΊΠΎΠ΄ΠΎΠ² символов строки, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ хранится ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€.

4. Для хранСния Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠ΄ΠΎΠ² лСксСм ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ массив ΠΈΠ· Π·Π°ΠΏΠΈΡΠ΅ΠΉ Code_tab, содСрТащих ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

НомСр.

Π’ΠΈΠΏ лСксСмы (C — константа, I — ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€, T — Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ).

НомСр Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ констант, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΠΈΠ»ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов.

ЛСксСма.

НомСр Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠΎΠ΄ΠΎΠ² лСксСм.

Для ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ поиска ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

2.2 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π½Ρ‹Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ для распознавания лСксСм

Автоматными ΠΈΠ»ΠΈ рСгулярными Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΠ΄Π½Ρƒ ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„ΠΎΡ€ΠΌ:

ΠŸΡ€Π°Π²ΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Π°Ρ

ЛСволинСйная

A>aB

A>Ba

A>a

A>a

Π³Π΄Π΅ a Π’; А, Π’ N

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

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° для ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²:

<�имя>><οΏ½Π±ΡƒΠΊΠ²Π°><οΏ½Π±ΡƒΠΊΠ²Π°>

<οΏ½Π±ΡƒΠΊΠ²Π°>> ('a'. 'z')

<οΏ½Ρ†ΠΈΡ„Ρ€Π°>> (`0'. '9')

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° для констант:

<�константа>><16-Ρ€ΠΈΡ‡. константа>|<�римск. константа>

Для 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант:

<16-Ρ€ΠΈΡ‡. константа>> (`$+','$-`) (<οΏ½Ρ†ΠΈΡ„Ρ€Π°>, `A'. 'F') { (<οΏ½Ρ†ΠΈΡ„Ρ€Π°>,`A'. 'F') }

Для римских констант:

2.3 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ², Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΡ… ΠΏΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

2.3.1 Автомат для распознавания ΠΈΠΌΡ‘Π½

рис. 1. Автомат для распознавания ΠΈΠΌΡ‘Π½

Бостояния Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°:

S — Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС;

1 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΡŽ формирования ΠΈΠΌΠ΅Π½ΠΈ;

2 — ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ³ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°;

3 — ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ошибкС ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°.

2.3.2 Автомат для распознавания 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант

рис. 3. Автомат для распознавания 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант

Бостояния Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°:

S — Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС;

1 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ распознан символ Π½Π°Ρ‡Π°Π»Π° константы `$';

2 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅, Ρ‡Ρ‚ΠΎ распознан Π·Π½Π°ΠΊ константы, ΠΈ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ΅Π½ΠΈΠ΅ формирования константы;

3 — ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ константы;

4 — ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ошибкС ΠΏΡ€ΠΈ Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ 16-Ρ€ΠΈΡ‡Π½ΠΎΠΉ константы.

2.3.3 Автомат для распознавания римских констант

РимскиС константы ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ:

Римская систСма Π½ΡƒΠΌΠ΅Ρ€Π°Ρ†ΠΈΠΈ состоит ΠΈΠ· ΡΠ΅ΠΌΠΈ Π·Π½Π°ΠΊΠΎΠ²: I — 1, V — 5, X — 10, C — 100, D — 500, M — 1000. Π’ Π΄Π°Π½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ ΠΏΠ΅Ρ€Π²Ρ‹Ρ… Π·Π½Π°ΠΊΠ°, Ρ‚. Π΅. Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ числа ΠΎΡ‚ 1 (I) Π΄ΠΎ 39 (XXXIX).

Если мСньший Π·Π½Π°ΠΊ ΠΏΠΈΡˆΠ΅Ρ‚ΡΡ послС большСго, Ρ‚ΠΎ Π΅Π³ΠΎ ΠΏΡ€ΠΈΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΊ Π±ΠΎΠ»ΡŒΡˆΠ΅ΠΌΡƒ числу; Ссли ΠΆΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ большим — Π²Ρ‹Ρ‡ΠΈΡ‚Π°ΡŽΡ‚. Π’Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ числа, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с 1, Π² Π΄Π°Π½Π½ΠΎΠΌ случаС — 1, Ρ‚. ΠΊ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла Π²Ρ‹Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 5 ΠΈΠ· 5 (Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ 0) ΠΈΠ»ΠΈ ΠΈΠ· 10 (Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ 5).

Π—Π½Π°ΠΊΠΈ, эквивалСнтныС числам, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ с 1 (1, 10, 100, 1000), ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠ³ΠΎ Π΄ΠΎ 3 Ρ€Π°Π·. Π—Π½Π°ΠΊΠΈ, эквивалСнтныС числам, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΌΡΡ с 5 (5, 50, 500) ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ 1 Ρ€Π°Π·. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ число 4, Π½ΡƒΠΆΠ½ΠΎ ΠΈΠ· 5 Π²Ρ‹Ρ‡Π΅ΡΡ‚ΡŒ 1 (IV), Π° Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ число 6, Π½ΡƒΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ±Π°Π²ΠΈΡ‚ΡŒ 1 ΠΊ 5 (VI).

Π’ ΡΠΎΠΎΡ‚вСтствии с ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹ΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ, сформируСм ряд ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°-распознаватСля:

Π‘ΠΈΠΌΠ²ΠΎΠ» X ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² Π½Π°Ρ‡Π°Π»Π΅ строки ΠΎΡ‚ 1 Π΄ΠΎ 3 Ρ€Π°Π· подряд (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 3).

Π‘ΠΈΠΌΠ²ΠΎΠ» V ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1 Ρ€Π°Π·Π° Π² Π½Π°Ρ‡Π°Π»Π΅ строки ΠΈ ΠΏΠΎΡΠ»Π΅ 1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ символов X (см. ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 3).

Π‘ΠΈΠΌΠ²ΠΎΠ» I ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ ΠΎΡ‚ 1 Π΄ΠΎ 3 Ρ€Π°Π· подряд Π² Π½Π°Ρ‡Π°Π»Π΅ строки, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ строки, ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½Π½ΠΎΠΉ символами X ΠΈ V (см. ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ 1 ΠΈ 2, ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 3).

Π‘ΠΈΠΌΠ²ΠΎΠ» X ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ строки 1 Ρ€Π°Π· послС символа I, Ссли ΠΏΠ΅Ρ€Π΅Π΄ послСдним находятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы X ΠΈΠ»ΠΈ Π½ΠΈΡ‡Π΅Π³ΠΎ (ΠΈΠ½Π°Ρ‡Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ€ΡƒΡˆΠ΅Π½ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ 2 — нСизвСстно, ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ символу Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚ΡŒΡΡ символ I).

Π‘ΠΈΠΌΠ²ΠΎΠ» V ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² ΠΊΠΎΠ½Ρ†Π΅ строки 1 Ρ€Π°Π· послС символа I, Ссли ΠΏΠ΅Ρ€Π΅Π΄ послСдним находятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ символы X (Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡŽ 4).

рис. 4. Автомат для распознавания римских констант

Бостояния Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°:

S — Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС;

Sg — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ Π·Π½Π°ΠΊΠ° константы.

1 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа X.

2 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа V.

3 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа I.

4 — ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ ошибкС ΠΏΡ€. Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠΈ римской константы.

5 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ строки XX.

6 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ строки XXX.

7 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа I ΠΏΠΎΡΠ»Π΅ V, XV, XXV ΠΈΠ»ΠΈ XXXV.

8 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа X ΠΏΠΎΡΠ»Π΅ I, XI, XXI ΠΈΠ»ΠΈ XXXI.

9 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа V ΠΏΠΎΡΠ»Π΅ I, XI, XXI ΠΈΠ»ΠΈ XXXI.

10 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа I ΠΏΠΎΡΠ»Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ строки, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π° I.

11 — ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½ΠΎΠ΅ состояниС, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ символа I ΠΏΠΎΡΠ»Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ строки, Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉΡΡ Π½Π° II.

Π’ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ состояниС Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ римской константы, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΈΠ· Π»ΡŽΠ±ΠΎΠ³ΠΎ состояния, ΠΊΡ€ΠΎΠΌΠ΅ Sg ΠΈ 4, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ наступит ΠΊΠΎΠ½Π΅Ρ† лСксСмы.

2.3.4 ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚

ΠžΠ±ΡŠΠ΅Π΄ΠΈΠ½Ρ‘Π½Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ являСтся соСдинСниСм ΠΏΡ€ΠΈΠ²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈ ΠΎΠ±Ρ‰Π΅ΠΌ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΌ состоянии S. ВсС состояния ΠΈ Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ сигналы останутся Ρ‚Π΅ΠΌΠΈ ΠΆΠ΅.

2.4 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°

НСпосрСдствСнно лСксичСский Π°Π½Π°Π»ΠΈΠ· прСдставляСт собой 2 этапа: Π²Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксСм ΠΈ ΠΈΡ… Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅. На ΡΠΊΡ€Π°Π½ выводятся Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈ ΠΊΠΎΠ΄ΠΎΠ² лСксСм. ВсС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‚ΡΡ Π² Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° Π΄ΠΈΡΠΊΠ΅.

ПослС Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° становится Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ синтаксичСский Π°Π½Π°Π»ΠΈΠ·.

2.4.1 Π’Ρ‹Π΄Π΅Π»Π΅Π½ΠΈΠ΅ лСксСм

ΠŸΡ€ΠΎΡ†Π΅ΡΡ выдСлСния лСксСм состоит Π² ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу ΠΈ Π² ΡΠ»ΡƒΡ‡Π°Π΅ обнаруТСния символа-раздСлитСля Ρ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ лСксСмы. Π‘ΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ раздСлитСлями ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΊΠ°ΠΊ сами Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΠΈ (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы) Ρ‚Π°ΠΊ ΠΈ Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ. Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ прСдусмотрСны Π΄Π²ΠΎΠΉΠ½Ρ‹Π΅ Π·Π½Π°ΠΊΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ (`: =').

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

Вакая ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ дСйствий повторяСтся Π΄ΠΎ ΠΎΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΡ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ строки. ΠŸΡ€ΠΎΡ†Π΅ΡΡ выдСлСния лСксСм Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Select_Lex, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ строки, содСрТащиС Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ лСксСмы.

2.4.2 РаспознаваниС лСксСм

ΠŸΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ опрСдСляСтся Ρ‚ΠΈΠΏ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ лСксСмы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… распознаватСлСй. КаТдая лСксСма добавляСтся Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² лСксСм ΠΈ Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΡŽ Ρ‚ΠΈΠΏΡƒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ (констант, ΠΈΠΌΠ΅Π½, Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов). Если лСксСма ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π° (Ρ‚.Π΅. Π½Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠΈΡ‚ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΌΡƒ ΠΈΠ· Π²Ρ‹ΡˆΠ΅Π½Π°Π·Π²Π°Π½Π½Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ²), Ρ‚ΠΎ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ ΠΊΠΎΠ΄ΠΎΠ² лСксСм Π΅ΠΉ ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅Ρ‚ся Ρ‚ΠΈΠΏ Π•, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΎΡˆΠΈΠ±ΠΊΡƒ.

КаТдая ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° распознавания, ΠΊΡ€ΠΎΠΌΠ΅ распознаватСля Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов, построСна ΠΊΠ°ΠΊ ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚. ОписаниС самих Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ΠΎ Π²Ρ‹ΡˆΠ΅. Π’ ΠΏΠ»Π°Π½Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚Π°ΠΊΠΎΠΉ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ элСмСнты:

константа, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС (ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ 0);

мноТСство состояний, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΡƒΠ΄Π°Ρ‡Π½ΠΎΠΌΡƒ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΡŽ лСксСмы;

мноТСство состояний, ΡΠ²ΠΈΠ΄Π΅Ρ‚Π΅Π»ΡŒΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ Π² Π»Π΅ΠΊΡΠ΅ΠΌΠ΅;

РаспознаватСлСм ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² являСтся функция Ident, 16-Ρ€ΠΈΡ‡Π½Ρ‹Ρ… констант — функция FConst, римских констант — функция Rome. ВсС ΠΎΠ½ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Ссли лСксСма распознана ΠΈ — 1 Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. РаспознаватСлСм Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов являСтся функция Termin. Она Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 3, Ссли лСксСма — ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ слово, 1 — Ссли Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ, 2 — Ссли Π·Π½Π°ΠΊ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ. Если лСксСма Π½Π΅ ΡΠ²Π»ΡΠ΅Ρ‚ся Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌ символом, Ρ‚ΠΎ Ρ„ункция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ — 1. Если лСксСма ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°, Ρ‚ΠΎ ΠΎΠ½Π° заносится Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² лСксСм с Ρ‚ΠΈΠΏΠΎΠΌ E ΠΈ Π²Ρ‹Π΄Π°Ρ‘тся сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ (ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Err_Lex). ВсС эти ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ TForm1. N5Click (соотвСтствуСт Π²Ρ‹Π±ΠΎΡ€Ρƒ ΠΏΡƒΠ½ΠΊΡ‚Π° мСню Анализатор/ЛСксичСский). Π’ Π½Π΅ΠΉ производится ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ всСх Ρ‚Π°Π±Π»ΠΈΡ†, Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ выдСлСния лСксСм ΠΈ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ WriteLex (см. Π½ΠΈΠΆΠ΅).

Поиск ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², констант ΠΈ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов Π² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… производится, соотвСтствСнно, ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ Search_Ident, Search_Const ΠΈ Search_Term, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ — ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°ΠΌΠΈ Add_Ident, Add_Const ΠΈ Add_Term. ВсС ΠΎΠ½ΠΈ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ WriteLex, Π²Ρ…ΠΎΠ΄Π½Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ распознавания лСксСм, Ρ‚. Π΅. Ρ‚ΠΈΠΏΡ‹ лСксСм. Π—Π°ΠΏΠΈΡΡŒ Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² лСксСм производится ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ WriteCode, Π²Ρ‹Π²ΠΎΠ΄ всСх Ρ‚Π°Π±Π»ΠΈΡ† Π½Π° ΡΠΊΡ€Π°Π½ — ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ vyvod.

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ констант Π² Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ производится ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ΠΎΠΉ perevod.

2.4.3 РСализация лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

ΠŸΡ€ΠΈΠ²Π΅Π΄Ρ‘ΠΌ тСкст ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°:

// ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° констант Π² Π΄Π΅ΡΡΡ‚ΠΈΡ‡Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ

procedure perevod (SS: string; var Str16: string);

var ch3, ch4,ch, i: integer;

zn: string;

begin

ch: =0; // для римских констант

if (SS ='X') or (SS ='V') or (SS ='I') then

begin

zn: =SS ;

delete (SS, 1,1);

while Length (SS) <>0 do

begin

if SS ='X' then begin ch: =ch+10; delete (SS, 1,1); end

else begin

if SS ='V'then begin ch: =ch+5; delete (SS, 1,1); end

else begin

if ((SS ='I') and (SS ='I')) or ((SS ='I') and (SS ='')) then begin ch: =ch+1; delete (SS, 1,1); end

else begin

if (SS ='I') and (SS ='X') then begin ch: =ch+9; delete (SS, 1,2); end

else begin

if (SS ='I') and (SS ='V') then begin ch: =ch+4; delete (SS, 1,2); end;

end; end; end; end; end;

str16: =zn+IntToStr (ch);

exit;

end;

// для 16-Ρ€ΠΈΡ‡. констант

If SS in ['0'. '9']

then

ch3: =StrToInt (SS [3]) *16

else

if SS in ['A'. 'F']

then

begin

ch3: =ord (SS [3]);

case ch3 of

65: ch3: =10*16;

66: ch3: =11*16;

67: ch3: =12*16;

68: ch3: =13*16;

69: ch3: =14*16;

70: ch3: =15*16;

end;

end;

If SS in ['0'. '9']

then

ch4: =StrToInt (SS [4])

else

if SS in ['A'. 'F']

then

begin

ch4: =ord (SS [4]);

case ch4 of

65: ch4: =10;

66: ch4: =11;

67: ch4: =12;

68: ch4: =13;

69: ch4: =14;

70: ch4: =15;

end;

end;

ch: =ch3+ch4;

If (SS ='0') and (SS ='0')

then Str16: =IntToStr (ch)

else Str16: =SS +IntToStr (ch);

end;

procedure TForm1. N3Click (Sender: TObject);

begin

close;

end;

function Select_Lex (S: string; {исх. строка} var Rez: string; {лСксСма}N: integer {тСкущая позиция}): integer;

label 1;

begin // функция Π²Ρ‹Π±ΠΎΡ€Π° слов ΠΈΠ· ΡΡ‚Ρ€ΠΎΠΊΠΈ

k: = Length (S);

Rez: ='';

i: =N; // Ρ‚ΠΎΡ‡ΠΊΠ° продолТСния Π² ΡΡ‚Ρ€ΠΎΠΊΠ΅

while (S [i] =' ') and (i<= k) do i: =i+1; // пропуск ' '

while not (S [i] in deleter) and (i<= k) do // Π½Π°ΠΊΠΎΠΏΠ»Π΅Π½ΠΈΠ΅ лСксСмы

begin

if s [i] ='$' then

begin

Rez: =s [i] +s [i+1] ;

i: =i+2;

end

else begin

1: Rez: =Rez+s [i] ;

i: =i+1;

end;

end;

if Rez='' then

begin

if (s [i] =': ') then

begin

if (s [i+1] ='=') then // Π² ΡΠ»ΡƒΡ‡Π°Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· Π΄Π²ΡƒΡ… символов

begin

Rez: =s [i] +s [i+1] ;

Select_Lex: =i+2;

end

else

begin

Rez: =s [i] ;

Select_Lex: =i+1;

end;

end else

begin

if ((s [i] ='+') or (s [i] ='-')) and (s [i-1] =' (')

then begin

Rez: =s [i] +s [i+1] ;

i: =i+2;

goto 1;

end

else begin

Rez: =s [i] ;

Select_Lex: =i+1;

end; end;

end else Select_Lex: =i;

end;

procedure Add_Const (Curr_term: integer; str_lex: string); // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° добавлСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²ΠΎ

begin

if NumConst=1 then // Если ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° Π΅Ρ‰Π΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½, Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ.

begin

perevod (str_lex, str16);

Const_tab [NumConst]. value: =str_lex;

Const_tab [NumConst]. nomer: =NumConst;

Const_tab [NumConst]. Val10: =str16;

Const_tab [NumConst]. Left: =0;

Const_tab [NumConst]. Right: =0;

Const_tab [NumConst]. Way: ='V';

Exit;

end;

if (CompareStr (Const_tab [Curr_term]. value, str_lex) >0) then // Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° Π΄Π΅Ρ€Π΅Π²Π° большС добавляСмого

if Const_tab [Curr_term]. Left=0 then // Ссли Ρƒ ΡΡ‚ΠΎΠ³ΠΎ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° Π½Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ указатСля, Ρ‚ΠΎ

begin

perevod (str_lex, str16);

Const_tab [Curr_term]. Left: =NumConst; // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»Π΅Π²ΠΎΠ³ΠΎ элСмСнта.

Const_tab [NumConst]. value: =str_lex;

Const_tab [NumConst]. nomer: =NumConst;

Const_tab [NumConst]. Val10: =str16;

Const_tab [NumConst]. Left: =0;

Const_tab [NumConst]. Right: =0;

Const_tab [NumConst]. Way: =Const_tab [NumConst]. Way+'L';

end else begin

Const_tab [NumConst]. Way: =Const_tab [NumConst]. Way+'L';

Add_Const (Const_tab [Curr_term]. Left, str_lex); // Если Π»Π΅Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сущСствуСт, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π»Π΅Π²ΠΎΠ³ΠΎ указатСля.

end;

if (CompareStr (Const_tab [Curr_term]. value, str_lex) <0) then // Ссли Ρƒ ΡΡ‚ΠΎΠ³ΠΎ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° Π½Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ указатСля, Ρ‚ΠΎ

if Const_tab [Curr_term]. Right=0 then

begin

perevod (str_lex, str16);

Const_tab [Curr_term]. Right: =NumConst; // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡ€Π°Π²Ρ‹ΠΉ элСмСнт.

Const_tab [NumConst]. value: =str_lex;

Const_tab [NumConst]. nomer: =NumConst;

Const_tab [NumConst]. Val10: =str16;

Const_tab [NumConst]. Left: =0;

Const_tab [NumConst]. Right: =0;

Const_tab [NumConst]. Way: =Const_tab [NumConst]. Way+'R';

end else begin

Const_tab [NumConst]. Way: =Const_tab [NumConst]. Way+'R';

Add_Const (Const_tab [Curr_term]. Right, str_lex); // Если ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сущСствуСт, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ указатСля.

end;

end;

procedure Add_Term (Curr_term: integer; str_lex: string); // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° добавлСния ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² Π² Π΄Π΅Ρ€Π΅Π²ΠΎ

begin

if NumTerm=1 then // Если ΠΊΠΎΡ€Π΅Π½ΡŒ Π΄Π΅Ρ€Π΅Π²Π° Π΅Ρ‰Π΅ Π½Π΅ ΡΠΎΠ·Π΄Π°Π½, Ρ‚ΠΎ ΡΠΎΠ·Π΄Π°Π΅ΠΌ Π΅Π³ΠΎ.

begin

Term_tab [NumTerm]. lex: =str_lex;

Term_tab [NumTerm]. nomer: =NumTerm;

Term_tab [NumTerm]. Left: =0;

Term_tab [NumTerm]. Right: =0;

Term_tab [NumTerm]. Way: ='V';

Exit;

end;

if (CompareStr (Term_tab [Curr_term]. lex, str_lex) >0) then // Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΡƒΠ·Π»Π° Π΄Π΅Ρ€Π΅Π²Π° большС добавляСмого

if Term_tab [Curr_term]. Left=0 then // Ссли Ρƒ ΡΡ‚ΠΎΠ³ΠΎ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° Π½Π΅Ρ‚ Π»Π΅Π²ΠΎΠ³ΠΎ указатСля, Ρ‚ΠΎ

begin

Term_tab [Curr_term]. Left: =NumTerm; // Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π»Π΅Π²ΠΎΠ³ΠΎ элСмСнта.

Term_tab [NumTerm]. lex: =str_lex;

Term_tab [NumTerm]. nomer: =NumTerm;

Term_tab [NumTerm]. Left: =0;

Term_tab [NumTerm]. Right: =0;

Term_tab [NumTerm]. Way: =Term_tab [NumTerm]. Way+'L';

end else begin

Term_tab [NumTerm]. Way: =Term_tab [NumTerm]. Way+'L';

Add_Term (Term_tab [Curr_term]. Left, str_lex); // Если Π»Π΅Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сущСствуСт, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для Π»Π΅Π²ΠΎΠ³ΠΎ указатСля.

end;

if (CompareStr (Term_tab [Curr_term]. lex, str_lex) <0) then // Ссли Ρƒ ΡΡ‚ΠΎΠ³ΠΎ элСмСнта Π΄Π΅Ρ€Π΅Π²Π° Π½Π΅Ρ‚ ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ указатСля, Ρ‚ΠΎ

if Term_tab [Curr_term]. Right=0 then

begin

Term_tab [Curr_term]. Right: =NumTerm; // Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ ΠΏΡ€Π°Π²Ρ‹ΠΉ элСмСнт.

Term_tab [NumTerm]. lex: =str_lex;

Term_tab [NumTerm]. nomer: =NumTerm;

Term_tab [NumTerm]. Left: =0;

Term_tab [NumTerm]. Right: =0;

Term_tab [NumTerm]. Way: =Term_tab [NumTerm]. Way+'R';

end else begin

Term_tab [NumTerm]. Way: =Term_tab [NumTerm]. Way+'R';

Add_Term (Term_tab [Curr_term]. Right, str_lex); // Если ΠΏΡ€Π°Π²Ρ‹ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ сущСствуСт, Ρ‚ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ ΡƒΠΆΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ для ΠΏΡ€Π°Π²ΠΎΠ³ΠΎ указатСля.

end;

end;

procedure Add_Ident (str: string); // ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° добавлСния константы

var i: integer;

begin

kod: =Length (str) +2;

hesh: =0;

for i: =1 to Length (str) do hesh: =hesh+ord (str [i]); // вычислСниС Ρ…ΡΡˆ

hesh: =round (hesh/kod); // ΠΌΠ΅Ρ‚ΠΎΠ΄ дСлСния

while (Id_tab [hesh]. lex<>'') and (hesh

begin

Id_tab [hesh]. ssylka: =hesh+1;

hesh: =hesh+1;

end;

Id_tab [hesh]. nomer: =Numid; // запись Π΄Π°Π½Π½Ρ‹Ρ…

Id_tab [hesh]. lex: =str;

end;

function Search_Ident (str: string): integer; // функция поиска Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Π°

var i: integer;

label 1;

begin

kod: =Length (str) +2;

hesh: =0;

for i: =1 to Length (str) do hesh: =hesh+ord (str [i]); // вычислСниС Ρ…ΡΡˆ

hesh: =round (hesh/kod);

1: if str=Id_tab [hesh]. lex then Search_Ident: =Id_tab [hesh]. nomer else // поиск ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°

begin

if Id_tab [hesh]. ssylka=0 then Search_Ident: =0 else

begin

hesh: =Id_tab [hesh]. ssylka;

goto 1;

end;

end;

end;

procedure Search_Const (Curr_term: integer; str_lex: string); // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° поиска лСксСм Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

begin

Constyes: =0; // Ρ„Π»Π°Π³: Π½Π°ΠΉΠ΄Π΅Π½Π° Π»ΠΈ лСксСма

if (NumConst<>0) and (str_lex<>'') then

begin

if (CompareStr (Const_tab [Curr_term]. value, str_lex) >0) and (Const_tab [Curr_term]. Left<>0) then

Search_Const (Const_tab [Curr_term]. Left, str_lex); // рСкурсивный «ΡΠΏΡƒΡΠΊ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ»

if (CompareStr (Const_tab [Curr_term]. value, str_lex) <0) and (Const_tab [Curr_term]. Right<>0) then

Search_Const (Const_tab [Curr_term]. Right, str_lex);

if Const_tab [Curr_term]. value=str_lex then Constyes: =Const_tab [Curr_term]. nomer;

end;

end;

procedure Search_Term (Curr_term: integer; str_lex: string); // ΠŸΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° поиска лСксСм Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

begin

Termyes: =0; // Ρ„Π»Π°Π³: Π½Π°ΠΉΠ΄Π΅Π½Π° Π»ΠΈ лСксСма

if (NumTerm<>0) and (str_lex<>'') then

begin

if (CompareStr (Term_tab [Curr_term]. lex, str_lex) >0) and (Term_tab [Curr_term]. Left<>0) then

Search_Term (Term_tab [Curr_term]. Left, str_lex); // рСкурсивный «ΡΠΏΡƒΡΠΊ ΠΏΠΎ Π΄Π΅Ρ€Π΅Π²Ρƒ»

if (CompareStr (Term_tab [Curr_term]. lex, str_lex) <0) and (Term_tab [Curr_term]. Right<>0) then

Search_Term (Term_tab [Curr_term]. Right, str_lex);

if Term_tab [Curr_term]. lex=str_lex then Termyes: =Term_tab [Curr_term]. nomer;

end;

end;

// функция распознавания 16-Ρ€ΠΈΡ‡. констант

function FConst (str: string): integer;

var

sost: byte;

begin

sost: =0;

if str ='$' then // распознаём символ '$'

begin

sost: =1;

delete (str, 1,1);

end

else exit;

if (str ='+') or (str ='-') then // распознаём Π·Π½Π°ΠΊ

begin

sost: =2;

delete (str, 1,1)

end

else begin sost: =4; exit; end;

if str='' then exit;

while length (str) >0 do begin

if (str in cifra) or (str in bukva)

then sost: =2 // распознаём Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹

else begin sost: =4; exit;

end;

delete (str, 1,1);

end;

sost: =3;

if sost=3 then FConst: =1 else FConst: =-1;

end;

function termin: integer; // Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов

begin

termin: =-1;

for k: =1 to 14 do if Words [k] =Lexem then termin: =3;

for k: =1 to 8 do if Razdel [k] =Lexem then termin: =1;

for k: =1 to 11 do if Operacii [k] =Lexem then termin: =2;

end;

function Rome (str: string): integer; // Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ римских констант

var sost: byte;

begin

sost: =0;

if (str ='-') or (str ='+')

then begin sost: =12; delete (str, 1,1); end;

if str='' then exit;

if str ='X'

then begin sost: =1; delete (str, 1,1) end

else begin

if str ='V' then begin sost: =2; delete (str, 1,1) end

else begin

if str ='I' then begin sost: =3; delete (str, 1,1) end

else begin sost: =4; exit; end; end; end;

while Length (str) <>0 do begin

case sost of

1: if str ='X'

then begin sost: =5; delete (str, 1,1) end

else begin

if str ='V' then begin sost: =2; delete (str, 1,1) end

else begin

if str ='I' then begin sost: =3; delete (str, 1,1) end

else begin sost: =4; exit; end; end; end;

2: if str ='I'

then begin sost: =7; delete (str, 1,1) end

else begin sost: =4; exit; end;

3: if str ='X'

then begin sost: =8; delete (str, 1,1) end

else begin

if str ='V' then begin sost: =9; delete (str, 1,1) end

else begin

if str ='I' then begin sost: =10; delete (str, 1,1) end

else begin sost: =4; exit; end; end; end;

4: exit;

5: if str ='X'

then begin sost: =6; delete (str, 1,1) end

else begin

if str ='V' then begin sost: =2; delete (str, 1,1) end

else begin

if str ='I' then begin sost: =3; delete (str, 1,1) end

else begin sost: =4; exit; end; end; end;

6: if str ='V'

then begin sost: =2; delete (str, 1,1) end

else begin

if str ='I' then begin sost: =3; delete (str, 1,1) end

else begin sost: =4; exit; end; end;

7: if str ='I'

then begin sost: =10; delete (str, 1,1) end

else begin sost: =4; exit; end;

8: begin sost: =4; exit; end;

9: begin sost: =4; exit; end;

10: if str ='I'

then begin sost: =11; delete (str, 1,1) end

else begin sost: =4; exit; end;

11: begin sost: =4; exit; end;

end;

end;

if (sost=4) or (sost=12) then Rome: =-1 else Rome: =1;

end;

// функция распознавания ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

function Ident (str: string): integer;

var

sost: byte;

begin

sost: =0; // рСализация ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ³ΠΎ Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚Π°

if str in ['a'. 'z'] then

begin

sost: =1;

delete (str, 1,1)

end

else exit;

while length (str) >0 do begin

if str in ['a'. 'z','0'. '9','_']

then begin sost: =1; delete (str, 1,1); end

else begin sost: =3; exit; end;

end;

sost: =2;

if sost=2 then ident: =1 else ident: =-1;

end;

procedure WriteCode (nomer: integer; lex: string; typ: char; num: integer); // запись Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² лСксСм

begin

Code_Tab [NumLex]. nomer: =nomer;

Code_Tab [NumLex]. Lex: =lex;

Code_Tab [NumLex]. typ: =typ;

Code_Tab [NumLex]. Num: =num;

Code_Tab [NumLex]. numstr: =string_counter+1;

end;

procedure WriteLex (typelex: char); // запись лСксСм Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

begin

case typelex of

'C': begin // Ссли лСксСма-16-Ρ€ΠΈΡ‡. константа

NumLex: =NumLex+1;

Search_Const (1,Lexem);

if Constyes=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumConst: =NumConst+1;

Add_Const (1,Lexem);

Const_tab [NumConst]. Typ: ='16-Ρ€ΠΈΡ‡. ';

Const_tab [Numconst]. Width: ='2 Π±Π°ΠΉΡ‚Π°';

WriteCode (NumLex, Lexem,'C', NumConst);

end else // Ссли лСксСма найдСна

begin

WriteCode (NumLex, Lexem,'C', Constyes);

end;

end;

'M': begin // Ссли лСксСма-римская константа

NumLex: =NumLex+1;

Search_Const (1,Lexem);

if Constyes=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumConst: =NumConst+1;

Add_Const (1,Lexem);

Const_tab [NumConst]. Typ: ='римск. ';

Const_tab [Numconst]. Width: ='2 Π±Π°ΠΉΡ‚Π°';

WriteCode (NumLex, Lexem,'C', NumConst);

end else // Ссли лСксСма найдСна

begin

WriteCode (NumLex, Lexem,'C', Constyes);

end;

end;

'I': begin // Ссли лСксСма-ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€

NumLex: =NumLex+1;

y: =Search_Ident ({1,}Lexem);

if y=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumId: =NumId+1;

WriteCode (NumLex, Lexem,'I', NumId);

Add_Ident (Lexem);

end else WriteCode (NumLex, Lexem,'I', y); // Ссли лСксСма найдСна

end;

'K': begin // Ссли лСксСма-слуТСбноС слово

NumLex: =NumLex+1;

Search_Term (1,Lexem);

if Termyes=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumTerm: =NumTerm+1;

Add_Term (1,Lexem);

Term_tab [Numterm]. razd: =0;

Term_tab [Numterm]. oper: =0;

Term_tab [Numterm]. slug: =1;

WriteCode (NumLex, Lexem,'T', NumTerm);

end else WriteCode (NumLex, Lexem,'T', Termyes); // Ссли лСксСма найдСна

end;

'R': begin // Ссли лСксСма-Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ

NumLex: =NumLex+1;

Search_Term (1,Lexem);

if Termyes=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumTerm: =NumTerm+1;

Add_Term (1,Lexem);

Term_tab [NumTerm]. razd: =1;

Term_tab [NumTerm]. oper: =0;

Term_tab [NumTerm]. slug: =0;

WriteCode (NumLex, Lexem,'T', NumTerm)

end else WriteCode (NumLex, Lexem,'T', Termyes) // Ссли лСксСма найдСна

end;

'O': begin // Ссли лСксСма-Π·Π½Π°ΠΊ опСрация

NumLex: =NumLex+1;

Search_Term (1,Lexem);

if Termyes=0 then // Ссли лСксСма Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½Π°

begin

NumTerm: =NumTerm+1;

Add_Term (1,Lexem);

Term_tab [Numterm]. razd: =0;

Term_tab [Numterm]. oper: =1;

Term_tab [Numterm]. slug: =0;

WriteCode (NumLex, Lexem,'T', NumTerm)

end else WriteCode (NumLex, Lexem,'T', Termyes) // Ссди лСксСма найдСна

end;

end;

end;

procedure TForm1. N5Click (Sender: TObject);

var i, pip: integer;

begin

for k: =1 to numid do // ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ²

begin

id_tab [k]. lex: ='0';

id_tab [k]. nomer: =0;

id_tab [i]. ssylka: =0;

end;

for i: =1 to numlex do // ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

begin

Code_Tab [i]. Lex: ='';

Code_Tab [i]. typ: =#0;

Code_Tab [i]. Num: =0;

Code_Tab [i]. nomer: =0;

end;

for i: =0 to numconst do // ΠΎΠ±Π½ΡƒΠ»Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант

begin

Const_tab [i]. nomer: =0;

Const_tab [i]. value: ='';

Const_tab [i]. Typ: ='';

Const_tab [i]. Width: ='';

Const_tab [i]. Val10: ='';

Const_tab [k]. Left: =0;

Const_tab [k]. Right: =0;

Const_tab [k]. Way: ='';

end;

for i: =1 to numterm do

begin

Term_tab [i]. nomer: =0;

Term_tab [i]. Lex: ='';

Term_tab [i]. razd: =0;

Term_tab [i]. oper: =0;

Term_tab [i]. slug: =0;

Term_tab [k]. Left: =0;

Term_tab [k]. Right: =0;

Term_tab [k]. Way: ='';

end;

// инициализация

NumLex: =0; NumId: =0; NumConst: =0; NumErr: =0; NumTerm: =0;

Error: =false; Found: =false;

i: =0; j: =0; k: =0; y: =0;

String_counter: =0;

Memo2. Lines. Clear;

N6. Enabled: =true;

while string_counter<=Memo1. Lines. Count do // Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΡΡ‚Ρ€ΠΎΠΊΠ°ΠΌ Ρ„Π°ΠΉΠ»Π°

begin

n: =1;

m: =1;

s: =Form1. Memo1. Lines. Strings [string_counter] ;

for l: =1 to 2 do

while m<=Length (s) do // Ρ†ΠΈΠΊΠ» ΠΏΠΎ ΡΡ‚Ρ€ΠΎΠΊΠ΅

begin

n: =m;

m: =Select_Lex (s, Lexem, n);

if (Lexem<>'') and not (Lexem in [#0. #32]) then

begin

if FConst (Lexem) =1 then WriteLex ('C') else // Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ записи

if Termin=3 then WriteLex ('K') else

if Rome (Lexem) =1 then WriteLex ('M') else

if Ident (Lexem) =1 then WriteLex ('I') else

if Termin=1 then WriteLex ('R') else

if Termin=2 then WriteLex ('O')

else Err_lex;

end;

end;

string_counter: =string_counter+1;

end;

vyvod; // Π²Ρ‹Π·ΠΎΠ² ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π°

end;

procedure TForm1. vyvod; // Π’Ρ‹Π²ΠΎΠ΄ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ²

var

f: textfile; // Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»

begin

StringGrid1. RowCount: =NumConst+1; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ числа строк Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ…

StringGrid2. RowCount: =NumId+1;

StringGrid3. RowCount: =NumTerm+1;

StringGrid4. RowCount: =NumLex+1;

StringGrid1. Cells [0,0]: ='β„–'; StringGrid1. Cells [1,0]: ='ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π°'; StringGrid1. Cells [2,0]: ='Π’ΠΈΠΏ';

StringGrid1. Cells [3,0]: ='Π¨ΠΈΡ€ΠΈΠ½Π°'; StringGrid1. Cells [4,0]: ='10-Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚';

StringGrid1. Cells [5,0]: ='L'; StringGrid1. Cells [6,0]: ='R';

StringGrid1. Cells [7,0]: ='ΠŸΡƒΡ‚ΡŒ'; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

for k: =1 to NumConst do // Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант

begin

StringGrid1. cells [0,k]: = Inttostr (Const_Tab [k]. nomer);

StringGrid1. cells [1,k]: = Const_Tab [k]. value;

StringGrid1. cells [2,k]: = Const_Tab [k]. Typ;

StringGrid1. cells [3,k]: = Const_Tab [k]. Width;

StringGrid1. cells [4,k]: = Const_Tab [k]. Val10;

StringGrid1. cells [5,k]: = Inttostr (Const_Tab [k]. Left);

StringGrid1. cells [6,k]: = Inttostr (Const_Tab [k]. Right);

StringGrid1. cells [7,k]: = Const_Tab [k]. Way;

end;

AssignFile (F,'Const. txt'); // запись Π² Ρ„Π°ΠΉΠ» Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант

Rewrite (F);

for k: =1 to NumConst do

Writeln (F, StringGrid1. cells [0,k] +' '+StringGrid1. cells [1,k] +' '+StringGrid1. cells [2,k] +' '+StringGrid1. cells [3,k]);

CloseFile (F);

StringGrid2. Cells [0,0]: ='β„–'; StringGrid2. Cells [1,0]: ='Имя'; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

k: =0;

k1: =0;

while k

begin

if Id_tab [k1]. lex<>'' then

begin

StringGrid2. cells [0,k+1]: =IntToStr (Id_tab [k1]. nomer);

StringGrid2. cells [1,k+1]: =Id_Tab [k1]. lex;

k: =k+1;

end;

k1: =k1+1;

end;

AssignFile (F,'Ident. txt'); // запись Π² Ρ„Π°ΠΉΠ» Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант

Rewrite (F);

for k: =1 to NumId do Writeln (F, StringGrid2. cells [0,k] +' '+StringGrid2. cells [1,k]);

CloseFile (F);

StringGrid3. Cells [0,0]: ='β„–'; StringGrid3. Cells [1,0]: ='Π‘ΠΈΠΌΠ²ΠΎΠ»'; StringGrid3. Cells [2,0]: ='Π Π°Π·Π΄Π΅Π». ';

StringGrid3. Cells [3,0]: ='Π—Π½. ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ'; StringGrid3. Cells [4,0]: ='ΠšΠ»ΡŽΡ‡. слово';

StringGrid3. Cells [5,0]: ='L'; StringGrid3. Cells [6,0]: ='R';

StringGrid3. Cells [7,0]: ='ΠŸΡƒΡ‚ΡŒ'; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

for k: =1 to NumTerm do // Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов

begin

StringGrid3. cells [0,k]: = Inttostr (Term_Tab [k]. nomer);

StringGrid3. cells [1,k]: = Term_Tab [k]. lex;

StringGrid3. cells [2,k]: = Inttostr (Term_Tab [k]. razd);

StringGrid3. cells [3,k]: = Inttostr (Term_Tab [k]. oper);

StringGrid3. cells [4,k]: = Inttostr (Term_Tab [k]. slug);

StringGrid3. cells [5,k]: = Inttostr (Term_Tab [k]. Left);

StringGrid3. cells [6,k]: = Inttostr (Term_Tab [k]. Right);

StringGrid3. cells [7,k]: = Term_Tab [k]. Way;

end;

AssignFile (F,'Term. txt'); // запись Π² Ρ„Π°ΠΉΠ» Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов

Rewrite (F);

for k: =1 to NumTerm do Writeln (F, StringGrid3. cells [0,k] +' '+StringGrid3. cells [1,k] +' '+StringGrid3. cells [2,k] +' '+StringGrid3. cells [3,k] +' '+StringGrid3. cells [4,k]);

CloseFile (F);

StringGrid4. Cells [0,0]: ='β„–'; StringGrid4. Cells [1,0]: ='Π’ΠΈΠΏ'; StringGrid4. Cells [2,0]: ='β„– Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅'; StringGrid4. Cells [3,0]: ='ЛСксСма'; // ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ²

for k: =1 to NumLex do // Π²Ρ‹Π²ΠΎΠ΄ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠ΄ΠΎΠ² лСксСм

begin

StringGrid4. cells [0,k]: = Inttostr (Code_Tab [k]. nomer);

StringGrid4. cells [1,k]: = Code_Tab [k]. typ;

StringGrid4. cells [2,k]: = Inttostr (Code_Tab [k]. num);

StringGrid4. cells [3,k]: = Code_Tab [k]. lex;

end;

AssignFile (F,'Cod. txt'); // запись Π² Ρ„Π°ΠΉΠ» Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹

Rewrite (F);

for k: =1 to NumLex do Writeln (F, StringGrid4. cells [0,k] +' '+StringGrid4. cells [1,k] +' '+StringGrid4. cells [2,k] +' '+StringGrid4. cells [3,k]);

CloseFile (F);

end;

procedure TForm1. Err_Lex; // ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π° Π²Ρ‹Π²ΠΎΠ΄Π° ошибки Π² Π»Π΅ΠΊΡΠ΅ΠΌΠ΅

begin

Memo2. Lines. Add ('Π’ строкС β„–'+Inttostr (String_counter+1) +' ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Π°Ρ лСксСма '+Lexem);

NumErr: =NumErr+1;

NumLex: =NumLex+1;

Code_Tab [NumLex]. nomer: =NumLex;

Code_Tab [NumLex]. Lex: =Lexem;

Code_Tab [NumLex]. typ: ='E';

Code_Tab [NumLex]. Num: =NumErr;

Exit;

end;

2.4.4 ВСстированиС лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ошибок:

program var15;

var n: integer;

begin

n: =$+00;

repeat

n: =n- (-XII);

until n<$-0A;

end.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ — Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ констант, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈ ΠΊΠΎΠ΄ΠΎΠ² лСксСм (см. Ρ€ΠΈΡ. 5, Π±) ΠΈ ΠΎΡ‚сутствиС сообщСниий ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (см. Ρ€ΠΈΡ. 5, Π°).

рис. 5, Π°.

рис. 5, Π±

рис. 5. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‰Π΅ΠΉ ошибок.

ВСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ содСрТит ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ лСксСмы var% ΠΈ $+MN.

program var15;

var% n: integer;

begin

n: =$+MN;

repeat

n: =n- (-XII);

until n<$-0A;

end.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ — Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΊΠΎΠ΄ΠΎΠ² лСксСм эти лСксСмы занСсСны с Ρ‚ΠΈΠΏΠΎΠΌ Π•, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹ (см. Π ΠΈΡ. 6, Π°, Π±), ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π΄Π°Π»Π° Ρ‚Π°ΠΊΠΆΠ΅ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… (Рис. 6, Π²).

Рис. 6, Π°

Рис. 6, Π±

Рис. 6, Π²

Рис. 6. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ тСстирования ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, содСрТащСй ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ лСксСмы.

3. Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

3.1 Π£Ρ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ языка ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρƒ задания

БинтаксичСский Π°Π½Π°Π»ΠΈΠ· производится ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ рСкурсивного спуска.

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

ΠŸΡ€Π°Π²ΠΈΠ»Π° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π° относятся ΠΊ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π²ΠΈΠ΄Π° LL (1), Ρ‚. Π΅. ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ лСвосторонний просмотр ΠΈ Π»Π΅Π²ΠΎΡΡ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠΉ Π²Ρ‹Π²ΠΎΠ΄, ΠΏΡ€ΠΈ этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ 1 символа.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ языка, записанных Π² Ρ„ΠΎΡ€ΠΌΠ΅ Бэкуса-Наура, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π²ΠΈΠ΄:

1. <οΏ½ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°>>program<�имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹>;

var<�список описаний>

begin<�список ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²>end.

2. <�имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹>>ИМЯ

3. <�список описаний>><�описаниС>; {<�описаниС>; }

4. <�описаниС>><�список ΠΈΠΌΡ‘Π½>: <οΏ½Ρ‚ΠΈΠΏ>

5. <οΏ½Ρ‚ΠΈΠΏ>>real

6. <�список ΠΈΠΌΡ‘Π½>>ИМЯ{, ИМЯ}

7. <�список ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²>><οΏ½ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>; {<οΏ½ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>; }

8. <οΏ½ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>><�присваиваниС> | <οΏ½Ρ†ΠΈΠΊΠ»>

9. <�присваиваниС>>ИМЯ: =<οΏ½Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

10. <οΏ½Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>><�простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>{ (=, <, <>, >, >=, <=) <�простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>}

11. <�простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>><οΏ½Ρ‚Π΅Ρ€ΠΌ> - <οΏ½Ρ‚Π΅Ρ€ΠΌ>

12. <οΏ½Ρ‚Π΅Ρ€ΠΌ>><οΏ½ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ>*<οΏ½ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ>

13. <οΏ½ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ>>ИМЯ | КОНБВАНВА | <�простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

14. <οΏ½Ρ†ΠΈΠΊΠ»>>repeat<οΏ½Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°>until<οΏ½Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

15. <οΏ½Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°>><οΏ½ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>|<�составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>

16. <�составной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>>begin<�список ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²>end

Π’ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅, ΠΏΠΎΠΌΠΈΠΌΠΎ общСпринятых, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы: ИМЯ — ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€; КОНБВАНВА — 16-ричная ΠΈΠ»ΠΈ римская константа.

3.2 Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠ° синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°

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

Π”Π°Π»Π΅Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ распознавания. ΠžΠ±Ρ‰ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΈΡ… ΠΏΠΎΡΡ‚роСния Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ: ΠΈΠ·Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ устанавливаСтся Π² FALSE. Π”Π°Π»Π΅Π΅ происходит поиск символов входящих Π² Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π΅ΠΌΡ‹ΠΉ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π». Если ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ содСрТит Π΄Ρ€ΡƒΠ³ΠΎΠΉ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ, Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΡΡ…ΠΎΠ΄ΠΈΡ‚ Π²Ρ‹Π·ΠΎΠ² ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Если ΠΆΠ΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа, Ρ‚ΠΎ Ρ„ункция сама выполняСт запрос Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ лСксСмы ΠΈ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Π΅Ρ‚ Π΅Π΅ Ρ Ρ‚ΠΎΠΉ, которая Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ†ΠΈΠΈ. Π§Ρ‚Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ лСксСмы состоит Π² Π²Ρ‹Π±ΠΎΡ€Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта ΠΈΠ· Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΊΠΎΠ΄ΠΎΠ² лСксСм, Ρ‚. Π΅. Π² ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ элСмСнта Π½Π° 1 (Π² Π±Π»ΠΎΠΊ-схСмС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Π§Ρ‚Π‘Π»). Если происходит ошибка, Ρ‚ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ прСкращаСтся с Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π²Ρ‹Π²ΠΎΠ΄Π° сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅ (Π² Π±Π»ΠΎΠΊ-схСмС Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Ρ‚ΡŒΡΡ ΠΊΠ°ΠΊ Ошибка). ΠŸΡ€ΠΈΡ‡Π΅ΠΌ ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π°Π½Π°Π»ΠΈΠ·Π° Ρ‚Π°ΠΊΠΎΠ΅ сообщСниС выдаСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, ΠΈΠ½Π°Ρ‡Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ сообщСния ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚ΠΎΠ²Π΅Ρ€Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ. Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ содСрТит Π½ΠΎΠΌΠ΅Ρ€ строки ΠΈ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ ошибки. Если ошибок Π½Π΅ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΎ, Ρ‚ΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π΅Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ становится TRUE.

Lex_Progr: <οΏ½ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°>

Lex_Progr_Name: <�имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹>

Lex_Descr_List: <�список описаний>

Lex_Descr: <�описаниС>

Lex_Name_List: <�список ΠΈΠΌΡ‘Π½>

Lex_Type: <οΏ½Ρ‚ΠΈΠΏ>

Lex_Oper_List: <�список ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²>

Lex_Oper: <οΏ½ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€>

Lex_Assign: <�присваиваниС>

Lex_Exp: <οΏ½Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

Lex_Simple_Exp: <�простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅>

Lex_Term: <οΏ½Ρ‚Π΅Ρ€ΠΌ>

Lex_Mnozh <οΏ½ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ>

Lex_Repeat_Intil: <οΏ½Ρ†ΠΈΠΊΠ»>

Lex_Body <οΏ½Ρ‚Π΅Π»ΠΎ Ρ†ΠΈΠΊΠ»Π°>

3.3 Алгоритмы Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

НиТС прСдставлСны ΡƒΠΏΡ€ΠΎΡ‰Ρ‘Π½Π½Ρ‹Π΅ Π±Π»ΠΎΠΊ-схСмы Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ распознавания. ΠŸΡ€ΠΎΡΡ‚Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ распознаваниС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½Π΅ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Π΅ΠΌ Π² ΡΠΈΠ»Ρƒ ΠΈΡ… ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡΡ‚ΠΈ.

3.3.1 Ѐункция Lex_Progr

3.3.2 Ѐункция Lex_Descr_List

3.3.3 Ѐункция Lex_Descr

3.3.4 Ѐункция Lex_Name_List

3.3.5 Ѐункция Lex_Oper_List

3.3.6 Ѐункция Lex_Assign

3.3.7 Ѐункция Lex_Exp

3.3.8 Ѐункция Lex_Simple_Exp

3.3.9 Ѐункция Lex_Term

3.3.10 Ѐункция Lex_mnozh

3.3.11 Ѐункция Lex_Repeat_Until

3.3.12 Ѐункция Lex_Body

3.4 ВСксты Ρ€Π°ΡΠΏΠΎΠ·Π½Π°ΡŽΡ‰ΠΈΡ… ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€

function TForm1. Lex_Progr: boolean; // 1. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°

begin

Lex_Progr: =False;

if Code_Tab [i]. Lex='program' then i: =i+1 else // ΠΊΠΎΠ½Π΅Ρ† Π±Π»ΠΎΠΊΠ° для PROGRAM

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ слуТСбноС слово program, Π»ΠΈΠ±ΠΎ Π² Π½Π΅ΠΌ ошибка ', i);

Exit;

end;

if Lex_Prog_Name=false then Exit; // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

if Code_Tab [i]. Lex='; ' then i: =i+1 else // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для Ρ‚ΠΎΡ‡ΠΊΠΈ с Π·Π°ΠΏΡΡ‚ΠΎΠΉ

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠ° с Π·Π°ΠΏΡΡ‚ΠΎΠΉ послС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹', i-1);

Exit;

end;

if Code_Tab [i]. Lex='var' then i: =i+1 else // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для VAR

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ слуТСбноС слово var послС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹', i);

Exit;

end;

if Lex_descr_list=false then Exit;

if Code_Tab [i]. Lex='begin' then // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для BEGIN

begin

i: =i+1;

if Code_Tab [i]. Lex='; ' then

begin

Err_Synt ('ПослС begin нСдопустим символ «; «', i);

Exit;

end;

end else

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ слуТСбноС слово begin послС описаний ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…', i);

Exit;

end;

if Lex_oper_list=false then Exit;

if Code_Tab [i]. Lex='end' then i: =i+1 else // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для END

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ слуТСбноС слово end Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹', i);

Exit;

end; // Π½Π°Ρ‡Π°Π»ΠΎ Π±Π»ΠΎΠΊΠ° для Ρ‚ΠΎΡ‡ΠΊΠΈ

if Code_Tab [i]. Lex='. ' then Lex_Progr: =true else if Code_Tab [i]. Lex<>'' then Err_Synt ('ПослС слуТСбного слова END вмСсто Ρ‚ΠΎΡ‡ΠΊΠΈ находится «'+Code_Tab [i]. Lex+'» ', i) else Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ° послС слуТСбного слова END Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹', i-1);

end;

procedure TForm1. Err_Synt (text: string; l: integer);

begin

if Error<>true then

begin

Memo1. Lines [Code_tab [l]. numstr-1]: =Memo1. Lines [Code_tab [l]. numstr-1] +'!!! '+'Error!!! ';

Memo2. Lines [0]: =Memo2. Lines +text;

end;

Error: =true;

Exit;

end;

function TForm1. Lex_Prog_Name: boolean; // 2. имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

begin

Lex_Prog_Name: =False;

if (Code_Tab [i]. typ<>'I') and (Code_Tab [i]. Lex<>'; ') then

begin

Err_Synt ('ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠžΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅: «'+Code_Tab [i]. Lex+'» ', i);

Exit;

end;

if Code_Tab [i]. Lex='; ' then

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ имя ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ послС program', i);

Exit;

end;

Lex_Prog_Name: =true;

i: =i+1;

end;

function TForm1. Lex_Descr_List: boolean; // 3. список описаний

begin

Lex_descr_list: =false;

Found: =false;

while Code_Tab [i]. typ='I' do

begin

Found: =true;

if Lex_descr=false then Exit;

if Code_Tab [i]. Lex='; ' then i: =i+1 else

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ‚ΠΎΡ‡ΠΊΠ° с Π·Π°ΠΏΡΡ‚ΠΎΠΉ послС описания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ', i-1);

Exit;

end;

end;;

if Found=false then

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ Π² ΠΎΠΏΠΈΡΠ°Π½ΠΈΠΈ ', i);

Exit;

end;

Lex_descr_list: =true;

end;

function TForm1. Lex_descr: boolean; // 4. описаниС

begin

Lex_descr: =false;

if Lex_name_list=true then

begin

if Code_Tab [i]. Lex=': ' then i: =i+1 else

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π΄ Ρ‚ΠΈΠΏΠΎΠΌ '+Code_Tab [i]. Lex, i);

Exit;

end;

if Lex_type=true then Lex_descr: =true else Exit;

end else Exit;

end;

function TForm1. Lex_name_list: boolean; // 6. список имСн

begin

Lex_name_list: =false;

if Code_Tab [i]. typ='I' then i: =i+1 else

begin

Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ', i);

Exit;

end;

while Code_Tab [i]. Lex=',' do

begin

i: =i+1;

if Code_Tab [i]. Typ='I' then i: =i+1 else

begin

Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ', i);

Exit;

end;

end;

Lex_name_list: =true;

end;

function TForm1. Lex_type: boolean; // 5. Ρ‚ΠΈΠΏ

begin

Lex_type: =false;

if (Code_Tab [i]. Lex='integer') then

begin

Lex_type: =true;

i: =i+1

end else

begin

Err_Synt ('ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏ: integer ', i-1);

Exit;

end;

end;

function TForm1. Lex_oper_list: boolean; // 7. список ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ²

begin

Lex_oper_list: =false;

found: =false;

while Lex_oper=true do

begin

Found: =true;

if (Code_Tab [i]. Lex='; ') then i: =i+1 else // Если слСд. лСксСма послС ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Π½ΠΈ «; «, Π½ΠΈ END, Π° Π»ΡŽΠ±Π°Ρ другая лСксСма.

if Code_Tab [i]. Lex<>'end' then

begin

Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΡ‡ΠΊΠ° с Π·Π°ΠΏΡΡ‚ΠΎΠΉ послС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° (послС лСксСмы '+Code_Tab [i-1]. Lex+') ', i-1);

Exit;

end;

end;

Lex_oper_list: =true;

if found=false then

begin

Err_Synt ('НС Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ begin ΠΈ end', i-1);

Lex_oper_list: =false;

end;

end;

function TForm1. Lex_oper: boolean;

begin

Lex_oper: =false;

if (Lex_assign) or (Lex_repeat_until) then Lex_oper: =true else

if (Code_Tab [i]. Lex='; ') and (Code_Tab [i-1]. Lex='; ') then Lex_oper: =true else // провСряСтся Π½Π° ΠΏΡƒΡΡ‚ΠΎΠΉ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€, Ρ‚. Π΅. Π½Π° «;; «.

if (Code_Tab [i]. Typ='T') and (Code_Tab [i]. Lex<>'end') and (Code_Tab [i]. Lex<>'begin') and (Code_Tab [i]. Lex<>'; ') then Err_Synt ('Π›ΠΈΡˆΠ½ΡΡ лСксСма Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅: '+Code_Tab [i]. Lex, i);

end;

function TForm1. Lex_assign: boolean; // 10. присваиваниС

begin

Lex_assign: =false;

if Code_Tab [i]. typ='I' then

begin

if Code_Tab [i+1]. Lex=': =' then

begin

i: =i+2;

if Lex_Exp=true then Lex_assign: =true else Memo2. Lines [1]: =Memo2. Lines +' Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присваивания'

end else Err_Synt ('Ошибка Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π΅ присваивания', i)

end;

end;

function TForm1. Lex_Exp: boolean; // 11. Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

begin

Lex_Exp: =false;

if Lex_simple_Exp=true then

begin

if ((Code_Tab [i]. Lex='=') or (Code_Tab [i]. Lex='>') or (Code_Tab [i]. Lex='<')

or (Code_Tab [i]. Lex='<>') or (Code_Tab [i]. Lex='<=') or (Code_Tab [i]. Lex='>=')) then

begin

i: =i+1;

if Lex_simple_Exp=true then

begin

Lex_Exp: =true;

Exit;

end;

end;

end else Exit;

Lex_Exp: =true; // Ссли простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· Π·Π½Π°ΠΊΠ°

end;

function TForm1. Lex_simple_Exp: boolean; // 12. простоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅

begin

Found: =false;

Lex_simple_Exp: =false;

if Lex_term=true then

begin

Found: =true;

while ((Code_Tab [i]. Lex='+') or (Code_Tab [i]. Lex='-')) and (Found=true) do

begin

i: =i+1;

if Lex_term=false then

begin

Found: =False;

Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ константа, ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ ΠΈΠ»ΠΈ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ', i-1);

Exit;

end;

end;

if (Code_Tab [i]. Lex=') ') and (Scobka=false) then Err_Synt ('ΠžΠΆΠΈΠ΄Π°Π΅Ρ‚ΡΡ ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‰Π°ΡΡΡ скобка Π² ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»Π΅', i)

end;

if Found=true then Lex_simple_Exp: =true;

end;

function TForm1. Lex_Term: boolean; // 13. Ρ‚Π΅Ρ€ΠΌ

begin

Found: =false;

Lex_Term: =false;

if Lex_mnozh=true then

begin

Found: =true;

while ((Code_Tab [i]. Lex='*') or (Code_Tab [i]. Lex='/')) and (Found=true) do

begin

i: =i+1;

if Lex_mnozh=false then Found: =False;

end;

end;

if Found=true then Lex_Term: =true;

end;

function TForm1. Lex_mnozh: boolean; // 14. ΠΌΠ½ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒ

begin

Lex_mnozh: =false;

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