ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ
hoc
Π²ΠΎΠ·ΡΠ°ΡΡΠ°Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΡ ΠΌΠ΅Ρ
Π°Π½ΠΈΡΠ΅ΡΠΊΠΈ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΈ Π²Π·Π°ΠΈΠΌΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ. ΠΠ΅ΠΎΡΠ΅Π½ΠΈΠΌΡΡ ΠΏΠΎΠΌΠΎΡΡ Π·Π΄Π΅ΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΠΊΠ°Π·Π°ΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Π°
make
: ΠΎΠ½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΡΠ΅Ρ ΠΏΡΠΎΡΠ΅ΡΡ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ½Π°ΡΠ΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ Π±Ρ Π²ΡΠΏΠΎΠ»Π½ΡΡΡ Π²ΡΡΡΠ½ΡΡ (ΠΈ ΠΈΠ½ΠΎΠ³Π΄Π° Ρ ΠΎΡΠΈΠ±ΠΊΠ°ΠΌΠΈ) ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΉ ΡΠ°ΠΉΠ».
ΠΡ ΡΠ΄Π΅Π»Π°Π΅ΠΌ Π΅ΡΠ΅ Π΄Π²Π΅ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π² ΡΠ°ΠΉΠ»Π΅
makefile
. ΠΠ΅ΡΠ²Π°Ρ ΡΠ²ΡΠ·Π°Π½Π° Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Ρ
ΠΎΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΈ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΠΊΠΎΠ½ΡΡΠ°Π½Ρ, ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΡΡ
Π² yacc ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΡΠ°ΠΉΠ»Π°
y.tab.h
, Π½Π΅Ρ Π½ΡΠΆΠ΄Ρ ΠΈΡ
ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°ΡΡ, Π΅ΡΠ»ΠΈ Π½Π΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠ»ΠΈΡΡ ΡΠ°ΠΌΠΈ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΡ, Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Π² ΡΠ΅ΠΊΡΡΠ΅ Π‘ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π°
hoc.y
Π½Π΅ Π²Π»ΠΈΡΠ΅Ρ Π½Π° Π΄ΡΡΠ³ΠΈΠ΅ ΡΠ°ΠΉΠ»Ρ. Π Π½ΠΎΠ²ΠΎΠΉ Π²Π΅ΡΡΠΈΠΈ
makefile
ΡΠ°ΠΉΠ»Ρ
.o
Π·Π°Π²ΠΈΡΡΡ ΠΎΡ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
x.tab.h
, ΠΊΠΎΡΠΎΡΡΠΉ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΡΠΈ Π·Π°ΠΌΠ΅Π½Π΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
y.tab.h
. ΠΡΠΎΡΠ°Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΎΡΠ½ΠΎΠ²Π°Π½Π° Π½Π° ΡΠΎΠΌ, ΡΡΠΎ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π΄Π»Ρ
pr
(ΠΏΠ΅ΡΠ°ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²) Π·Π°Π²ΠΈΡΠΈΡ Π»ΠΈΡΡ ΠΎΡ ΡΠ°ΠΌΠΈΡ
ΠΈΡΡ
ΠΎΠ΄Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ², Π° ΠΈΠΌΠ΅Π½Π½ΠΎ, ΠΏΠ΅ΡΠ°ΡΠ°ΡΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ.
ΠΠ΅ΡΠ²Π°Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡΡ Π²ΡΠ΅ΠΌΡ Π² ΡΠ»ΡΡΠ°Π΅ Π±ΠΎΠ»ΡΡΠΈΡ
ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΊΠΎΠ³Π΄Π° Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΠ° ΠΏΠΎΡΡΠΎΡΠ½Π½Π°, Π° ΡΠ΅ΠΌΠ°Π½ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ ΠΌΠ΅Π½ΡΡΡΡΡ (ΠΎΠ±ΡΡΠ½Π°Ρ ΡΠΈΡΡΠ°ΡΠΈΡ). ΠΡΠΎΡΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠΈΠ²Π°Π΅Ρ ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ Π±ΡΠΌΠ°Π³ΠΈ.
ΠΡΠΈΠ²Π΅Π΄Π΅ΠΌ
makefile
Π΄Π»Ρ
hoc4
:
YFLAGS = -d
OBJS = hoc.o code.o init.o math.o symbol.o
hoc4: $(OBJS)
Β Β Β Β Β cc $(OBJS) -lm -o hoc4
hoc.o code.o init.o symbol.o: hoc.h
code.o init.o symbol.o: x.tab.h
x.tab.h: y.tab.h
Β Β Β Β Β Β -cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
pr: hoc.y hoc.h code.c init.c math.c symbol.c
Β Β Β Β Β @pr $?
Β Β Β Β Β @touch pr
clean:
Β Β Β Β Β rm -f $(OBJS) [xy].tab.[ch]
Π‘ΠΈΠΌΠ²ΠΎΠ»
'-'
ΠΏΠ΅ΡΠ΅Π΄ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ
cmp
Π΄Π°Π΅Ρ ΡΠΊΠ°Π·Π°Π½ΠΈΠ΅
make
ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π² ΡΠ»ΡΡΠ°Π΅ Π½Π΅ΡΠ΄Π°ΡΠΈ
cmp
; ΡΡΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ Π½Π΅ ΠΎΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°ΡΡ ΡΠ°Π±ΠΎΡΡ ΠΈ ΠΏΡΠΈ Π½Π΅ΡΡΡΠ΅ΡΡΠ²ΡΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ»Π΅
x.tab.h
(ΡΠ»Π°Π³
-s
ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π΅
cmp
Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡ Π²ΡΠ²ΠΎΠ΄, Π½ΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ ΠΊΠΎΠ΄ Π·Π°Π²Π΅ΡΡΠ΅Π½ΠΈΡ). ΠΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΡ
$?
ΡΠ°ΡΠΊΡΡΠ²Π°Π΅ΡΡΡ ΠΊΠ°ΠΊ ΡΠΏΠΈΡΠΎΠΊ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΈΠ· ΠΏΡΠ°Π²ΠΈΠ»Π° Ρ ΡΡΡΠ°ΡΠ΅Π²ΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠ΅ΠΉ. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΡΠΎΡΠΌΠ° Π·Π°ΠΏΠΈΡΠΈ Π²
makefile
ΡΠ»Π°Π±ΠΎ ΡΠ²ΡΠ·Π°Π½Π° Ρ ΠΎΠ±ΠΎΠ·Π½Π°ΡΠ΅Π½ΠΈΡΠΌΠΈ Π² ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ΅.
ΠΡΠΎΠΈΠ»Π»ΡΡΡΡΠΈΡΡΠ΅ΠΌ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ΅ Π²ΡΡΠ΅ Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠ΅ (Π² ΠΏΡΠ΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ, ΡΡΠΎ Π²ΡΠ΅ ΡΠ°ΠΉΠ»Ρ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ):
$ touch hoc.y
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ Π²ΡΠ΅ΠΌΡ Π΄Π»Ρ ΡΠ°ΠΉΠ»Π° hoc.y
$ make
yacc -d hoc.y
Β conflicts: 1 shift/reduce
ΡΡ -Ρ y.tab.c
rm y.tab.c
mv y.tab.o hoc.o
cmp -s x.tab.h y.tab.h || cp y.tab.h x.tab.h
cc hoc.o code.o init.o math.o symbol.o -lm -o hoc4
$ make -n p
r ΠΠ΅ΡΠ°ΡΡ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½Π½ΡΡ
ΡΠ°ΠΉΠ»ΠΎΠ²
pr hoc.y
touch pr
$
ΠΡΠΌΠ΅ΡΠΈΠΌ, ΡΡΠΎ, ΠΊΡΠΎΠΌΠ΅
hoc.y
, ΡΠ°ΠΉΠ»Ρ Π½Π΅ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΠ»ΠΈΡΠΎΠ²Π°Π»ΠΈΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΠΉΠ»
y.tab.h
ΠΎΡΡΠ°Π»ΡΡ ΡΠ΅ΠΌ ΠΆΠ΅.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.10
Π‘Π΄Π΅Π»Π°ΠΉΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ ΡΡΠ΅ΠΊΠ° ΠΈ ΠΌΠ°ΡΡΠΈΠ²Π°
prog
Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ΅ΡΠΊΠΈΠΌΠΈ, ΡΡΠΎΠ±Ρ Π΄Π»Ρ
hoc4
Π²ΡΠ΅Π³Π΄Π° Ρ
Π²Π°ΡΠ°Π»ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΏΠ°ΠΌΡΡΠΈ, Π΅ΡΠ»ΠΈ ΡΠΎΠ»ΡΠΊΠΎ Π΅Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ»ΡΡΠΈΡΡ, ΠΎΠ±ΡΠ°ΡΠ°ΡΡΡ ΠΊ ΡΡΠ½ΠΊΡΠΈΠΈ
malloc
.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.11
ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅
hoc4
ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π² ΡΡΠ½ΠΊΡΠΈΠΈ
execute
Π²ΠΌΠ΅ΡΡΠΎ Π²ΡΠ·ΠΎΠ²Π° ΡΡΠ½ΠΊΡΠΈΠΉ ΠΏΠ΅ΡΠ΅ΠΊΠ»ΡΡΠ°ΡΠ΅Π»Ρ ΠΏΠΎ Π²ΠΈΠ΄Ρ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ
+
. ΠΠ°ΠΊΠΎΠ²ΠΎ ΡΠΎΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΉ ΠΏΠΎ ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΈΡΡ
ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ΅ΠΊΡΡΠ° ΠΈ ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΡ? ΠΠ°ΠΊ ΠΏΡΠΈΠ±Π»ΠΈΠ·ΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΈΡ
ΡΠΎΠΏΠΎΡΡΠ°Π²ΠΈΡΡ ΠΏΠΎ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π·Π²ΠΈΡΠΈΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠ°Π½ΠΈΡ?
8.5 ΠΡΠ°ΠΏ 5: ΡΡΡΡΠΊΡΡΡΡ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ
ΠΠ΅ΡΡΠΈΡ
hoc5
ΠΎΠΏΡΠ°Π²Π΄ΡΠ²Π°Π΅Ρ Π²ΡΠ΅ Π·Π°ΡΡΠ°ΡΡ, ΡΠ²ΡΠ·Π°Π½Π½ΡΠ΅ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ΠΌ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°. Π Π½Π΅Π΅ Π΄ΠΎΠΏΡΡΡΠΈΠΌΠΎ Π²ΠΊΠ»ΡΡΠ°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ
if-else
Β ΠΈ
while
, Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ°ΠΌ ΡΠ·ΡΠΊΠ° Π‘ΠΈ, Π³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ Ρ ΠΏΠΎΠΌΠΎΡΡΡ
{
ΠΈ
}
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ
print
. ΠΠ½Π° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΠΏΠΎΠ»Π½ΡΠΉ Π½Π°Π±ΠΎΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ (
>
,
>=
, ΠΈ Ρ.Π΄.), Π° ΡΠ°ΠΊΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ
AND
,
OR
,
&&
ΠΈ
||
. (ΠΠ²Π΅ ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π½Π΅ Π³Π°ΡΠ°Π½ΡΠΈΡΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠ»Π΅Π²Π° Π½Π°ΠΏΡΠ°Π²ΠΎ, Ρ
ΠΎΡΡ ΡΠ°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ
ΠΎΠ΄ ΠΏΡΠΈΠ½ΡΡ Π² Π‘ΠΈ; Π²ΡΡΠΈΡΠ»ΡΡΡΡΡ ΠΎΠ±Π° ΡΡΠ»ΠΎΠ²ΠΈΡ, Π΄Π°ΠΆΠ΅ Π΅ΡΠ»ΠΈ Π² ΡΡΠΎΠΌ Π½Π΅Ρ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ.)
ΠΡΠ°ΠΌΠΌΠ°ΡΠΈΠΊΡ
hoc5
Π΄ΠΎΠΏΠΎΠ»Π½ΡΡΡ Π»Π΅ΠΊΡΠ΅ΠΌΡ, Π½Π΅ΡΠ΅ΡΠΌΠΈΠ½Π°Π»ΡΠ½ΡΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Ρ ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π° Π΄Π»Ρ
if
,
while
, ΡΠΈΠ³ΡΡΠ½ΡΡ
ΡΠΊΠΎΠ±ΠΎΠΊ ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠΉ. ΠΠΎΡΡΠΎΠΌΡ ΠΎΠ½Π° ΠΏΠΎΠ»ΡΡΠΈΠ»Π°ΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π±ΠΎΠ»ΡΡΠ΅, Π½ΠΎ Π½Π΅ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ»ΠΎΠΆΠ½Π΅Π΅ ΠΏΡΠ΅Π΄ΡΠ΄ΡΡΠΈΡ
Π²Π΅ΡΡΠΈΠΉ (Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π·Π° ΠΈΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ΠΌ ΠΏΡΠ°Π²ΠΈΠ» Π΄Π»Ρ
if
ΠΈ
while
):
$ cat hoc.y
%{
#include "hoc.h"
#define code2(c1,c2) code(c1); code(c2)
#define code3(c1,c2,c3) code(c1); code(c2); code(c3)
%}
%union {
Β Symbol *sym; /* symbol table pointer */
Β Inst *inst; /* machine instruction */
}