ΠΡΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡΡΠΈΡΡΠ΅ΠΌ Π½ΠΎΠ²ΡΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ 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 */