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

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

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

ΠŸΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π½ΠΎΠ²Ρ‹Π΅ возмоТности hoc2 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΈ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ восстановлСния послС ошибки:

$ hoc2

x = 355

355

y = 113

113

p = x/z                            z Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, Ρ€Π°Π²Π½ΠΎ 0

hoc2: division by zero near line 4 ВосстановлСниС послС ошибки

x/y

3.1415929

1Π΅30 * 1Π΅30                        ΠŸΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

hoc2: floating point exception near line 5

...

Π’ самом Π΄Π΅Π»Π΅, для PDP-11 Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π²ΠΏΠΎΠ»Π½Π΅ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ ΠΌΠ΅Ρ€Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ вСщСствСнного, Π½ΠΎ Π½Π° Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ Π΄Ρ€ΡƒΠ³ΠΈΡ… машин hoc2 дСйствуСт Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.3

ΠžΠ±Π΅ΡΠΏΠ΅Ρ‡ΡŒΡ‚Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запоминания послСднСго вычислСнного значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΅Π³ΠΎ Π½Π΅ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΠ»ΠΎΡΡŒ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ снова для ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ связанных вычислСний. Одним ΠΈΠ· Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использованиС ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ 'p', Π² качСствС "ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ" (previous) значСния.

Π£ΠΏΡ€Π°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.4

Π˜Π·ΠΌΠ΅Π½ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ hoc Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символ ';' ΠΊΠ°ΠΊ Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»ΡŒ Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π°Ρ€Π°Π²Π½Π΅ с символом ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° строки.

8.3 Π­Ρ‚Π°ΠΏ 3: ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ; встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

Π’ Π²Π΅Ρ€ΡΠΈΡŽ hoc3 Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ нСсколько Π½ΠΎΠ²Ρ‹Ρ… срСдств, ΠΈΠ·-Π·Π° Ρ‡Π΅Π³ΠΎ увСличился тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ОсновноС Π½ΠΎΠ²ΠΎΠ²Π²Π΅Π΄Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ обращСния ΠΊ встроСнным функциям:

sin cos atan exp log log10 sqrt int abs

Π’Π²Π΅Π΄Π΅Π½Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ опСрация возвСдСния Π² ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ '^' (ΠΏΡ€Π°Π²ΠΎ ассоциативная с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ).

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

PI 3.14159265358979323846 Число Ο€ E 2.71828182845904523536 ОснованиС Π½Π°Ρ‚ΡƒΡ€Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Π»ΠΎΠ³Π°Ρ€ΠΈΡ„ΠΌΠ° GAMMA 0.57721566490153286060 ΠšΠΎΠ½ΡΡ‚Π°Π½Ρ‚Π° Π­ΠΉΠ»Π΅Ρ€Π°-ΠœΠ°ΡΠΊΠ΅Ρ€ΠΎΠ½ΠΈ DEG 57.2957795130823208768 ΠžΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ градуса ΠΊ Ρ€Π°Π΄ΠΈΠ°Π½Ρƒ PHI 1.61803398874989484820 Π—ΠΎΠ»ΠΎΡ‚ΠΎΠ΅ сСчСниС

Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€:

$ hoc3

1.5^2.3

 2.5410306

exp(2*3*log(1.5))

 2.5410306

sin(PI/2)

 1

atan(1)*DEG

 45

НСсколько ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠ»Π°ΡΡŒ ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° распознаватСля. Π’ hoc2 присваиваниС x = expr Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Π»ΠΎ присваиваниС, Π½ΠΎ ΠΈ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»ΠΎ ΠΊ ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ значСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС выраТСния ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ:

$ hoc2

x=2*3.14159

6.28318 Π’ случаС присваивания ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСчатаСтся

Π’ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ hoc3 проводится Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠ΅ ΠΌΠ΅ΠΆΠ΄Ρƒ присваиваниями ΠΈ выраТСниями; значСния ΠΏΠ΅Ρ‡Π°Ρ‚Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ:

$ hoc3

x=2*3.14159 ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΠ΅: Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ пСчатаСтся

x           Π’Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅:

6.28318     Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ пСчатаСтся

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ°ΡΡΡ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ всСх этих ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π΅Π»ΠΈΠΊΠ° (ΠΎΠΊΠΎΠ»ΠΎ 250 строк тСкста), Ρ‡Ρ‚ΠΎ для простоты рСдактирования ΠΈ ускорСния компиляции Π»ΡƒΡ‡ΡˆΠ΅ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π΅Π΅ Π½Π° ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹. Π˜Ρ‚Π°ΠΊ, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΠΈΠΌΠ΅Π΅ΠΌ ΠΏΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»ΠΎΠ² вмСсто ΠΎΠ΄Π½ΠΎΠ³ΠΎ:

hoc.y Π³Ρ€Π°ΠΌΠΌΠ°Ρ‚ΠΈΠΊΠ°, main, yylex (ΠΊΠ°ΠΊ ΠΈ ΠΏΡ€Π΅ΠΆΠ΄Π΅); hoc.h Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ структуры Π΄Π°Π½Π½Ρ‹Ρ… для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹; symbol.c Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ с Ρ‚Π°Π±Π»ΠΈΡ†Π΅ΠΉ ΠΈΠΌΠ΅Π½: lookup, install; unit.c встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ константы; init; math.c Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для Π²Ρ‹Π·ΠΎΠ²Π° стандартных матСматичСских Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: Sqrt, Log ΠΈ Ρ‚.Π΄.

НСобходимо Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚ΡŒΡΡ с Ρ€Π°Π±ΠΎΡ‚ΠΎΠΉ Π‘ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, состоящСй ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ make, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Π»ΠΎΠΆΠΈΡ‚ΡŒ Π½Π° Π½Π΅Π΅ Ρ‡Π°ΡΡ‚ΡŒ своих обязанностСй.

ВСрнСмся снова ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ make ΠΈ рассмотрим Π²Π½Π°Ρ‡Π°Π»Π΅ структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅Π½. ΠŸΠΎΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π΅Ρ‚ имя, Ρ‚ΠΈΠΏ (VAR ΠΈΠ»ΠΈ BLTIN) ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Π’Π°ΠΊ, ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Ρ‚ΠΈΠΏΠ° VAR ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ double; Ссли ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ являСтся встроСнным, Ρ‚ΠΎ Π΅Π³ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ слуТит ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‰ΡƒΡŽ double. Данная информация ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π² hoc.y, symbol.c ΠΈ init.c. Π•Π΅ ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·ΠΌΠ½ΠΎΠΆΠΈΡ‚ΡŒ Π² Ρ‚Ρ€Π΅Ρ… экзСмплярах, Π½ΠΎ Ρ‚ΠΎΠ³Π΄Π° Π»Π΅Π³ΠΊΠΎ ΠΎΡˆΠΈΠ±ΠΈΡ‚ΡŒΡΡ ΠΈΠ»ΠΈ Π·Π°Π±Ρ‹Ρ‚ΡŒ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· экзСмпляров ΠΏΡ€ΠΈ внСсСнии ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. ВмСсто этого ΠΌΡ‹ помСстили ΠΎΠ±Ρ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² Ρ„Π°ΠΉΠ» ΠΌΠ°ΠΊΡ€ΠΎΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ hoc.h, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈ нСобходимости Π² любой Ρ„Π°ΠΉΠ». (ΠžΠΊΠΎΠ½Ρ‡Π°Π½ΠΈΠ΅ .h Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ, Π½ΠΎ Π½Π΅ контролируСтся Π½ΠΈΠΊΠ°ΠΊΠΈΠΌΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌΠΈ.) Π’ Ρ„Π°ΠΉΠ» makefile Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ свСдСния ΠΎ зависимости исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΎΡ‚ hoc.h, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ hoc.h Π±Ρ‹Π»Π° ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½Π° трСбуСмая пСрСкомпиляция.

$ cat hoc.h

typedef struct Symbol { /* symbol table entry */

 char *name;

 short type; /* VAR, BLTIN, UNDEF */

 union {

  double val; /* if VAR */

  double (*ptr)(); /* if BLTIN */

 } u;

 struct Symbol *next; /* to link to another */

} Symbol;

Symbol *install(), *lookup();

$

Π’ΠΈΠΏ UNDEF ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ VAR, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠΊΠ° Π½Π΅ присвоили значСния. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ связаны Π² список с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ элСмСнта next Π² записи Symbol. Π‘Π°ΠΌ список являСтся Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ для symbol.c, доступ ΠΊ Π½Π΅ΠΌΡƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ посрСдством Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ lookup ΠΈ install. Π­Ρ‚ΠΎ позволяСт Π² случаС нСобходимости Π»Π΅Π³ΠΊΠΎ ΠΌΠ΅Π½ΡΡ‚ΡŒ структуру Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ ΠΈΠΌΠ΅Π½ (Ρ‡Ρ‚ΠΎ ΠΌΡ‹ ΡƒΠΆΠ΅ сдСлали ΠΎΠ΄Π½Π°ΠΆΠ΄Ρ‹). Ѐункция lookup отыскиваСт Π² спискС Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ имя ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Symbol, Ссли имя Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, ΠΈ 0 Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π’Π°Π±Π»ΠΈΡ†Π° ΠΈΠΌΠ΅Π½ рассчитана Π½Π° Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ поиск, Ρ‡Ρ‚ΠΎ Π²ΠΏΠΎΠ»Π½Π΅ допустимо для Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π»ΡŒΠΊΡƒΠ»ΡΡ‚ΠΎΡ€Π°, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ поиск ΠΈΠΌΠ΅Π½ выполняСтся Π½Π΅ Π²ΠΎ врСмя Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹, Π° Π² процСссС Ρ€Π°Π·Π±ΠΎΡ€Π°. Ѐункция install вносит ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ связанныС с Π½Π΅ΠΉ Ρ‚ΠΈΠΏ ΠΈ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π² Π½Π°Ρ‡Π°Π»ΠΎ списка. Ѐункция emalloc обращаСтся ΠΊ стандартной Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ размСщСния malloc (см. справочноС руководство ΠΏΠΎ malloc(3)) ΠΈ провСряСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚. Π£ΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Ρ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‚ содСрТимоС Ρ„Π°ΠΉΠ»Π° symbol.c. Π€Π°ΠΉΠ» y.tab.h создаСтся ΠΏΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ yacc -d; ΠΎΠ½ содСрТит ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Ρ‹ #define, ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Π΅ΠΌΡ‹Π΅ yacc для лСксСм NUMBER, VAR, BLTIN ΠΈ Ρ‚.Π΄.

$ cat symbol.c

#include "hoc.h"

#include "y.tab.h"


static Symbol *symlist = 0; /* symbol table: linked list */


Symbol *lookup(s) /* find s in symbol table */

 char *s;

{

 Symbol *sp;


 for (sp = symlist; sp != (Symbol*)0; sp = sp->next)

  if (strcmp(sp->name, s) == 0)

   return sp;

 return 0; /* 0 ==> not found */

}


Symbol *install(s, t, d) /* install s in symbol table */

 char *s;

 int t;

 double d;

{

 Symbol *sp;

 char *emalloc();


 sp = (Symbol*)emalloc(sizeof(Symbol));

 sp->name = emalloc(strlen(s)+1); /* +1 for '\0' */

 strcpy(sp->name, s);

 sp->type = t;

 sp->u.val = d;

 sp->next = symlist; /* put at front of list */

 symlist = sp;

 return sp;

}


char *emalloc(n) /* check return from malloc */

 unsigned n;

{

 char *p, *malloc();


 p = malloc(n);

 if (p == 0)

  execerror("out of memory", (char*)0);

 return p;

}

$

Π€Π°ΠΉΠ» init.c содСрТит опрСдСлСния констант (PI ΠΈ Ρ‚.ΠΏ.) ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° встроСнныС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ; ΠΎΠ½ΠΈ заносятся Π² Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ ΠΈΠΌΠ΅Π½ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ init, находящСйся Π² main.

$ cat init.c

#include "hoc.h"

#include "y.tab.h"

#include <math.h>


extern double Log(), Log10(), Exp(), Sqrt(), integer();


static struct { /* Constants */

 char *name;

 double cval;

} consts[] = {

 "PI",   3.14159265358979323846,

 "E",     2.71828182845904523536,

 "GAMMA", 0.57721566490153286060, /* Euler */

 "DEG",  57.29577951308232087680, /* deg/radian */

 "PHI",   1.61803398874989484820, /* golden ratio */

 0,       0

};


static struct { /* Built-ins */