ΠŸΠΎΠΌΠΎΡ‰ΡŒ Π² ΡƒΡ‡Ρ‘Π±Π΅, ΠΎΡ‡Π΅Π½ΡŒ быстро...
Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ вмСстС Π΄ΠΎ ΠΏΠΎΠ±Π΅Π΄Ρ‹

ΠžΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ/Π΄Π²ΡƒΡ…ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ транслятор с языка матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° язык Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π°

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

На Ρ€ΠΈΡ. 2.1 прСдставлСна общая схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ компилятора. Из Π½Π΅Π΅ Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ процСсс компиляции состоит ΠΈΠ· Π΄Π²ΡƒΡ… основных этапов — Π°Π½Π°Π»ΠΈΠ·Π° ΠΈ ΡΠΈΠ½Ρ‚Π΅Π·Π°. На ΡΡ‚Π°ΠΏΠ΅ Π°Π½Π°Π»ΠΈΠ·Π° выполняСтся распознаваниС тСкста исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, созданиС ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ† ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ². Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹ слуТит Π½Π΅ΠΊΠΎΠ΅ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ прСдставлСниС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, понятноС компилятору. На ΡΡ‚Π°ΠΏΠ΅ синтСза Π½Π° ΠΎΡΠ½ΠΎΠ²Π°Π½ΠΈΠΈ… Π§ΠΈΡ‚Π°Ρ‚ΡŒ Π΅Ρ‰Ρ‘ >

ΠžΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ/Π΄Π²ΡƒΡ…ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ транслятор с языка матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° язык Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π° (Ρ€Π΅Ρ„Π΅Ρ€Π°Ρ‚, курсовая, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½Π°Ρ)

ΠšΠ°Ρ„Π΅Π΄Ρ€Π° ЭВА

ΠžΡ‚Ρ‡Π΅Ρ‚ ΠΏΠΎ курсовой Ρ€Π°Π±ΠΎΡ‚Π΅

ΠΏΠΎ Π΄ΠΈΡΡ†ΠΈΠΏΠ»ΠΈΠ½Π΅

«Π‘истСмноС ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡Π΅Π½ΠΈΠ΅»

Π½Π° Ρ‚Π΅ΠΌΡƒ

«ΠžΠ΄Π½ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ/Π΄Π²ΡƒΡ…ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½Ρ‹ΠΉ транслятор с ΡΠ·Ρ‹ΠΊΠ° матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ·Ρ‹ΠΊ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π°.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π°"

Москва 2009

Аннотация

ЦСль Π΄Π°Π½Π½ΠΎΠΉ курсовой Ρ€Π°Π±ΠΎΡ‚Ρ‹:

— ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΎΠ² построСния трансляторов

— Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C++ класса, Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΡŽΡ‰Π΅Π³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ дСйствия Π½Π°Π΄ матСматичСскими выраТСниями:

— Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·

— ΡΠΈΠ½Ρ‚аксичСский Π°Π½Π°Π»ΠΈΠ·

— Π²Ρ‹Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ значСния

— Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ транслятора с ΡΠ·Ρ‹ΠΊΠ° матСматичСских Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π° ΡΠ·Ρ‹ΠΊ Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π°

— Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π° языка Π΄Π΅Ρ€Π΅Π²ΡŒΠ΅Π² Π²Ρ‹Π²ΠΎΠ΄Π°

ВСорСтичСскоС Π²Π²Π΅Π΄Π΅Π½ΠΈΠ΅

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

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π€ΠΎΡ€ΠΌΠ° Бэкуса-Наура

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° — это описаниС способа построСния ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ языка. Π˜Π½Ρ‹ΠΌΠΈ словами, Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° — это матСматичСская систСма, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ язык. ЀактичСски, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΠ² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ языка, ΠΌΡ‹ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° пороТдСния Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ символов, ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… этому языку. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° — это Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ языка.

ΠŸΡ€Π°Π²ΠΈΠ»ΠΎ (ΠΈΠ»ΠΈ продукция) — это упорядочСнная ΠΏΠ°Ρ€Π° Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ символов (?, ?). Π’ ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… Π²Π°ΠΆΠ΅Π½ порядок Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ, поэтому ΠΈΡ… Ρ‡Π°Ρ‰Π΅ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π² Π²ΠΈΠ΄Π΅? >? (ΠΈΠ»ΠΈ ?:= ?). Вакая запись читаСтся ΠΊΠ°ΠΊ «? ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ?» ΠΈΠ»ΠΈ «? ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π΅ΡΡ‚ΡŒ ?».

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

Π―Π·Ρ‹ΠΊ, Π·Π°Π΄Π°Π½Π½Ρ‹ΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ G, обозначаСтся ΠΊΠ°ΠΊ L (G).

Π”Π²Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G ΠΈ G' Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ эквивалСнтными, Ссли ΠΎΠ½ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ язык: L (G) = L (G'). Π”Π²Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G ΠΈ G' Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΠΎΡ‡Ρ‚ΠΈ эквивалСнтными, Ссли Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠΈ языки Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Π½Π΅ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π½Π° ΠΏΡƒΡΡ‚ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ символов:

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° G опрСдСляСтся ΠΊΠ°ΠΊ Ρ‡Π΅Ρ‚Π²Π΅Ρ€ΠΊΠ° G (VT, VN, P, S), Π³Π΄Π΅:

VT — мноТСство Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈΠ»ΠΈ Π°Π»Ρ„Π°Π²ΠΈΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов;

VN — мноТСство Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов ΠΈΠ»ΠΈ Π°Π»Ρ„Π°Π²ΠΈΡ‚ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов;

Π  — мноТСство ΠΏΡ€Π°Π²ΠΈΠ» (ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΉ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π²ΠΈΠ΄Π°, Π³Π΄Π΅ ,

S — Ρ†Π΅Π»Π΅Π²ΠΎΠΉ (Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ) символ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ .

Алфавиты Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π½Π΅ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‚ся:. Π¦Π΅Π»Π΅Π²ΠΎΠΉ символ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ — это всСгда Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ. ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π°Π»Ρ„Π°Π²ΠΈΡ‚ΠΎΠΌ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G.

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов VT содСрТит символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ входят Π² Π°Π»Ρ„Π°Π²ΠΈΡ‚ языка, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΠΎΠ³ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, символы ΠΈΠ· ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π° VT Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°Ρ… ΠΏΡ€Π°Π²Ρ‹Ρ… частСй ΠΏΡ€Π°Π²ΠΈΠ». ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов VN содСрТит символы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ слова, понятия, конструкции языка. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ символ этого мноТСства ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒΡΡ Π² Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ°Ρ… ΠΊΠ°ΠΊ Π»Π΅Π²ΠΎΠΉ, Ρ‚Π°ΠΊ ΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ частСй ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π½ΠΎ ΠΎΠ½ ΠΎΠ±ΡΠ·Π°Π½ хотя Π±Ρ‹ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π· Π±Ρ‹Ρ‚ΡŒ Π² Π»Π΅Π²ΠΎΠΉ части хотя Π±Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°.

Π’ΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡ‚Π²Π΅ ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСсколько ΠΏΡ€Π°Π²ΠΈΠ», ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π»Π΅Π²Ρ‹Π΅ части, Π²ΠΈΠ΄Π°:. Π’ΠΎΠ³Π΄Π° эти ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΡŽΡ‚ вмСстС ΠΈ Π·Π°ΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π² Π²ΠΈΠ΄Π΅:. Одной строкС Π² Ρ‚Π°ΠΊΠΎΠΉ записи соотвСтствуСт сразу n ΠΏΡ€Π°Π²ΠΈΠ».

Π’Π°ΠΊΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ записи ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Ρ„ΠΎΡ€ΠΌΠΎΠΉ Бэкуса-Наура. Π€ΠΎΡ€ΠΌΠ° Бэкуса-Наура прСдусматриваСт, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ‚Π°ΠΊΠΆΠ΅, Ρ‡Ρ‚ΠΎ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы бСрутся Π² ΡƒΠ³Π»ΠΎΠ²Ρ‹Π΅ скобки: < >.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π΅ΠΉ язык Ρ†Π΅Π»Ρ‹Ρ… дСсятичных чисСл со Π·Π½Π°ΠΊΠΎΠΌ:

Π‘ ({0,1,2. 3,4.5. 6,7.8.9.-,+}, {<�число>,<�чс>.<οΏ½Ρ†ΠΈΡ„Ρ€Π°>}, Π ,<�число>)

P:

<<�число> -> <�чс> | +<�чс> | -<�чс>

<<�чс> -> <οΏ½Ρ†ΠΈΡ„Ρ€Π°> | <�чс><οΏ½Ρ†ΠΈΡ„Ρ€Π°>

<<οΏ½Ρ†ΠΈΡ„Ρ€Π°> ->0|1|2|3|4|5|6|7|8|9

Рассмотрим ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ элСмСнты Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G:

Β· мноТСство Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов VT содСрТит Π΄Π²Π΅Π½Π°Π΄Ρ†Π°Ρ‚ΡŒ элСмСнтов: Π΄Π΅ΡΡΡ‚ΡŒ дСсятичных Ρ†ΠΈΡ„Ρ€ ΠΈ Π΄Π²Π° Π·Π½Π°ΠΊΠ°;

Β· мноТСство Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов VN содСрТит Ρ‚Ρ€ΠΈ элСмСнта: символы <�число>, <�чс> ΠΈ <οΏ½Ρ†ΠΈΡ„Ρ€Π°>;

Β· мноТСство ΠΏΡ€Π°Π²ΠΈΠ» содСрТит 15 ΠΏΡ€Π°Π²ΠΈΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ записаны Π² Ρ‚Ρ€ΠΈ строки (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ имССтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚Ρ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€Π°Π²Ρ‹Ρ… части ΠΏΡ€Π°Π²ΠΈΠ»);

Β· Ρ†Π΅Π»Π΅Π²Ρ‹ΠΌ символом Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ являСтся символ <�число>.

Названия Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов Π½Π΅ ΠΎΠ±ΡΠ·Π°Π½Ρ‹ Π±Ρ‹Ρ‚ΡŒ осмыслСнными. Π­Ρ‚ΠΎ сдСлано для удобства понимания ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. НапримСр, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ Pascal ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠΌΠ΅Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ², ΠΈ ΠΏΡ€ΠΈ этом Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ся смысл ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Для Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов это Π½Π΅Π²Π΅Ρ€Π½ΠΎ. Набор Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Ρ… символов всСгда строго соотвСтствуСт Π°Π»Ρ„Π°Π²ΠΈΡ‚Ρƒ языка, опрСдСляСмого Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ.

ΠŸΡ€ΠΈΠ½Ρ†ΠΈΠΏ рСкурсии Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

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

Π’ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½Π½ΠΎΠΉ Π²Ρ‹ΡˆΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ G Π½Π΅ΠΏΠΎΡΡ€Π΅Π΄ΡΡ‚вСнная рСкурсия присутствуСт Π² ΠΏΡ€Π°Π²ΠΈΠ»Π΅: <�чс> <�чс><οΏ½Ρ†ΠΈΡ„Ρ€Π°>.

Π§Ρ‚ΠΎΠ±Ρ‹ рСкурсия Π½Π΅ Π±Ρ‹Π»Π° бСсконСчной, для ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π² Π½Π΅ΠΉ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Π΅Π³ΠΎ, минуя Π΅Π³ΠΎ самого, ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ бСсконСчного рСкурсивного опрСдСлСния (Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС этот символ Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Π±Ρ‹Π» Π±Ρ‹ просто Π½Π΅ Π½ΡƒΠΆΠ΅Π½). Π’Π°ΠΊΠΈΠΌΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ <�чс><οΏ½Ρ†ΠΈΡ„Ρ€Π°> - Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ G.

Π’ Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… языков Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΡ‡Π΅Π³ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎ Ρ€Π΅ΠΊΡƒΡ€ΡΠΈΠΈ нСльзя. Но Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»Π½Π΅Π΅ ΠΏΠΎΠ½ΡΡ‚ΡŒ смысл рСкурсии, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ±Π΅Π³Π½ΡƒΡ‚ΡŒ ΠΊ ΡΠ΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠ΅ языка — Π² Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½Π½ΠΎΠΌ Π²Ρ‹ΡˆΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ это язык Ρ†Π΅Π»Ρ‹Ρ… дСсятичных чисСл со Π·Π½Π°ΠΊΠΎΠΌ. Рассмотрим Π΅Π³ΠΎ смысл.

Если ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΆΠ΅ являСтся числом, Ρ‚ΠΎ Π½Π°Ρ‡Π°Ρ‚ΡŒ ΠΌΠΎΠΆΠ½ΠΎ с Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ любая Ρ†ΠΈΡ„Ρ€Π° сама ΠΏΠΎ ΡΠ΅Π±Π΅ Π΅ΡΡ‚ΡŒ число. Π”Π°Π»Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π»ΡŽΠ±Ρ‹Π΅ Π΄Π²Π΅ Ρ†ΠΈΡ„Ρ€Ρ‹ — это Ρ‚ΠΎΠΆΠ΅ число, Π·Π°Ρ‚Π΅ΠΌ — Ρ‚Ρ€ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ Ρ‚. Π΄. Если ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ числа Ρ‚Π°ΠΊΠΈΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ, Ρ‚ΠΎ ΠΎΠ½ΠΎ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ (Π² ΠΌΠ°Ρ‚Π΅ΠΌΠ°Ρ‚ΠΈΠΊΠ΅ Ρ€Π°Π·Ρ€ΡΠ΄Π½ΠΎΡΡ‚ΡŒ числа Π½ΠΈΡ‡Π΅ΠΌ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π°). Однако ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, пороТдая Π½ΠΎΠ²ΠΎΠ΅ число, ΠΌΡ‹ ΠΏΡ€ΠΎΡΡ‚ΠΎ дописываСм Ρ†ΠΈΡ„Ρ€Ρƒ справа (ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ»ΠΈ ΠΏΠΈΡΠ°Ρ‚ΡŒ слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ) ΠΊ ΡƒΠΆΠ΅ написанному ряду Ρ†ΠΈΡ„Ρ€. А ΡΡ‚ΠΎΡ‚ ряд Ρ†ΠΈΡ„Ρ€, начиная ΠΎΡ‚ ΠΎΠ΄Π½ΠΎΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹, Ρ‚ΠΎΠΆΠ΅ Π² ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ являСтся числом. Π’ΠΎΠ³Π΄Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для понятия «Ρ‡ΠΈΡΠ»ΠΎ» ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ: «Ρ‡ΠΈΡΠ»ΠΎ — это любая Ρ†ΠΈΡ„Ρ€Π° Π»ΠΈΠ±ΠΎ Π΄Ρ€ΡƒΠ³ΠΎΠ΅ число, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ справа дописана любая Ρ†ΠΈΡ„Ρ€Π°». ИмСнно это ΠΈ ΡΠΎΡΡ‚авляСт основу ΠΏΡ€Π°Π²ΠΈΠ» Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ΅Π½ΠΎ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ…

<�чс> <οΏ½Ρ†ΠΈΡ„Ρ€Π°> | <�чс><οΏ½Ρ†ΠΈΡ„Ρ€Π°>. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π² ΡΡ‚ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ Ρ‡ΠΈΡΠ»Ρƒ Π·Π½Π°ΠΊ ΠΈ Π΄Π°ΡŽΡ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ½ΡΡ‚ΠΈΡŽ «Ρ†ΠΈΡ„Ρ€Π°».

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

Π—Π°Π΄Π°Ρ‡Π° Ρ€Π°Π·Π±ΠΎΡ€Π°

Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка программирования Π²Π°ΠΆΠ½ΠΎ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΡƒΠΌΠ΅Ρ‚ΡŒ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΡΡ‚ΠΎΠΌ языкС, Π½ΠΎ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠΌΠ΅ΡŽΡ‰Π΅Π³ΠΎΡΡ тСкста ΠΊ Π΄Π°Π½Π½ΠΎΠΌΡƒ языку. ИмСнно эту Π·Π°Π΄Π°Ρ‡Ρƒ Ρ€Π΅ΡˆΠ°ΡŽΡ‚ компиляторы Π² Ρ‡ΠΈΡΠ»Π΅ ΠΏΡ€ΠΎΡ‡ΠΈΡ… Π·Π°Π΄Π°Ρ‡ (компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, Π½ΠΎ ΠΈ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ Π΅ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ). Π’ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ компилятор выступаСт ΠΊΠ°ΠΊ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚Π΅Π»ΡŒ, Π° Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, создавший ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ языкС программирования, выступаСт Π² Ρ€ΠΎΠ»ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ этого языка.

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

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

Π’ΠΈΠ΄Ρ‹ рСкурсий ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π°

ΠŸΡ€Π°Π²ΠΈΠ»Π°, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠ΅ Π²ΠΈΠ΄

1) T-> T * A

2) T-> A * T

ΠΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ лСворСкурсивными ΠΈ ΠΏΡ€Π°Π²ΠΎΡ€Π΅ΠΊΡƒΡ€ΡΠΈΠ²Π½Ρ‹ΠΌΠΈ соотвСтствСнно.

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

T-> A M

M-> * A | M

ΠŸΡ€ΠΈ восходящСм Ρ€Π°Π·Π±ΠΎΡ€Π΅ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… нСдопустима правая рСкурсия. Аналогичным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° с ΠΏΡ€Π°Π²ΠΎΠΉ рСкурсиСй Π² ΠΏΡ€Π°Π²ΠΈΠ»Π° с Π»Π΅Π²ΠΎΠΉ рСкурсиСй.

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ языков ΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ

Π§Π΅ΠΌ слоТнСС язык программирования, Ρ‚Π΅ΠΌ Π²Ρ‹ΡˆΠ΅ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹ компилятора Π½Π° Π°Π½Π°Π»ΠΈΠ· Ρ†Π΅ΠΏΠΎΡ‡Π΅ΠΊ исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанной Π½Π° ΡΡ‚ΠΎΠΌ языкС, Π° ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, слоТнСС сам компилятор ΠΈ Π΅Π³ΠΎ структура. Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² языков Π² ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ компилятор, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±Ρ‹ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π» исходныС тСксты Π½Π° ΡΡ‚ΠΈΡ… языках Π·Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΠΎΠ΅ врСмя Π½Π° ΠΎΡΠ½ΠΎΠ²Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… рСсурсов (ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому Π΄ΠΎ ΡΠΈΡ… ΠΏΠΎΡ€ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π΅ΡΡ‚СствСнных языках, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° Ρ€ΡƒΡΡΠΊΠΎΠΌ ΠΈΠ»ΠΈ английском).

ΠšΠ»Π°ΡΡΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΏΠΎ Π₯омскому

Богласно классификации, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ амСриканским лингвистом Ноамом Π₯омским, Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΊΠ»Π°ΡΡΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΏΠΎ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅ ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ». Если всС Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΡƒΠ΄ΠΎΠ²Π»Π΅Ρ‚Π²ΠΎΡ€ΡΡŽΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠΉ структурС, Ρ‚ΠΎ Ρ‚Π°ΠΊΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ относят ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ Ρ‚ΠΈΠΏΡƒ.

Π₯омский Π²Ρ‹Π΄Π΅Π»ΠΈΠ» Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Ρ‚ΠΈΠΏΠ° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ.

Π’ΠΈΠΏ 0: Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ с Ρ„Ρ€Π°Π·ΠΎΠ²ΠΎΠΉ структурой

На ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρƒ ΠΈΡ… ΠΏΡ€Π°Π²ΠΈΠ» Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ся Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ: для Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π²ΠΈΠ΄Π° G (VT, VN, P, S), ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈΠΌΠ΅ΡŽΡ‚ Π²ΠΈΠ΄:, Π³Π΄Π΅ .

Π­Ρ‚ΠΎ самый ΠΎΠ±Ρ‰ΠΈΠΉ Ρ‚ΠΈΠΏ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ. Π’ Π½Π΅Π³ΠΎ ΠΏΠΎΠ΄ΠΏΠ°Π΄Π°ΡŽΡ‚ всС Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π½ΠΎ Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· Π½ΠΈΡ…, ΠΊ ΠΎΠ±Ρ‰Π΅ΠΉ радости, ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ отнСсСна ΠΈ ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ классификационным Ρ‚ΠΈΠΏΠ°ΠΌ. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ относятся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚ΠΈΠΏΡƒ 0 ΠΈ Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСны ΠΊ Π΄Ρ€ΡƒΠ³ΠΈΠΌ Ρ‚ΠΈΠΏΠ°ΠΌ, ΡΠ²Π»ΡΡŽΡ‚ΡΡ самыми слоТными ΠΏΠΎ ΡΡ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π΅.

ΠŸΡ€Π°ΠΊΡ‚ΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ примСнСния Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, относящиСся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ Ρ‚ΠΈΠΏΡƒ 0, Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚.

Π’ΠΈΠΏ 1: контСкстно-зависимыС (ΠšΠ—) ΠΈ Π½Π΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

Π’ ΡΡ‚ΠΎΡ‚ Ρ‚ΠΈΠΏ входят Π΄Π²Π° основных класса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ:

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-зависимыС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΈΠ΄Π°:

Π³Π΄Π΅

ΠΠ΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΈΠ΄Π°:

Π³Π΄Π΅

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° ΠΏΡ€Π°Π²ΠΈΠ» ΠšΠ—-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ Ρ‚Π°ΠΊΠΎΠ²Π°, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ построСнии ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ ΠΈΠΌΠΈ языка ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ символ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½ Π½Π° Ρ‚Ρƒ ΠΈΠ»ΠΈ ΠΈΠ½ΡƒΡŽ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ символов Π² Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΠΈ ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ контСкста, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ Π²ΡΡ‚рСчаСтся. ИмСнно поэтому эти Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ «ΠΊΠΎΠ½Ρ‚Скстно-зависимыми». Π¦Π΅ΠΏΠΎΡ‡ΠΊΠΈ ΠΈ Π² ΠΏΡ€Π°Π²ΠΈΠ»Π°Ρ… Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ контСкст (- Π»Π΅Π²Ρ‹ΠΉ контСкст, Π° — ΠΏΡ€Π°Π²Ρ‹ΠΉ контСкст), Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС любая ΠΈΠ· Π½ΠΈΡ… (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ ΠΎΠ±Π΅) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пустой. ΠΠ΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΈΠΌΠ΅ΡŽΡ‚ Ρ‚Π°ΠΊΡƒΡŽ структуру ΠΏΡ€Π°Π²ΠΈΠ», Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ построСнии ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ языка, Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ, любая Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° символов ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΌΠ΅Π½Π΅Π½Π° Π½Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΡƒ символов Π½Π΅ ΠΌΠ΅Π½ΡŒΡˆΠ΅ΠΉ Π΄Π»ΠΈΠ½Ρ‹. ΠžΡ‚ΡΡŽΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ «Π½Π΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅».

Π”ΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° класса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ эквивалСнтны.

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

Π’ΠΈΠΏ 2: контСкстно-свободныС (КБ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

ΠšΠΎΠ½Ρ‚Π΅ΠΊΡΡ‚Π½ΠΎ-свободныС (КБ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S), ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΈΠ΄Π°, Π³Π΄Π΅. Π’Π°ΠΊΠΈΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ½ΠΎΠ³Π΄Π° Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ контСкстно-свободными (НКБ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°ΠΌΠΈ (Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π² ΠΏΡ€Π°Π²ΠΎΠΉ части ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρƒ Π½ΠΈΡ… Π΄ΠΎΠ»ΠΆΠ΅Π½ всСгда ΡΡ‚ΠΎΡΡ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ ΠΎΠ΄ΠΈΠ½ символ). БущСствуСт Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΡ‡Ρ‚ΠΈ эквивалСнтный ΠΈΠΌ ΠΊΠ»Π°ΡΡ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ — ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ контСкстно-свободныС (УКБ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S),, ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΈΠ΄:, Π³Π΄Π΅.

Π Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ этими двумя классами Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ лишь Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² Π£ΠšΠ‘-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°Ρ… Π² ΠΏΡ€Π°Π²ΠΎΠΉ части ΠΏΡ€Π°Π²ΠΈΠ» ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ пустая Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° (X), Π° Π² ΠΠšΠ‘-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°Ρ… — Π½Π΅Ρ‚. Π”ΠΎΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ эти Π΄Π²Π° класса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ эквивалСнтны.

КБ-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΡˆΠΈΡ€ΠΎΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΠΏΡ€ΠΈ описании синтаксичСских конструкций языков программирования. Бинтаксис Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° извСстных языков программирования основан ΠΈΠΌΠ΅Π½Π½ΠΎ Π½Π° ΠšΠ‘-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°Ρ….

Π’Π½ΡƒΡ‚Ρ€ΠΈ Ρ‚ΠΈΠΏΠ° КБ-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ ΠΊΡ€ΠΎΠΌΠ΅ классов НКБ ΠΈ Π£ΠšΠ‘ Π²Ρ‹Π΄Π΅Π»ΡΡŽΡ‚ Π΅Ρ‰Π΅ Ρ†Π΅Π»ΠΎΠ΅ мноТСство Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… классов Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ, ΠΈ Π²ΡΠ΅ ΠΎΠ½ΠΈ относятся ΠΊ Ρ‚ΠΈΠΏΡƒ 2.

Π’ΠΈΠΏ 3: рСгулярныС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ

К Ρ‚ΠΈΠΏΡƒ рСгулярных относятся Π΄Π²Π° эквивалСнтных класса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ: Π»Π΅Π²ΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ ΠΈ ΠΏΡ€Π°Π²ΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅.

Π›Π΅Π²ΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S), ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²: ΠΈΠ»ΠΈ, Π³Π΄Π΅ .

Π’ ΡΠ²ΠΎΡŽ ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ, ΠΏΡ€Π°Π²ΠΎΠ»ΠΈΠ½Π΅ΠΉΠ½Ρ‹Π΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ G (VT, VN, P, S), ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Ρ‚ΠΎΠΆΠ΅ Π΄Π²ΡƒΡ… Π²ΠΈΠ΄ΠΎΠ²: ΠΈΠ»ΠΈ, Π³Π΄Π΅.

Π­Ρ‚ΠΈ Π΄Π²Π° класса Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ эквивалСнтны ΠΈ ΠΎΡ‚носятся ΠΊ Ρ‚ΠΈΠΏΡƒ рСгулярных Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ.

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

Π‘ΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ‚ΠΈΠΏΠ°ΠΌΠΈ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ

Π’ΠΈΠΏΡ‹ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊ соотносятся ΠΌΠ΅ΠΆΠ΄Ρƒ собой особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ. Из ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΎΠ² 2 ΠΈ 3 Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ любая рСгулярная Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° являСтся КБ-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΎΠΉ, Π½ΠΎ Π½Π΅ Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚. Π’Π°ΠΊΠΆΠ΅ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ любая Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСна ΠΊ Ρ‚ΠΈΠΏΡƒ 0, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΎΠ½ Π½Π΅ Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠΉ Π½Π° ΠΏΡ€Π°Π²ΠΈΠ»Π°. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠ΅ КБ-Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ (Ρ‚ΠΈΠΏ 2), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ся Π½ΠΈ ΠΊΠΎΠ½Ρ‚Скстно-зависимыми, Π½ΠΈ Π½Π΅ΡƒΠΊΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΌΠΈ (Ρ‚ΠΈΠΏ 1), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΈΠ΄Π°, нСдопустимыС Π² Ρ‚ΠΈΠΏΠ΅ 1.

Одна ΠΈ Ρ‚Π° ΠΆΠ΅ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° Π² ΠΎΠ±Ρ‰Π΅ΠΌ случаС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСна ΠΊ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΠΌ классификационным Ρ‚ΠΈΠΏΠ°ΠΌ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠ°ΠΊ ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, всС Π±Π΅Π· ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСны ΠΊ Ρ‚ΠΈΠΏΡƒ 0). Для классификации Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ всСгда Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ максимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΏ, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΎΠ½Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ отнСсСна. Π‘Π»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π° Π½ΠΎΠΌΠ΅Ρ€Ρƒ Ρ‚ΠΈΠΏΠ°, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ относится Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°.

Врансляторы

Π€ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ транслятора

Вранслятор — это ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ (Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ) языкС Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½ΡƒΡŽ Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΌ (Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌ) языкС.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния прСобразования ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка Π² ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚Π½Ρ‹Π΅ ΠΈΠΌ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΡ Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка транслятор выступаСт ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ транслятора Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π½ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Ρ‚ΠΎΠΌ случаС, Ссли тСкст исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ являСтся ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΌ — Π½Π΅ ΡΠΎΠ΄Π΅Ρ€ΠΆΠΈΡ‚ ошибок с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния синтаксиса ΠΈ ΡΠ΅ΠΌΠ°Π½Ρ‚ΠΈΠΊΠΈ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ языка. Если исходная ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π°Ρ (содСрТит хотя Π±Ρ‹ ΠΎΠ΄Π½Ρƒ ΠΎΡˆΠΈΠ±ΠΊΡƒ), Ρ‚ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ транслятора Π±ΡƒΠ΄Π΅Ρ‚ сообщСниС ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ΅.

Π­Ρ‚Π°ΠΏΡ‹ трансляции. ΠžΠ±Ρ‰Π°Ρ схСма Ρ€Π°Π±ΠΎΡ‚Ρ‹ транслятора

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

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

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π² Ρ†Π΅Π»ΠΎΠΌ, с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния Ρ‚Π΅ΠΎΡ€ΠΈΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… языков, выполняСт Π΄Π²Π΅ основныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ:

— Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Π½ΠΈΠ΅ языка исходной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

— Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π·Π°Π΄Π°Π½Π½ΠΎΠΌ языкС.

Π”Π°Π»Π΅Π΅ даСтся ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ основных Ρ„Π°Π· (частСй) компиляции ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅ описаниС ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ.

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

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

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

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

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

ΠŸΡ€ΠΎΡ…ΠΎΠ΄ транслятора — процСсс ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ чтСния компилятором Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΠ· ΠΏΠ°ΠΌΡΡ‚ΠΈ, ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Ρ‘ния Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ нСсколько ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΎΠ², Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Ρ‹ лСксичСского ΠΈ ΡΠΈΠ½Ρ‚аксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΏΡ€ΠΎΡ…ΠΎΠ΄Ρ‹ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΡ…ΠΎΠ΄.

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρ‹

Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ — ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π²ΠΎΡΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‰Π°Ρ ΠΈΡΡ…ΠΎΠ΄Π½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ (исходном) языкС ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰Π°Ρ Π΅Π΅.

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

Lex ΠΈ Yacc

ΠžΠ±Π·ΠΎΡ€ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°

БистСмы GNU/Linux ΠΏΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ с Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ для написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярны:

Β· Flex, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

Β· Bison, Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°

Β· Gperf, Ρ€Π°Π·Π²ΠΈΡ‚Ρ‹ΠΉ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Ρ…ΡΡˆ-Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π­Ρ‚ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ тСксты для языка C. Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒΡΡ, ΠΏΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ Π² Π²ΠΈΠ΄Π΅ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΊΠΎΠ΄Π°, Π° Π½Π΅ Π² Π²ΠΈΠ΄Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ. Π’ΠΎΠΌΡƒ Π΅ΡΡ‚ΡŒ нСсколько ΠΏΡ€ΠΈΡ‡ΠΈΠ½:

Β· Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ для этих Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΎΡ‡Π΅Π½ΡŒ слоТными ΠΈ ΠΈΡ… Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΠΎ Π²Ρ‹Ρ€Π°Π·ΠΈΡ‚ΡŒ Π² Π²ΠΈΠ΄Π΅, ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΌ для C-ΠΊΠΎΠ΄Π°.

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

Β· МногиС аспСкты функционирования этих систСм Π½Π°ΡΡ‚Ρ€Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ, ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΌ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ. Π­Ρ‚ΠΎΡ‚ ΠΊΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ впослСдствии ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠ΅ΡΡ Ρ‡Π°ΡΡ‚ΡŒΡŽ сгСнСрированной структуры, построСнной Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ ΠΊΠΎΠ΄Π°, Π±Π΅Π· нСобходимости ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°Ρ‚ΡŒ всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

КаТдоС ΠΈΠ· ΡΡ‚ΠΈΡ… ΠΈΠ½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Ρ… срСдств ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΎ для создания ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ. Bison ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для гСнСрирования синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ²; Flex — для гСнСрирования лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ². Π”Ρ€ΡƒΠ³ΠΈΠ΅ срСдства посвящСны, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ, Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… аспСктов программирования.

НапримСр, ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π² ΠΈΠΌΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½Ρ‹Π΅ языки программирования часто являСтся Ρ€ΡƒΡ‚ΠΈΠ½Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ. Для Π΅Π΅ ΠΎΠ±Π»Π΅Π³Ρ‡Π΅Π½ΠΈΡ ΠΈ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ Embedded SQL — систСма мСтапрограммирования, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ для простого комбинирования доступа ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ C.

Π₯отя сущСствуСт Π½Π΅ΠΌΠ°Π»ΠΎ доступных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ Π±Π°Π·Π°ΠΌ Π΄Π°Π½Π½Ρ‹Ρ… Π² C, использованиС Ρ‚Π°ΠΊΠΎΠ³ΠΎ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€Π° ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Embedded SQL Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ C ΠΈ Π΄ΠΎΡΡ‚ΡƒΠΏΠ° ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π»Π΅Π³ΠΊΠΈΠΌ ΠΏΡƒΡ‚Π΅ΠΌ объСдинСния SQL-сущностСй Π² C Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка. МногиС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Embedded SQL, ΠΎΠ΄Π½Π°ΠΊΠΎ, Π² ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠΌ ΡΠ²Π»ΡΡŽΡ‚ΡΡ простыми спСциализированными макропроцСссорами, Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΌΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ C-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, использованиС Embedded SQL Π΄Π΅Π»Π°Π΅Ρ‚ для программиста доступ ΠΊ Π±Π°Π·Π΅ Π΄Π°Π½Π½Ρ‹Ρ… Π±ΠΎΠ»Π΅Π΅ СстСствСнным, ΠΈΠ½Ρ‚ΡƒΠΈΡ‚ΠΈΠ²Π½Ρ‹ΠΌ ΠΈ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΎΡˆΠΈΠ±ΠΎΠΊ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΡ€ΡΠΌΡ‹ΠΌ использованиСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Embedded SQL Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΡΡ‚ΡŒ программирования Π±Π°Π· Π΄Π°Π½Π½Ρ‹Ρ… маскируСтся макроязыком

БовмСстноС использованиС Lex ΠΈ Yacc

Π”ΠΎ 1975 Π³ΠΎΠ΄Π° процСсс написания компиляторов Π·Π°Π½ΠΈΠΌΠ°Π» ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. Π—Π°Ρ‚Π΅ΠΌ Lesk[1975] ΠΈ Johnson[1975] ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π»ΠΈ Ρ‚Ρ€ΡƒΠ΄Ρ‹ ΠΏΠΎ lex ΠΈ yacc. Π­Ρ‚ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ сильно упростили написаниС компиляторов. Π”Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹ Ρƒ Aho[1986]

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ ΠΊΠΎΠ΄Π° ΠΏΠΎΠΌΠ΅Ρ‰Π°ΡŽΡ‚ΡΡ Π½Π° Π²Ρ…ΠΎΠ΄ Lex. Lex Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ C ΠΊΠΎΠ΄ для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ сканСра.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΡ‰Π΅Ρ‚ совпадСниС строк Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…, ΠΈ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ строки Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹.

Π’ΠΎΠΊΠ΅Π½Ρ‹ ΡΠ²Π»ΡΡŽΡ‚ΡΡ числовым прСдставлСниСм строк ΡƒΠΏΡ€ΠΎΡ‰Π°ΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ.

Когда лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅, ΠΎΠ½ΠΈ вносятся Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов. Π’Π°Π±Π»ΠΈΡ†Π° символов Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚Π°ΠΊΡƒΡŽ, ΠΊΠ°ΠΊ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ… (Ρ†Π΅Π»Ρ‹ΠΉ ΠΈΠ»ΠΈ вСщСствСнный) ΠΈ ΠΌΠ΅ΡΡ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ. ВсС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ссылки Π½Π° ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΡΡΡ‹Π»Π°ΡŽΡ‚ΡΡ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ индСкс Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов.

Код Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ ΠΏΠΎΠ΄Π°ΡŽΡ‚ΡΡ Π½Π° Π²Ρ…ΠΎΠ΄ yacc. Yacc Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ C ΠΊΠΎΠ΄ для синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ»ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Ρ‰ΠΈΠΊΠ°. БинтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ грамматичСскиС ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ Π΅ΠΌΡƒ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρ‹ ΠΈΠ· Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ. БинтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ устанавливаСт ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡ‡ΡΠΊΡƒΡŽ структуру Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². НапримСр, ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ precedence ΠΈ Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ивности (associativity) ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² ΡΠΈΠ½Ρ‚аксичСском Π΄Π΅Ρ€Π΅Π²Π΅. Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ шаг, гСнСрация ΠΊΠΎΠ΄Π°, осущСствляСтся с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠ±Ρ…ΠΎΠ΄Π° синтаксичСского Π΄Π΅Ρ€Π΅Π²Π°. НСкоторыС компиляторы ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ — ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° ΡΠ·Ρ‹ΠΊΠ°Ρ… ассСмблСра.

ΠšΠΎΠΌΠ°Π½Π΄Ρ‹ для создания компилятора, bas.exe, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π½ΠΈΠΆΠ΅:

yacc — d bas.y # create y.tab.h, y.tab.c

lex bas. l # create lex.yy.c

cc lex.yy.c y.tab.c — obas.exe # compile/link

Yacc Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ грамматичСскиС описания Π² bas.y ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (parser), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ yyparse, Π² Ρ„Π°ΠΉΠ»Π΅ y.tab.c. Π€Π°ΠΉΠ» bas.y содСрТит Π² ΡΠ΅Π±Π΅ объявлСния Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ². Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ — d Π²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ yacc Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ опрСдСлСния для Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ ΠΈΡ… Π² Ρ„Π°ΠΉΠ» y.tab.h. Lex Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹, описанныС Π² bas.l, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ» y.tab.h ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ yylex, Π² Ρ„Π°ΠΉΠ»Π΅ lex.yy.c. НаконСц, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (lexer) ΠΈ ΡΠΈΠ½Ρ‚аксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ (parser) ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΡŽΡ‚ся вмСстС, образуя исполняСмый Ρ„Π°ΠΉΠ» bas.exe. Из main, ΠΌΡ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌ yyparse, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ компилятор. Ѐункция yyparse автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ yylex, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ‚ΠΎΠΊΠ΅Π½.

Lex

Theory

ΠŸΠ΅Ρ€Π²Π°Ρ Ρ„Π°Π·Π° Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Π΅ — Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ исходного Ρ„Π°ΠΉΠ»Π° ΠΈ Π΅Π³ΠΎ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Ρ‚ΠΎΠΊΠ΅Π½Ρ‹. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ рСгулярныС выраТСния, ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°, ΠΈ ΡΡ‚ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π°ΠΉΡ‚ΠΈ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ строки Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ΠšΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ спСцифицированному Π² ΠΈΡΡ…ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°, сопоставляСтся ассоциированноС дСйствиС. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ дСйствиС Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ прСдставляСт ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΡƒΡŽ строку, Π² ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡƒΡŽ синтаксичСским Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Π‘Π½Π°Ρ‡Π°Π»Π° просто ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π΅ΠΌ ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ строку, Ссли возвращаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π°.

Π”Π°Π»Π΅Π΅ слСдуСт прСдставлСниС простого шаблона, ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈΡ‰Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹. Lex Ρ‡ΠΈΡ‚Π°Π΅Ρ‚ этот шаблон ΠΈ ΡΠΎΠ·Π΄Π°Π΅Ρ‚ C ΠΊΠΎΠ΄ для лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΡ‰Π΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹.

letter (letter|digit)*

Π­Ρ‚ΠΎΡ‚ шаблон ΠΈΡ‰Π΅Ρ‚ строку символов, которая начинаСтся с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ символа, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π·Π° Π½ΡƒΠ»Π΅ΠΌ ΠΈΠ»ΠΈ большС символов ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€. Π­Ρ‚ΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Π΅, Π° Ρ€Π΅Π³ΡƒΠ»ΡΡ€Π½Ρ‹Ρ… выраТСниях:

* ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π΅Π½ΠΈΠ΅, прСдставлСнноС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ «*» (repetition)

* Ρ‡Π΅Ρ€Π΅Π΄ΠΎΠ²Π°Π½ΠΈΠ΅, прСдставлСнноС ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ «|» (alternation)

* объСдинСниС (concatenation)

Π›ΡŽΠ±ΠΎΠ΅ рСгулярноС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСно Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΎΠΌ с ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΌ числом состояний (finite state automaton, FSA). ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ FSA, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅Π΅ состояния ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Ρ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ состояниями. БущСствуСт ΠΎΠ΄Π½ΠΎ Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ состояниС ΠΈ ΠΎΠ΄Π½ΠΎ, ΠΈΠ»ΠΈ большС, ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹Ρ… состояний ΠΈΠ»ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹Ρ… состояний.

На Ρ€ΠΈΡ. 3, состояниС 0 — являСтся Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ состояниСм, Π° ΡΠΎΡΡ‚ояниС 2 — Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Ρ‹ΠΌ состояниСм. Когда происходит Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ символа, осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ состояния Π² Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Когда читаСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ символ, осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΡΠΎΡΡ‚ояниС 1. Автомат остаСтся Π² ΡΠΎΡΡ‚оянии 1, ΠΏΠΎΠΊΠ° Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ Π±ΡƒΠΊΠ²Ρ‹ (letters) ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€Ρ‹ (digits). Когда осущСствляСтся Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈΠ½ΠΎΠ³ΠΎ символа, ΠΊΡ€ΠΎΠΌΠ΅ Π±ΡƒΠΊΠ²Ρ‹ ΠΈΠ»ΠΈ символа, осущСствляСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π² ΡΠΎΡΡ‚ояниС 2, Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½ΠΎΠ΅ состояниС. Π›ΡŽΠ±ΠΎΠΉ FSA ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСн с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. НапримСр, этот Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ с 3 мя ΡΠΎΡΡ‚ояниями программируСтся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

start: goto state0

state0: read c

if c = letter goto state1

goto state0

state1: read c

if c = letter goto state1

if c = digit goto state1

goto state2

state2: accept string

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

Π’Π΅ΠΏΠ΅Ρ€ΡŒ становится Π»Π΅Π³ΠΊΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ ограничСния Π² lex. НапримСр, lex Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использован.

Π’Π°Π±Π»ΠΈΡ†Π° 1. Π­Π»Π΅ΠΌΠ΅Π½Ρ‚Π°Ρ€Π½Ρ‹Π΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρ‹ (Pattern Matching Primitives)

ΠœΠ΅Ρ‚Π°ΡΠΈΠΌΠ²ΠΎΠ» (Metacharacter)

БовпадСния (Matches)

.

Π›ΡŽΠ±ΠΎΠΉ символ, ΠΊΡ€ΠΎΠΌΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки

n

Π‘ΠΈΠΌΠ²ΠΎΠ» ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки

*

0 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΏΠΈΠΉ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

1 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΏΠΈΠΉ ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

?

0 ΠΈΠ»ΠΈ 1 копия ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ

^

Начало строки

$

ΠšΠΎΠ½Π΅Ρ† строки

a|b

a ΠΈΠ»ΠΈ b

(ab)+

Одна ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΠΎΠΏΠΈΠΉ ab (Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²ΠΊΠ°, grouping)

«a+b»

Π»ΠΈΡ‚Π΅Ρ€Π°Π» «a+b» (C escapes still work)

[]

Класс символов

Π’Π°Π±Π»ΠΈΡ†Π° 2. ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ шаблонов Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Pattern Matching Examples)

Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ (Expression)

БовпадСния (Matches)

abc

abc

abc*

ab abc abcc abccc

abc+

abc abcc abccc

a (bc)+

abc abcbc abcbcbc

a (bc)?

a abc

[abc]

Одно из: a, b, c

[a-z]

Π›ΡŽΠ±ΠΎΠΉ символ, a-z

[a-z]

Одно из: a, -, z

[-az]

Одно из: -, a, z

[A-Za-z0-9]+

Один ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ символов Π°Π»Ρ„Π°Π²ΠΈΡ‚Π° ΠΈΠ»ΠΈ Ρ†ΠΈΡ„Ρ€

[tn]+

ΠŸΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹Π΅ символы

[^ab]

ВсС, ΠΊΡ€ΠΎΠΌΠ΅: a, b

[a^b]

Одно из: a, ^, b

[a|b]

Одно из: a, |, b

a|b

Одно из: a, b

РСгулярныС выраТСния Π² lex ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ΡΡ ΠΈΠ· ΠΌΠ΅Ρ‚асимволов (Π’Π°Π±Π»ΠΈΡ†Π° 1). ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ совпадСния шаблонов ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ 2. ΠŸΡ€ΠΈ использовании класса символов, ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Ρ‚Π΅Ρ€ΡΡŽΡ‚ своС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄Π²Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π° Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Ρ‹ Π² ΠΊΠ»Π°ΡΡΠ΅ символов: дСфис («-», hyphen) ΠΈ Ρ†ΠΈΡ€ΠΊΡƒΠΌΡ„лСкс («^», circumflex). ΠŸΡ€ΠΈ использовании ΠΌΠ΅ΠΆΠ΄Ρƒ двумя символами дСфиса, прСдставляСтся Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ символов. ЦиркумфлСкс, ΠΏΡ€ΠΈ использовании Π΅Π³ΠΎ ΠΊΠ°ΠΊ ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ символа, ΠΎΡ‚Ρ€ΠΈΡ†Π°Π΅Ρ‚ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Если Π΄Π²Π° шаблона ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‚ с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ строкой, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ шаблон, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π½Π°ΠΉΠ΄Π΅Π½Π° Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ длинная строка, Π² ΡΠ»ΡƒΡ‡Π°Π΅, Ссли Π΄Π»ΠΈΠ½Π° ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Π°, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ шаблон.

definitions

%%

rules

%%

subroutines

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ lex дСлятся Π½Π° 3 сСкции, с ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ%%, Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΌΠΈ сСкции. Π­Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ — это наимСньший Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» lex:

%%

Π’Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ символу Π·Π° Ρ€Π°Π·. ΠŸΠ΅Ρ€Π²Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ%% трСбуСтся всСгда, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ всСгда Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ сСкция ΠΏΡ€Π°Π²ΠΈΠ». Если Π½Π΅ ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Ρ‚ΠΎΠ³Π΄Π° дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ — совпадСниС всСго ΠΈ ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Π² Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ stdin ΠΈ stdout, соотвСтствСнно. Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ΄Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

%%

/* Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ всСго, ΠΊΡ€ΠΎΠΌΠ΅ символа Π½ΠΎΠ²ΠΎΠΉ строки */

ECHO;

/* Π‘ΠΎΠ²ΠΏΠ°Π΄Π΅Π½ΠΈΠ΅ символа ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки */

n ECHO;

%%

int yywrap (void) {

return 1;

}

int main (void) {

yylex ();

return 0;

}

Π”Π²Π° шаблона спСцифицированы Π² ΡΠ΅ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ». ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ шаблон Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€Π²ΠΎΠΌ столбцС, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ Π·Π° ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΌ символом. ΠžΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎΠ΅ дСйствиС ассоциируСтся с ΡˆΠ°Π±Π»ΠΎΠ½ΠΎΠΌ. ДСйствиС ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½Ρ‹ΠΌ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ Π½Π° ΡΠ·Ρ‹ΠΊΠ΅ C ΠΈΠ»ΠΈ мноТСствСнным, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ Π² ΡΠΊΠΎΠ±ΠΊΠΈ. ВсС, Π½Π΅ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰Π΅Π΅ΡΡ с ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ столбца, дословно копируСтся Π² Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ C Ρ„Π°ΠΉΠ». МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ это для спСцификации ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² Π² lex Ρ„Π°ΠΉΠ»Π΅. Π’ ΡΡ‚ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π΅ΡΡ‚ΡŒ 2 выраТСния:

"." ΠΈ «n» с Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ΠΌ ECHO, ассоциированным с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ шаблоном. НСсколько макросов ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² lex. ECHO — это макрос, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΈΡˆΠ΅Ρ‚ ΠΊΠΎΠ΄, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΉ с ΡˆΠ°Π±Π»ΠΎΠ½ΠΎΠΌ. Π­Ρ‚ΠΎ дСйствиС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π½Π΅ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰Π΅ΠΉ строки. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ ECHO опрСдСляСтся ΠΊΠ°ΠΊ

#define ECHO fwrite (yytext, yyleng, 1, yyout)

ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Π°Ρ yytext — ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ строку (ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉΡΡ NULL-символом), ΠΈ yyleng — Π΄Π»ΠΈΠ½Π° совпавшСй строки. Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ yyout являСтся Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ являСтся stdout. Ѐункция yywrap вызываСтся lex, ΠΊΠΎΠ³Π΄Π° Π²Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»ΠΈΡΡŒ. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1, Ссли Π·Π°ΠΊΠΎΠ½Ρ‡Π΅Π½ΠΎ, 0 Ссли трСбуСтся дальнСйшая ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°. КаТдая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π° C Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ main Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ. Π’ ΡΡ‚ΠΎΠΌ случаС просто вызываСтся yylex,

Основная Ρ‚ΠΎΡ‡ΠΊΠ° Π²Ρ…ΠΎΠ΄Π° для lex. НСкоторыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ lex Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ ΠΊΠΎΠΏΠΈΠΈ main ΠΈ yywrap Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, устраняя Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ явно ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ ΠΈΡ…. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, наимСньшая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° lex ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΠ΅Ρ‚.

Name

Function

int yylex (void)

ВызываСтся для запуска лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½

char *yytext

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ строку

yyleng

Π”Π»ΠΈΠ½Π° совпавшСй строки

yylval

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ассоциируСмоС с Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠΌ

int yywrap (void)

Wrapup — ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ 1 — Ссли Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π°, 0 — Ссли Π½Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΎ

FILE *yyout

Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»

FILE *yyin

Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ»

INITIAL

Π˜ΡΡ…ΠΎΠ΄Π½ΠΎΠ΅ условиС старта

BEGIN

УсловиС ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅Π΅ условиС старта

ECHO

Π—Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΡΠΎΠ²ΠΏΠ°Π²ΡˆΡƒΡŽ строку

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ присоСдиняСт слСва Π½ΠΎΠΌΠ΅Ρ€ Π»ΠΈΠ½ΠΈΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΈΠ½ΠΈΠΈ Π² Ρ„Π°ΠΉΠ»Π΅. НСкоторыС Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ lex ΠΏΡ€Π΅Π΄ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ вычислСниС yylineno. Π’Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» для lex — это yyin, ΠΈ ΡΠ²Π»ΡΠ΅Ρ‚ся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ stdin.

%{

int yylineno;

%}

%%

^(.*)n printf («%4dt % s«, ++yylineno, yytext);

%%

int main (int argc, char *argv[]) {

yyin = fopen (argv[1], «r»);

yylex ();

fclose(yyin);

}

Π‘Π΅ΠΊΡ†ΠΈΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ состоят ΠΈΠ· Π·Π°ΠΌΠ΅Π½, ΠΊΠΎΠ΄Π° ΠΈ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹Ρ… состояний. Код Π² ΡΠ΅ΠΊΡ†ΠΈΡΡ… опрСдСлСния просто копируСтся Π² Π½Π°Ρ‡Π°Π»ΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ C Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΈ этом ΠΊΠΎΠ΄ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ…%{" ΠΈ «%}». Π—Π°ΠΌΠ΅Π½Ρ‹ ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ совпадСния шаблонов. НапримСр, ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ†ΠΈΡ„Ρ€Ρ‹ ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹:

digit [0-9]

letter [A-Za-z]

%{

int count;

%}

%%

/* match identifier */

{letter} ({letter}|{digit})* count++;

%%

int main (void) {

yylex ();

printf («number of identifiers =%dn«, count);

return 0;

}

ΠŸΡ€ΠΎΠ±Π΅Π» Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ Ρ‚Π΅Ρ€ΠΌ ΠΈ Π°ΡΡΠΎΡ†ΠΈΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Бсылки Π½Π° ΠΏΠΎΠ΄ΡΡ‚Π°Π½ΠΎΠ²ΠΊΠΈ Π² ΡΠ΅ΠΊΡ†ΠΈΡΡ… ΠΏΡ€Π°Π²ΠΈΠ» ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½Ρ‹ скобками ({letter}), Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒ ΠΈΡ… Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ. Когда происходит совпадСниС Π² ΡΠ΅ΠΊΡ†ΠΈΠΈ ΠΏΡ€Π°Π²ΠΈΠ», ассоциируСмый C ΠΊΠΎΠ΄ выполняСтся. Π’ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, которая считаСт количСство символов, слов ΠΈ Π»ΠΈΠ½ΠΈΠΉ Π² Ρ„Π°ΠΉΠ»Π΅ (подобная ΠΊΠΎΠΌΠ°Π½Π΄Π΅ wc Π² Unix):

%{

int nchar, nword, nline;

%}

%%

n {nline++; nchar++;}

[^ tn]+ {nword++, nchar += yyleng;}

{nchar++;}

%%

int main (void) {

yylex ();

printf («%dt % dt % dn», nchar, nword, nline);

return 0;

}

РСализация lex Π² Unix

Π’ Ρ†Π΅Π»ΠΎΠΌ подсистСма LEX для систСм UNIX Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹:

/usr/ccs/bin/lex;

lex.yy.c;

/usr/ccs/lib/lex/ncform;

/usr/lib/libl.a;

/usr/lib/libl.so.

Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /usr/ccs/lib/lex имССтся Ρ„Π°ΠΉΠ»-Π·Π°Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ncform, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ LEX ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для построСния Π›Π. Π­Ρ‚ΠΎΡ‚ Ρ„Π°ΠΉΠ» являСтся ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°. Но Π² Π½Π΅ΠΌ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ дСйствия, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΡ€ΠΈ распознавании лСксСм, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ ΡΠ°ΠΌΠΈ лСксСмы, Π½Π΅ ΡΡ„ΠΎΡ€ΠΌΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π±ΠΎΡ‡ΠΈΠ΅ массивы ΠΈ Ρ‚. Π΄. Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ lex Ρ„Π°ΠΉΠ» ncform достраиваСтся. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌ Ρ„Π°ΠΉΠ» со ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ lex.yy.c. Если LEX-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² Ρ„Π°ΠΉΠ»Π΅ program. l, Ρ‚ΠΎ Π΄Π»Ρ получСния Π›Π с ΠΈΠΌΠ΅Π½Π΅ΠΌ program Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ Π½Π°Π±ΠΎΡ€ ΠΊΠΎΠΌΠ°Π½Π΄:

lex program. l

cc lex.yy.c — ll — o program

Если имя Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° для ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ lex Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» стандартного Π²Π²ΠΎΠ΄Π°. Π€Π»Π°Π³ — ll Ρ‚рСбуСтся для ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ /usr/ccs/lib/libl.a — Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ LEX. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС, ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΠ· Π½Π΅Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ главная функция main. Π’ ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС, Ссли имССтся Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π›Π Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ синтаксичСского Π°Π½Π°Π»ΠΈΠ·Π°), эту Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ΡƒΠΆΠ΅ ΠΏΡ€ΠΈ сборкС. Π’ΠΎΠ³Π΄Π°, Ссли main ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Π›Π ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ связСй Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» main ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ LEX.

ΠžΠ±Ρ‰ΠΈΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Π²Ρ‹Π·ΠΎΠ²Π° ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ lex:

lex [-ctvn — V — Q [y|n]] [file]

Π€Π»Π°Π³ΠΈ:

— c — Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„Π°Π·Ρƒ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ Π‘ΠΈ-Ρ„Π°ΠΉΠ»Π° (устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ);

— t — ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π²Ρ‹Π²ΠΎΠ΄Π°, Π° Π½Π΅ Π² Ρ„Π°ΠΉΠ» lex.yy.c;

— v — вывСсти Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… Ρ‚Π°Π±Π»ΠΈΡ†;

— n — Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ† (устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ);

— V — вывСсти ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π΅Ρ€ΡΠΈΠΈ LEX Π² ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ошибок;

— Q — вывСсти (Qy) Π»ΠΈΠ±ΠΎ Π½Π΅ Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ (Qn, устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ) ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π΅Ρ€ΡΠΈΠΈ Π² Ρ„Π°ΠΉΠ» lex.yy.c.

YACC — Yet Another Compiler Compiler

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ для yacc ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π€ΠΎΡ€ΠΌΡ‹ Бэкуса-Наура (Backus Naur Form, BNF)

Π­Ρ‚Ρƒ Ρ‚Π΅Ρ…Π½ΠΈΠΊΡƒ Π±Ρ‹Π»Π° Π²Π²Π΅Π»ΠΈ John Backus ΠΈ Peter Naur ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π»ΠΈ Π΅Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ ALGOL60. Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° BNF ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована для описания контСкстно-свободных языков. Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ конструкций соврСмСнного программирования ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСны Π² BNF.

НапримСр, Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° для выраТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΌΠ½ΠΎΠΆΠ°Π΅Ρ‚ ΠΈ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅Ρ‚ числа ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ прСдставлСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

E -> E + E

E -> E * E

E -> id

Π‘Ρ‹Π»ΠΈ спСцифицированы 3 ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ. Π’Π΅Ρ€ΠΌΡ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ с Π»Π΅Π²ΠΎΠΉ стороны ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ (lhs) ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ E (expression), ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами. Π’Π΅Ρ€ΠΌΡ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ id (identifier) ΡΠ²Π»ΡΡŽΡ‚ΡΡ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΌΠΈ символами (Ρ‚ΠΎΠΊΠ΅Π½Π°ΠΌΠΈ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌΠΈ lex) ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ΠΏΡ€Π°Π²ΠΎΠΉ стороны ΠΏΡ€Π°Π²ΠΈΠ» ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ (rhs).

Π­Ρ‚Π° Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° опрСдСляСт, Ρ‡Ρ‚ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ суммой Π΄Π²ΡƒΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΠ΅ΠΌ Π΄Π²ΡƒΡ… Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠΌ. МоТно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ эту Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ выраТСния:

E -> E * E (r2)

-> E * z (r3)

-> E + E * z (r1)

-> E + y * z (r3)

-> x + y * z (r3)

На ΠΊΠ°ΠΆΠ΄ΠΎΠΌ шагС ΠΌΡ‹ Ρ€Π°ΡΡˆΠΈΡ€ΡΠ΅ΠΌ Ρ‚Π΅Ρ€ΠΌ, замСняСм Π»Π΅Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ†ΠΈΠΈ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ. Числа справа ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΊΠ°ΠΊΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ примСняСтся. Π§Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° обратная опСрация. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ с Π΅Π΄ΠΈΠ½ΠΈΡ‡Π½ΠΎΠ³ΠΎ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ (Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ символа), ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ· Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. Π­Ρ‚ΠΎ извСстно ΠΏΠΎΠ΄ Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΎΠΌ восходящий (bottom-up) Π°Π½Π°Π»ΠΈΠ· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ стСка для хранСния Ρ‚Π΅Ρ€ΠΌΠΎΠ². Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π² ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΌ порядкС:

1. x + y * z shift

2 x. + y * z reduce (r3)

3 E. + y * z shift

4 E +. y * z shift

5 E + y. * z reduce (r3)

6 E + E. * z shift

7 E + E *. z shift

8 E + E * z. reduce (r3)

9 E + E * E. reduce (r2) emit multiply

10 E + E. reduce (r1) emit add

11 E. accept

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° YACC-ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ„Π°ΠΉΠ» спСцификаций состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… сСкций: объявлСния, (грамматичСскиС) ΠΏΡ€Π°Π²ΠΈΠ»Π°, ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π‘Π΅ΠΊΡ†ΠΈΠΈ Ρ€Π°Π·Π΄Π΅Π»ΡΡŽΡ‚ΡΡ символами Π΄Π²ΠΎΠΉΠ½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π° «%%». Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, ΠΏΠΎΠ»Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» спСцификации выглядит ΠΊΠ°ΠΊ:

описания

%%

ΠΏΡ€Π°Π²ΠΈΠ»Π°

%%

ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

БСкция объявлСний ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ пуста. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, Ссли сСкция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΎΠΏΡƒΡ‰Π΅Π½Π°, Ρ‚ΠΎ Π²Ρ‚орая ΠΌΠ΅Ρ‚ΠΊΠ° «%%» Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Π°; Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, минимальная Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½Π½Π°Ρ спСцификация Yacc Π΅ΡΡ‚ΡŒ:

%%

ΠΏΡ€Π°Π²ΠΈΠ»Π°

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° YACC’e:

%token name

%start e

%%

e: e '+' m | e '-' m | m;

m: m '*' t | m '/' t | t;

t: name | ' (' e ')';

%%

БСкция ΠΏΡ€Π°Π²ΠΈΠ» содСрТит ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ символ name являСтся лСксСмой (Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ) Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ, Π° ΡΠΈΠΌΠ²ΠΎΠ» e — Π΅Π΅ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ.

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° записана ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ — ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹ ΠΈ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹, ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ константы Ρ‚ΠΈΠΏΠ° '+' '-' - Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»Ρ‹. Π‘ΠΈΠΌΠ²ΠΎΠ»Ρ‹: |; - ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ мСтаязыку ΠΈ Ρ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ «Π΅ΡΡ‚ΡŒ ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ», «ΠΈΠ»ΠΈ» ΠΈ «ΠΊΠΎΠ½Π΅Ρ† ΠΏΡ€Π°Π²ΠΈΠ»Π°» соотвСтствСнно.

БСмантичСскиС дСйствия

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

ДСйствия, состоящиС ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ², Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π² Ρ„ΠΈΠ³ΡƒΡ€Π½Ρ‹Π΅ скобки. НапримСр:

A: ' (' B ')'

{hello (1, «abc»);}

ΠΈ

XXX: YYY ZZZ

{printf («a messagen»); flag = 25;}

ΡΠ²Π»ΡΡŽΡ‚ΡΡ грамматичСскими ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌΠΈ с Π΄Π΅ΠΉΡΡ‚виями.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΡ‚ΡŒ связь дСйствий с Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ спСцсимвол «Π΄ΠΎΠ»Π»Π°Ρ€» ($). Π§Ρ‚ΠΎΠ±Ρ‹ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, дСйствиС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ присваиваСт Π΅Π³ΠΎ псСвдопСрСмСнной $$. НапримСр, дСйствиС, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈΡ‡Π΅Π³ΠΎ, Π½ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π΄ΠΈΠ½ΠΈΡ†Ρƒ:

{$$ = 1;}

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ значСния, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹Π΅ ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ дСйствиями ΠΈ Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΈΠΌ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠΌ, дСйствиС ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ псСвдопСрСмСнныС $ 1, $ 2 ΠΈ Ρ‚. Π΄., ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ значСниям, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈ ΠΏΡ€Π°Π²ΠΎΠΉ части ΠΏΡ€Π°Π²ΠΈΠ»Π°, считая слСва Π½Π°ΠΏΡ€Π°Π²ΠΎ. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄:

A: B C D;

Ρ‚ΠΎ $ 2 соотвСтствуСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠΌΡƒ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ C, a $ 3 — Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ D. Π‘ΠΎΠ»Π΅Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

expr: ' (' expr ')';

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹ΠΌ этим ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ являСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ выраТСния Π² ΡΠΊΠΎΠ±ΠΊΠ°Ρ…, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ записано Ρ‚Π°ΠΊ:

expr: ' (' expr ')'

{$$ = $ 2;}

По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ ΠΏΡ€Π°Π²ΠΈΠ»Π° считаСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ элСмСнтом ($ 1). Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ссли ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ дСйствия, Yacc автоматичСски добаляСт Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ $$=$ 1;, благодаря Ρ‡Π΅ΠΌΡƒ для ΠΏΡ€Π°Π²ΠΈΠ»Π° Π²ΠΈΠ΄Π°

A: B;

ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π½Π΅ Ρ‚рСбуСтся самому ΠΏΠΈΡΠ°Ρ‚ΡŒ дСйствиС.

Π’ Π²Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°Ρ… всС дСйствия стояли Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€Π°Π²ΠΈΠ», Π½ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π½ΠΎ. Для этого Yacc позволяСт Π·Π°ΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ дСйствия Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, Π½ΠΎ ΠΈ Π² Π΅Π³ΠΎ сСрСдинС. Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°ΠΊΠΎΠ³ΠΎ дСйствия доступно дСйствиям, стоящим ΠΏΡ€Π°Π²Π΅Π΅, Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ:

A: B

{$$ = 1;}

C

{x = $ 2; y = $ 3;}

;

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Ρ€Π°Π·Π±ΠΎΡ€Π° иксу (x) присвоится Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Π° ΠΈΠ³Ρ€Π΅ΠΊΡƒ (y) — Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΠΎΠΌ C. ДСйствиС, стоящСС Π² ΡΠ΅Ρ€Π΅Π΄ΠΈΠ½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π°, считаСтся Π·Π° Π΅Π³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, поэтому x=$ 2 присваиваСт X-Ρƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½Π½ΠΎΠ΅ дСйствиСм $$=1;

Для дСйствий, находящихся Π² ΡΠ΅Ρ€Π΅Π΄ΠΈΠ½Π΅ ΠΏΡ€Π°Π²ΠΈΠ», Yacc создаСт Π½ΠΎΠ²Ρ‹ΠΉ Π½Π΅Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π» ΠΈ Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ с ΠΏΡƒΡΡ‚ΠΎΠΉ ΠΏΡ€Π°Π²ΠΎΠΉ Ρ‡Π°ΡΡ‚ΡŒΡŽ ΠΈ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΠ΅ выполняСтся послС Ρ€Π°Π·Π±ΠΎΡ€Π° этого Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡ€Π°Π²ΠΈΠ»Π°. На ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ Yacc Ρ‚Ρ€Π°ΠΊΡ‚ΡƒΠ΅Ρ‚ послСдний ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΊΠ°ΠΊ

NEW_ACT: /* empty */ /* ΠΠžΠ’ΠžΠ• ΠŸΠ ΠΠ’Π˜Π›Πž */

{$$ = 1;}

;

A: B NEW_ACT C

{x = $ 2; y = $ 3;}

;

Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ дСйствия Π½Π΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ Π²Π²ΠΎΠ΄Π° / Π²Ρ‹Π²ΠΎΠ΄Π°, Π° ΠΊΠΎΠ½ΡΡ‚Ρ€ΡƒΠΈΡ€ΡƒΡŽΡ‚ ΠΈ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‚ Π² ΠΏΠ°ΠΌΡΡ‚ΠΈ структуры Π΄Π°Π½Π½Ρ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π°. Π’Π°ΠΊΠΈΠ΅ дСйствия ΠΏΡ€ΠΎΡ‰Π΅ всСго Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ вызывая ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ для создания ΠΈ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ структур Π΄Π°Π½Π½Ρ‹Ρ…. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Ρ‡Ρ‚ΠΎ сущСствуСт функция node, написанная Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·ΠΎΠ² node (L, n1, n2) создаСт Π²Π΅Ρ€ΡˆΠΈΠ½Ρƒ с ΠΌΠ΅Ρ‚ΠΊΠΎΠΉ L, вСтвями n1 ΠΈ n2 ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ индСкс свСТСсозданной Π²Π΅Ρ€ΡˆΠΈΠ½Ρ‹. Π’ΠΎΠ³Π΄Π° Π΄Π΅Ρ€Π΅Π²ΠΎ Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒΡΡ Ρ‚Π°ΠΊ:

expr: expr '+' expr

{$$ = node ('+', $ 1, $ 3);}

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ собствСнныС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, доступныС дСйствиям. Π˜Ρ… ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ сдСлано Π² ΡΠ΅ΠΊΡ†ΠΈΠΈ объявлСний, Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠ΅ Π² ΡΠΈΠΌΠ²ΠΎΠ»Ρ‹%{ΠΈ%}. Π’Π°ΠΊΠΈΠ΅ объявлСния ΠΈΠΌΠ΅ΡŽΡ‚ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΡƒΡŽ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ видимости, благодаря Ρ‡Π΅ΠΌΡƒ доступны ΠΊΠ°ΠΊ дСйствиям, Ρ‚Π°ΠΊ ΠΈ Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΎΠΌΡƒ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ. НапримСр:

%{

int variable = 0;

%}

Π’Π°ΠΊΠΈΠ΅ строчки, ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Π½Ρ‹Π΅ Π² Ρ€Π°Π·Π΄Π΅Π» объявлСний, ΠΎΠ±ΡŠΡΠ²Π»ΡΡŽΡ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ variable Ρ‚ΠΈΠΏΠ° int ΠΈ Π΄Π΅Π»Π°ΡŽΡ‚ Π΅Π΅ Π΄ΠΎΡΡ‚ΡƒΠΏΠ½ΠΎΠΉ для всСх дСйствий. ВсС ΠΈΠΌΠ΅Π½Π° Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Yacca Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ c Π΄Π²ΡƒΡ… Π±ΡƒΠΊΠ² y, поэтому Π½Π΅ ΡΠ»Π΅Π΄ΡƒΠ΅Ρ‚ Π΄Π°Π²Π°Ρ‚ΡŒ своим ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π° Ρ‚ΠΈΠΏΠ° yymy.

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

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡΡ‚, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Yacc Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ сам (ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ‚ΠΈΠΏΠ° Lex) внСшний лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ символы ΠΈΠ· Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠ° (ΠΊΠ°ΠΊΠΎΠ³ΠΎ — это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅Π΅ Π΄Π΅Π»ΠΎ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°), ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π΅Ρ€ΠΌΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ символы (Ρ‚ΠΎΠΊΠ΅Π½Ρ‹) ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈΡ… ΡΠΈΠ½Ρ‚аксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ, построСнному YaccΠΎΠΌ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ вмСстС с Π½Π΅ΠΊΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ) для дальнСйшСго Ρ€Π°Π·Π±ΠΎΡ€Π°. ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΡ„ΠΎΡ€ΠΌΠ»Π΅Π½ ΠΊΠ°ΠΊ функция с ΠΈΠΌΠ΅Π½Π΅ΠΌ yylex, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰Π°Ρ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠ° int, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ прСдставляСт собой Ρ‚ΠΈΠΏ (Π½ΠΎΠΌΠ΅Ρ€) ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ Π²ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΌ ΠΏΠΎΡ‚ΠΎΠΊΠ΅ Ρ‚ΠΎΠΊΠ΅Π½Π°. Если Π΅ΡΡ‚ΡŒ ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ Π΅Ρ‰Π΅ Π½Π΅ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½ΠΎΠΌΠ΅Ρ€ Π² Π³Ρ€ΡƒΠΏΠΏΠ΅), ΠΎΠ½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присвоСно глобальной, внСшнСй (ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ yylex) ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ yylval.

ЛСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ Yacc Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Π°. Π­Ρ‚ΠΈ Π½ΠΎΠΌΠ΅Ρ€Π° ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ YaccΠΎΠΌ, Π½ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ ΠΈ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ. Π’ Π»ΡŽΠ±ΠΎΠΌ случаС ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ define языка Π‘ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ лСксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ эти значСния Π² ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΠΎΠΌ Π²ΠΈΠ΄Π΅. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΊΠ΅Π½ ΠΏΠΎ ΠΈΠΌΠ΅Π½ΠΈ DIGIT Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π² ΡΠ΅ΠΊΡ†ΠΈΠΈ объявлСний спСцификации YaccΠ°, Ρ‚ΠΎΠ³Π΄Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ тСкст лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ Ρ‚Π°ΠΊ:

yylex ()

{

extern int yylval;

int c;

c = getchar ();

switch © {

case '0':

case '1':

case '9':

yylval = c — '0';

return DIGIT;

}

Π’Ρ‹ΡˆΠ΅ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΎΠΊΠ΅Π½Π° DIGIT ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Ρ€Π°Π²Π½ΠΎΠ΅ Ρ†ΠΈΡ„Ρ€Π΅. Если ΠΏΡ€ΠΈ этом сам тСкст лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π±Ρ‹Π» ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ Π² ΡΠ΅ΠΊΡ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ спСцификации Yacca — Π΅ΡΡ‚ΡŒ гарантия, Ρ‡Ρ‚ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ DIGIT Π±Ρ‹Π» ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΠΊΠ΅Π½Π° DIGIT, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Ρ‚Π΅ΠΌ самым, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Yacc.

Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ позволяСт ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ понятныС, Π»Π΅Π³ΠΊΠΈΠ΅ Π² ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ лСксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹. ЕдинствСнным ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ являСтся Π·Π°ΠΏΡ€Π΅Ρ‚ Π½Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π° слов, Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹Ρ… ΠΈΠ»ΠΈ часто ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² ΡΠ·Ρ‹ΠΊΠ΅ Π‘ΠΈ ΡΠ»ΠΎΠ². НапримСр, использованиС Π² ΠΊΠ°Ρ‡Π΅ΡΡ‚Π²Π΅ ΠΈΠΌΠ΅Π½ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Ρ‚Π°ΠΊΠΈΡ… слов ΠΊΠ°ΠΊ if ΠΈΠ»ΠΈ while, ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΡŽ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ компиляции лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°. ΠšΡ€ΠΎΠΌΠ΅ этого, имя error Π·Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½ΠΎ для Ρ‚ΠΎΠΊΠ΅Π½Π°, слуТащСго Π΄Π΅Π»Ρƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок, ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ.

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Π½ΠΎΠΌΠ΅Ρ€Π° Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ Π»ΠΈΠ±ΠΎ YaccΠΎΠΌ, Π»ΠΈΠ±ΠΎ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΠΎΠΌ, Π½ΠΎ Ρ‡Π°Ρ‰Π΅ YaccΠΎΠΌ, ΠΏΡ€ΠΈ этом для ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Ρ… символов (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ для (ΠΈΠ»ΠΈ;) выбираСтся Π½ΠΎΠΌΠ΅Ρ€, Ρ€Π°Π²Π½Ρ‹ΠΉ ASCII ΠΊΠΎΠ΄Ρƒ этого символа. Для Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ‚ΠΎΠΊΠ΅Π½ΠΎΠ² Π½ΠΎΠΌΠ΅Ρ€Π° Π²Ρ‹Π±ΠΈΡ€Π°ΡŽΡ‚ΡΡ начиная с 257.

Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎΠΊΠ΅Π½Ρƒ (ΠΈΠ»ΠΈ Π΄Π°ΠΆΠ΅ Π»ΠΈΡ‚Π΅Ρ€Π΅) Π½ΠΎΠΌΠ΅Ρ€ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π² ΡΠ΅ΠΊΡ†ΠΈΠΈ объявлСний послС ΠΈΠΌΠ΅Π½ΠΈ Ρ‚ΠΎΠΊΠ΅Π½Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΠΎΠΆΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΈ ΡΡ‚Π°Π½Π΅Ρ‚ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠΌ Ρ‚ΠΎΠΊΠ΅Π½Π° ΠΈΠ»ΠΈ Π»ΠΈΡ‚Π΅Ρ€Ρ‹, ΠΏΡ€ΠΈ этом Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΠ·Π°Π±ΠΎΡ‚ΠΈΡ‚ΡŒΡΡ ΠΎΠ± ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ². Если Ρ‚ΠΎΠΊΠ΅Π½Ρƒ Π½Π΅ ΠΏΡ€ΠΈΡΠ²ΠΎΠ΅Π½ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Yacc присваиваСт Π΅ΠΌΡƒ Π½ΠΎΠΌΠ΅Ρ€ ΠΏΠΎ ΡΠ²ΠΎΠ΅ΠΌΡƒ Π²Ρ‹Π±ΠΎΡ€Ρƒ.

По Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈ, ΠΊΠΎΠ½Ρ†Π΅Π²ΠΎΠΉ ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Π½ΠΎΠΌΠ΅Ρ€ Ρ‚ΠΎΠΊΠ΅Π½Π°, Ρ€Π°Π²Π½Ρ‹ΠΉ, Π»ΠΈΠ±ΠΎ мСньший нуля, ΠΈ Π»Π΅ΠΊΡΠΈΡ‡Π΅ΡΠΊΠΈΠΉ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ ноль ΠΈΠ»ΠΈ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число ΠΏΡ€ΠΈ достиТСнии ΠΊΠΎΠ½Ρ†Π° Π²Π²ΠΎΠ΄Π° (ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Π°).

ΠžΡ‡Π΅Π½ΡŒ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΈΠΌ срСдством для создания лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² являСтся ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Lex. ЛСксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹, построСнныС с Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ прСкрасно Π³Π°Ρ€ΠΌΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ с ΡΠΈΠ½Ρ‚аксичСскими Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌΠΈ, построСнными YaccΠΎΠΌ. Lex ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ для построСния ΠΏΠΎΠ»Π½ΠΎΠ³ΠΎ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° ΠΈΠ· Ρ„Π°ΠΉΠ»Π° спСцификаций, основанного Π½Π° ΡΠΈΡΡ‚Π΅ΠΌΠ΅ рСгулярных Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ (Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ ΡΠΈΡΡ‚Π΅ΠΌΡ‹ грамматичСских ΠΏΡ€Π°Π²ΠΈΠ» для Yacca), Π½ΠΎ, ΠΏΡ€Π°Π²Π΄Π°, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ языки (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π€ΠΎΡ€Ρ‚Ρ€Π°Π½) Π½Π΅ ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠ΅ Π½ΠΈ ΠΏΠΎΠ΄ ΠΊΠ°ΠΊΡƒΡŽ Ρ‚Π΅ΠΎΡ€Π΅Ρ‚ΠΈΡ‡Π΅ΡΠΊΡŽ схСму, Π½ΠΎ Π΄Π»Ρ Π½ΠΈΡ… приходится ΠΏΠΈΡΠ°Ρ‚ΡŒ лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ.

РСализация Yacc Π² Unix

YACC (1)

ΠΠΠ—Π’ΠΠΠ˜Π•

yacc — Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ компилятор компиляторов

БИНВАКБИБ

yacc [-v] [-d] [-l] [-t] Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°

ΠžΠŸΠ˜Π‘ΠΠΠ˜Π•

Команда yacc ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ контСкстно-ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΡƒΡŽ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ Π² Π½Π°Π±ΠΎΡ€ Ρ‚Π°Π±Π»ΠΈΡ† для простого LR (1) — Ρ€Π°Π·Π±ΠΎΡ€Π°. Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ нСоднозначности; Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡ… ΠΏΡ€Π΅ΠΎΠ΄ΠΎΠ»Π΅Ρ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΏΡ€Π΅Π΄ΡˆΠ΅ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ.

Π’Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΉ Ρ„Π°ΠΉΠ» y.tab.c прСобразуСтся C-компилятором Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ yyparse, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ лСксичСского Π°Π½Π°Π»ΠΈΠ·Π° yylex, Π° Ρ‚Π°ΠΊΠΆΠ΅ с ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ main ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок yyerror. Π­Ρ‚ΠΈ ΠΏΠΎΠ΄ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ прСдоставлСны ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ; ΠΏΡ€ΠΈ ΠΏΠΎΡ€ΠΎΠΆΠ΄Π΅Π½ΠΈΠΈ лСксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² ΠΏΠΎΠ»Π΅Π·Π΅Π½ lex (1).

ДопустимыС ΠΎΠΏΡ†ΠΈΠΈ:

-v

Π‘Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» y. output, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ содСрТит описаниС Ρ‚Π°Π±Π»ΠΈΡ† Ρ€Π°Π·Π±ΠΎΡ€Π° с ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ΠΌ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π½Ρ‹Ρ… ситуаций, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Ρ… нСоднозначностями Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ.

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