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

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

Автор ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ Π‘Ρ€Π°ΠΉΠ°Π½ Уилсон

Β 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)