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

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ Β«UNIX β€” ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½Π°Ρ срСда программирования». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 63

Автор Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½

β€’ make β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ процСсс компиляции слоТных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΈΠΌ;

β€’ lex β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, аналогичная yacc, Π½ΠΎ ΡΠΎΠ·Π΄Π°ΡŽΡ‰Π°Ρ лСксичСскиС Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρ‹.

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

1. Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π° с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ дСйствиями: +, -, *, / (ΠΈ со скобками). ΠšΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ выполняСт ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π½Π°Π΄ числами с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, каТдая строка состоит ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ выраТСния; ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСчатаСтся сразу.

2. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΎΡ‚ Π° Π΄ΠΎ z. Π’ этой вСрсии Π΅ΡΡ‚ΡŒ Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ½Π°Ρ€Π½Ρ‹ΠΉ минус ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ срСдства Π·Π°Ρ‰ΠΈΡ‚Ρ‹ ΠΎΡ‚ ошибок.

3. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… с ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π΄Π»ΠΈΠ½Ρ‹, встроСнных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ для sin, exp ΠΈ Ρ‚.ΠΏ., ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… констант Ρ‚ΠΈΠΏΠ° Ο€ (обозначаСтся ΠΊΠ°ΠΊ PI) ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ.

4. Π’нСсСниС Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ вычисляСтся Π½Π΅ нСпосрСдствСнно, Π° ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ впослСдствии интСрпрСтируСтся. НовыС возмоТности Π½Π΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ, Π½ΠΎ подготавливаСтся ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ ΠΊ ΠΏ. 5.

5. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ структур управлСния: if-else ΠΈ while β€” Π³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΈ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΉ Ρ‚ΠΈΠΏΠ° >, <= ΠΈ Ρ‚.ΠΏ.

6. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ рСкурсивных ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² для Π²Π²ΠΎΠ΄Π°-Π²Ρ‹Π²ΠΎΠ΄Π° строк ΠΈ чисСл.

ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ вСрсия языка описана Π² Π³Π». 9 ΠΊΠ°ΠΊ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… срСдств ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ систСмы UNIX. Π’ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 2 приводится справочноС руководство ΠΏΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Ρƒ.

Π­Ρ‚Π° Π³Π»Π°Π²Π° довольно объСмная, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ Π² Π½Π΅ΠΉ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ рассматриваСтся, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚ΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅ язык Π‘ΠΈ ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ Ρ€ΡƒΠΊΠΎΠΉ экзСмпляр справочного руководства ΠΏΠΎ систСмС UNIX (Ρ‚ΠΎΠΌ 2), ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ просто Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΡŠΡΡΠ½ΠΈΡ‚ΡŒ всС Π½ΡŽΠ°Π½ΡΡ‹. Π‘ΡƒΠ΄ΡŒΡ‚Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π²Π°ΠΌ придСтся ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π³Π»Π°Π²Ρƒ нСсколько Ρ€Π°Π·. ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ вСрсия ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ прСдставлСна Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ 3. Π—Π°ΠΌΠ΅Ρ‚ΠΈΠΌ, кстати, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ Π΄ΠΎΠ»Π³ΠΎ спорили ΠΈΠ·-Π·Π° ΠΈΠΌΠ΅Π½ΠΈ языка, Π½ΠΎ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π»ΠΈ подходящСС. ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ Π½Π° hoc, Ρ‡Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ "ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ высокого уровня" (high level calculator).

Π•Π³ΠΎ вСрсии соотвСтствСнно Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ hoc1, hoc2 ΠΈ Ρ‚.Π΄.

8.1 Π­Ρ‚Π°ΠΏ 1: ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€ с Ρ‡Π΅Ρ‚Ρ‹Ρ€ΡŒΠΌΡ дСйствиями

ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго рассмотрим Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ hoc1 β€” ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΆΠ΅ возмоТностями, ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ ΠΊΠ°Ρ€ΠΌΠ°Π½Π½Ρ‹ΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€, Π½ΠΎ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡƒΠ΄ΠΎΠ±Π½ΠΎΠΉ для пСрСноса. Она выполняСт Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ: +, -, *, / ΠΈ, ΠΈΠΌΠ΅Π΅Ρ‚ скобки с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ Π³Π»ΡƒΠ±ΠΈΠ½ΠΎΠΉ влоТСнности, Ρ‡Π΅ΠΌ ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ лишь Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Ρ‹. Если Π²Ρ‹ Π²Π²Π΅Π΄Π΅Ρ‚Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ ΠΈ символ RETURN, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°ΠΏΠ΅Ρ‡Π°Ρ‚Π°Π½ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ строкС:

$ hoc1

4*3*2

  24

(1+2)*(3+4)

 21

1/2

 0.5

355/113

 3.1415929

-3 - 4

hoc1 : syntax error near line 4 No unary minus yet

$

Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°

Π‘ появлСниСм Ρ„ΠΎΡ€ΠΌΡ‹ Бэкуса-Наура, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠΉ для Алгола, языки стали ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒΡΡ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ. АбстрактноС описаниС Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ hoc1 простоС ΠΈ ΠΊΡ€Π°Ρ‚ΠΊΠΎΠ΅:

список: Π²Ρ‹Ρ€Π°ΠΆ \n

 ΡΠΏΠΈΡΠΎΠΊ Π²Ρ‹Ρ€Π°ΠΆ \n

Π²Ρ‹Ρ€Π°ΠΆ: NUMBER

 Π²Ρ‹Ρ€Π°ΠΆ + Π²Ρ‹Ρ€Π°ΠΆ

 Π²Ρ‹Ρ€Π°ΠΆ - Π²Ρ‹Ρ€Π°ΠΆ

 Π²Ρ‹Ρ€Π°ΠΆ * Π²Ρ‹Ρ€Π°ΠΆ

 Π²Ρ‹Ρ€Π°ΠΆ / Π²Ρ‹Ρ€Π°ΠΆ

 ( Π²Ρ‹Ρ€Π°ΠΆ )

Π—Π΄Π΅ΡΡŒ список β€” ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ символом ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки, Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ β€” число ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π° Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½Π΅Π½Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ, Π»ΠΈΠ±ΠΎ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² скобках.

ΠŸΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ описаниС Π½Π΅ ΠΏΠΎΠ»Π½ΠΎΠ΅, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² Π½Π΅ΠΌ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ СстСствСнный ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ ΠΈ Π°ΡΡΠΎΡ†ΠΈΠ°Ρ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹ значСния конструкциям языка. Π₯отя список спСцифицируСтся Ρ‡Π΅Ρ€Π΅Π· Π²Ρ‹Ρ€Π°ΠΆ, Π° ΠΎΠ½ΠΎ Π² свою ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ Ρ‡Π΅Ρ€Π΅Π· NUMBER, само NUMBER Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½Π½ΠΎΠ³ΠΎ описания ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ внСсти ΡΡΠ½ΠΎΡΡ‚ΡŒ Π² эти вопросы.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° yacc

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ синтаксичСских Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ΠΎΠ² yacc[15] ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ компилятор грамматичСских ΠΏΡ€Π°Π²ΠΈΠ» языка, ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π²Ρ‹ΡˆΠ΅, Π² Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ языка. Yacc ΠΎΠ±Π»Π°Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ значСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠΈ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² процСссС Ρ€Π°Π·Π±ΠΎΡ€Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ "вычислСно" . Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ yacc поэтапно,

На ΠΏΠ΅Ρ€Π²ΠΎΠΌ этапС записываСтся Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° языка, Π½ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½ΠΎ, Ρ‡Π΅ΠΌ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Ρ€Π°Π½Π΅Π΅, Ρ‚.Π΅. опрСдСляСтся синтаксис. На этом этапС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ yacc β€” ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ появлСния ошибок ΠΈ двусмыслСнностСй Π² Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ΅.

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

Π’Ρ€Π΅Ρ‚ΠΈΠΉ этап β€” созданиС лСксичСского Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Ρ€Π°Π·Π±ΠΈΡ€Π°Π΅ΠΌΡ‹ΠΉ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ ΠΈ Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ для Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π° Π½Π° осмыслСнныС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ лСксичСской Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π΄Π»ΠΈΠ½ΠΎΠΉ Π² нСсколько символов ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ»ΡƒΠΆΠΈΡ‚ΡŒ NUMBER; ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ· ΠΎΠ΄Π½ΠΎΠ³ΠΎ символа, Ρ‚Π°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ + ΠΈ *, Ρ‚Π°ΠΊΠΆΠ΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ лСксичСскими Π΅Π΄ΠΈΠ½ΠΈΡ†Π°ΠΌΠΈ. По Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ лСксичСскиС Π΅Π΄ΠΈΠ½ΠΈΡ†Ρ‹ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ лСксСмами.

На ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ этапС разрабатываСтся ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Π°, которая Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, созданный yacc.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° yacc ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΡƒ ΠΈ сСмантичСскиС ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Ρ€Π°Π·Π±ΠΎΡ€Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ yyparse ΠΈ записываСт Π΅Π΅ Π² Π²ΠΈΠ΄Π΅ Ρ„Π°ΠΉΠ»Π° с тСкстом Π½Π° Π‘ΠΈ. Если yacc Π½Π΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ ошибок, Ρ‚ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, лСксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ ΠΌΠΎΠΆΠ½ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΡΠ²ΡΠ·Π°Ρ‚ΡŒ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ Π½Π° Π‘ΠΈ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ.

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

Π§Ρ‚ΠΎΠ±Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΡ‡Π½Ρ‹ΠΌΠΈ, ΡƒΠΊΠ°ΠΆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠΉ ΠΏΠΎΡ‚ΠΎΠΊ для yacc Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ Π²ΠΈΠ΄:

%{

 ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π‘ΠΈ Ρ‚ΠΈΠΏΠ° #include, описания ΠΈ Ρ‚. Π΄.

 Π­Ρ‚Π° Ρ‡Π°ΡΡ‚ΡŒ Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Π°.

%}

yacc-описания: лСксСмы, грамматичСскиС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅,

информация ΠΎ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π°Ρ… ΠΈ ассоциативности

%%

грамматичСскиС ΠΏΡ€Π°Π²ΠΈΠ»Π° ΠΈ дСйствия

%%

Π΅Ρ‰Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π‘ΠΈ (Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ):

main() {

 ...; yyparse(); ...

}

yylex() {

 ...

}

...

Π­Ρ‚ΠΎΡ‚ ΠΏΠΎΡ‚ΠΎΠΊ поступаСт Π½Π° Π²Ρ…ΠΎΠ΄ yacc, Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ записываСтся Π² Ρ„Π°ΠΉΠ» y.tab.c, ΠΈΠΌΠ΅ΡŽΡ‰ΠΈΠΉ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ структуру:

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° Π‘ΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ %{ ΠΈ %}, Ссли Π΅ΡΡ‚ΡŒ

ΠžΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ Π½Π° Π‘ΠΈ ΠΈΠ· части послС Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ %%, Ссли Π΅ΡΡ‚ΡŒ:

main() {

 ...; yyparse(); ...

}

yylex() {

 ...

}

...

yyparse() {

 Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ yylex()

}

Π’Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Ρ‚ΠΈΠΏΠΈΡ‡Π΅Π½ для систСмы UNIX: yacc Π²Ρ‹Π΄Π°Π΅Ρ‚ тСкст Π½Π° Π‘ΠΈ, Π° Π½Π΅ оттранслированный Ρ„Π°ΠΉΠ» (.o), Ρ‡Ρ‚ΠΎ являСтся Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π³ΠΈΠ±ΠΊΠΈΠΌ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ созданный тСкст, пСрСносим ΠΈ Π»Π΅Π³ΠΊΠΎ поддаСтся Π»ΡŽΠ±ΠΎΠΌΡƒ Π΄Ρ€ΡƒΠ³ΠΎΠΌΡƒ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΡŽ (Ссли появится Ρ…ΠΎΡ€ΠΎΡˆΠ°Ρ идСя).

Π“Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ yacc сам ΠΏΠΎ сСбС прСдставляСтся ΠΌΠΎΡ‰Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΌ срСдством. Π•Π³ΠΎ ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ вас, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… усилий, Π½ΠΎ всС ваши "Π·Π°Ρ‚Ρ€Π°Ρ‚Ρ‹" ΠΌΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ окупятся. Анализаторы, создаваСмыС yacc, β€” нСбольшиС, эффСктивныС ΠΈ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹Π΅ (хотя Π·Π° сСмантичСскиС прСобразования ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚Π΅ Π²Ρ‹). ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ нСприятныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, связанныС с процСссом Ρ€Π°Π·Π±ΠΎΡ€Π°, Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ автоматичСски. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ языковых распознаватСлСй достаточно Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΈ, Ρ‡Ρ‚ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π΅Ρ‰Π΅ Π±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½ΠΎ, ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π½ΠΈΡ опрСдСлСния языка.

ИспользованиС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π½Π° этапС 1

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ тСкст hoc1 состоит ΠΈΠ· грамматичСских ΠΏΡ€Π°Π²ΠΈΠ» с описаниСм дСйствий лСксичСской ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ yylex ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main, Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ hoc.y. (ИмСна Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих тСкст для yacc, Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ ΠΎΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π½Π° .y, Π½ΠΎ это соглашСниС Π² ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ ΠΎΡ‚ соглашСния ΠΎ сс ΠΈ .c Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сам yacc.) Π“Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ° составляСт ΠΏΠ΅Ρ€Π²ΡƒΡŽ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Ρƒ Ρ„Π°ΠΉΠ»Π° hoc.y: