ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° hoc3 ΡΠ°Π·ΠΌΠ΅ΡΠ°Π΅ΡΡΡ Π½Π΅ Π² ΠΎΠ΄Π½ΠΎΠΌ, Π° Π² ΠΏΡΡΠΈ ΡΠ°ΠΉΠ»Π°Ρ , makefile ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ»ΠΎΠΆΠ½ΡΠΌ:
$ cat makefile
YFLAGS = -d # force creation of y.tab.h
OBJS = hoc.o init.o math.o symbol.o # abbreviation
hoc3: $(OBJS)
cc $(OBJS) -lm -o hoc3
hoc.o: hoc.h
init.o symbol.o: hoc.h y.tab.h
pr:
@pr hoc.y hoc.h init.c math.c symbol.c makefile
clean:
rm -f $(OBJS) y.tab.[ch]
$
Π‘ΡΡΠΎΠΊΠ° YFLAGS = -d Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅Ρ ΡΠ»Π°Π³ -d Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΡ ΡΡΡΠΎΠΊΡ Π·Π°ΠΏΡΡΠΊΠ° yacc, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΡ make. ΠΡΠΎΡ ΡΠ»Π°Π³ ΠΏΡΠ΅Π΄ΠΏΠΈΡΡΠ²Π°Π΅Ρ yacc ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» y.tab.h, ΡΠΎΠ΄Π΅ΡΠΆΠ°ΡΠΈΠΉ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΡ #define. Π‘ΡΡΠΎΠΊΠ° OBJS = ... Π²Π²ΠΎΠ΄ΠΈΡ ΡΠΎΠΊΡΠ°ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ Π·Π°ΠΏΠΈΡΠΈ ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΠΎΠΉ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·. Π‘ΠΈΠ½ΡΠ°ΠΊΡΠΈΡ Π·Π΄Π΅ΡΡ Π½Π΅ ΡΠ°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΡΠΊΠΎΠ±ΠΊΠΈ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½Ρ. Π€Π»Π°Π³ -lm ΡΠΊΠ°Π·ΡΠ²Π°Π΅Ρ, ΡΡΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΊΠ°ΡΡ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ΅ libm.a.
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° hoc3 ΠΎΠ±ΡΠ°Π·ΡΠ΅ΡΡΡ ΠΈΠ· ΡΠ΅ΡΡΡΠ΅Ρ ΡΠ°ΠΉΠ»ΠΎΠ² .ΠΎ, ΠΏΡΠΈΡΠ΅ΠΌ Π½Π΅ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠ· Π½ΠΈΡ Π² ΡΠ²ΠΎΡ ΠΎΡΠ΅ΡΠ΅Π΄Ρ Π·Π°Π²ΠΈΡΡΡ ΠΎΡ ΡΠ°ΠΉΠ»ΠΎΠ² .h. "ΠΠ½Π°Ρ" ΡΡΠΈ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, make ΠΌΠΎΠΆΠ΅Ρ ΡΠ°ΡΡΡΠΈΡΠ°ΡΡ, ΠΊΠ°ΠΊΠ°Ρ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΡ Π² ΡΠ»ΡΡΠ°Π΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π»ΡΠ±ΠΎΠ³ΠΎ ΠΈΠ· ΡΠΊΠ°Π·Π°Π½Π½ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ². ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ Π²ΡΡΡΠ½ΠΈΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡ make, Π½Π΅ Π·Π°ΠΏΡΡΠΊΠ°Ρ ΠΏΡΠΎΡΠ΅ΡΡ, ΡΠΎ ΠΏΠΎΠΏΡΠΎΠ±ΡΠΉΡΠ΅ Π²Π²Π΅ΡΡΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ
$ make -n
Π‘ Π΄ΡΡΠ³ΠΎΠΉ ΡΡΠΎΡΠΎΠ½Ρ, Π΅ΡΠ»ΠΈ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΡΡ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΡΠΎΠ³Π»Π°ΡΠΎΠ²Π°Π½Π½ΠΎΡΡΡ ΡΠ°ΠΉΠ»ΠΎΠ², Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ»Π°Π³Π° -t (touch ΠΈΡΠΏΡΠ°Π²ΠΈΡΡ) Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΊΠ°ΠΊ Π±Ρ ΠΌΠΎΠ΄ΠΈΡΠΈΡΠΈΡΠΎΠ²Π°ΡΡ ΡΠ°ΠΉΠ»Ρ, Π½Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄Ρ ΠΏΠ΅ΡΠ΅ΡΡΠ°Π½ΡΠ»ΡΡΠΈΠΈ.
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΡΠΎ, ΡΡΠΎ ΠΌΡ Π²Π²Π΅Π»ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΡΡ ΠΎΠ΄Π½ΡΠΌΠΈ ΡΠ°ΠΉΠ»Π°ΠΌΠΈ, Π½ΠΎ ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΡΡ ΠΏΡΠΎΡΠ΅Π΄ΡΡ, ΡΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠΈΡΠΎΠ²Π°Π² ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅. ΠΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° make Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅, ΡΠΊΠ°Π·Π°Π½Π½ΠΎΠ΅ Π² ΡΠ°ΠΉΠ»Π΅ makefile. ΠΠ΄Π½Π°ΠΊΠΎ Π΅ΡΠ»ΠΈ Π½Π° ΠΏΠ΅ΡΠ²ΠΎΠΌ ΠΌΠ΅ΡΡΠ΅ ΠΎΠΊΠ°ΠΆΠ΅ΡΡΡ ΡΠ»Π΅ΠΌΠ΅Π½Ρ, ΠΏΠΎΠΌΠ΅ΡΠ°ΡΡΠΈΠΉ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ, ΡΠ°ΠΊΠΎΠΉ, ΠΊΠ°ΠΊ symbol.o ΠΈΠ»ΠΈ pr, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ Π±ΡΠ΄Π΅Ρ ΠΎΠ½. Π‘ΡΠΈΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π² ΡΠ»ΡΡΠ°Π΅ "ΠΏΡΡΡΠΎΠΉ" Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π²ΡΠ΅Π³Π΄Π° Π±Π΅ΡΠ΅ΡΡΡ Π½Π΅ ΠΈΠ· ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅ΠΉ Π²Π΅ΡΡΠΈΠΈ, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΎΠ½ ΠΎΠ±ΡΠ·Π°ΡΠ΅Π»ΡΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΠΌΠ΅Π½ΡΡΡΡΡ. ΠΡΠ°ΠΊ,
$ make pr | lpr
ΠΈΠ½ΠΈΡΠΈΠΈΡΡΠ΅Ρ ΡΠ°ΡΠΏΠ΅ΡΠ°ΡΠΊΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π° ΠΏΡΠΈΠ½ΡΠ΅ΡΠ΅. (ΠΠΎΡΠ²Π»Π΅Π½ΠΈΠ΅ ΡΠΈΠΌΠ²ΠΎΠ»Π° @ Π² "@pr" ΠΏΠΎΠ΄Π°Π²Π»ΡΠ΅Ρ ΡΡ ΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°ΠΏΡΡΠ΅Π½Π½ΠΎΠΉ Ρ ΠΏΠΎΠΌΠΎΡΡΡ make.) ΠΠΎΠΌΠ°Π½Π΄Π° ΠΆΠ΅
make clean
ΡΠ΄Π°Π»ΡΠ΅Ρ Π²ΡΡ ΠΎΠ΄Π½ΡΠ΅ ΡΠ°ΠΉΠ»Ρ yacc, Π° ΡΠ°ΠΊΠΆΠ΅ ΡΠ°ΠΉΠ»Ρ .o.
Π’Π°ΠΊΠΎΠΉ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌ ΠΏΡΡΡΡΡ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠ΅ΠΉ Π² ΡΠ°ΠΉΠ»Π΅ makefile ΡΠ°ΡΡΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΏΡΠ΅Π΄ΠΏΠΎΡΡΠΈΡΠ΅Π»ΡΠ½ΡΠΌ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠΌ ΠΊΠ°ΠΊ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π΄Π»Ρ ΠΊΠΎΠ½ΡΠ΅Π½ΡΡΠ°ΡΠΈΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΡΠ°ΠΉΠ»Π΅ Π²ΡΠ΅Ρ ΡΠ²ΡΠ·Π°Π½Π½ΡΡ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ. ΠΠ±Π»Π°ΡΡΡ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ make Π½Π΅ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΎΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΡΠ³ΡΡΠΏΠΏΠΈΡΠΎΠ²Π°ΡΡ Π² Π΅Π΄ΠΈΠ½ΡΠΉ Π½Π°Π±ΠΎΡ Π²ΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΠΈΠΌΠ΅ΡΡΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΠΈ.
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π·Π°ΠΌΠ΅ΡΠ°Π½ΠΈΠΉ ΠΎΡΠ½ΠΎΡΠΈΡΠ΅Π»ΡΠ½ΠΎ lexΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lex ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ Π°Π½Π°Π»ΠΎΠ³ΠΈΡΠ½ΠΎ ΡΠΎΠΌΡ, ΠΊΠ°ΠΊ yacc Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π³ΡΠ°ΠΌΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ ΡΠ°Π·Π±ΠΎΡΠ°: Π²Ρ ΡΠΎΠ·Π΄Π°Π΅ΡΠ΅ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ ΠΏΡΠ°Π²ΠΈΠ» Π²Π°ΡΠ΅Π³ΠΎ ΡΠ·ΡΠΊΠ° Ρ ΠΏΠΎΠΌΠΎΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΡ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΎΠ² Π‘ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ, ΠΊΠΎΡΠΎΡΡΠ΅ Π±ΡΠ΄ΡΡ Π²ΡΠΏΠΎΠ»Π½ΡΡΡΡΡ ΠΏΡΠΈ ΠΎΠ±Π½Π°ΡΡΠΆΠ΅Π½ΠΈΠΈ ΡΡΡΠΎΠΊΠΈ, ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΉ ΡΠ°Π±Π»ΠΎΠ½Ρ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° lex ΡΡΡΠΎΠΈΡ ΠΏΠΎ ΡΡΠΎΠΉ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»Ρ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lex ΠΈ yacc Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΡΡΡ ΡΠ°ΠΊΠΈΠΌ ΠΆΠ΅ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΈ ΠΎΠΏΠΈΡΠ°Π½Π½ΡΠ΅ Π²ΡΡΠ΅ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠ΅ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΡ. ΠΡ Π½Π΅ ΡΠΎΠ±ΠΈΡΠ°Π΅ΠΌΡΡ Π·Π΄Π΅ΡΡ Π΄Π΅ΡΠ°Π»ΡΠ½ΠΎ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ lex; Π½Π°ΡΠ° ΡΠ΅Π»Ρ β Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΎΠ²Π°ΡΡ Π²Π°Ρ, Π° ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π²Ρ Π½Π°ΠΉΠ΄Π΅ΡΠ΅ Π² ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΌ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Π΅ ΠΏΠΎ UNIX (ΡΠΎΠΌ 2B).
ΠΠ½Π°ΡΠ°Π»Π΅ ΠΏΡΠΈΠ²Π΅Π΄Π΅ΠΌ lex-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° lex.l, ΠΊΠΎΡΠΎΡΠ°Ρ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΠΏΡΠΈΠΌΠ΅Π½ΡΠ²ΡΡΡΡΡ Π΄ΠΎ ΡΠΈΡ ΠΏΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ yylex:
$ cat lex.l
%{
#include "hoc.h"
#include "y.tab.h"
extern int lineno;
%}
%%
[ \t] { ; } /* skip blanks and tabs */
[0-9]+\.?][0-9]*\.[0-9]+ {
sscanf(yytext, "%lf", &yylval.val);
return NUMBER;
}
[a-zA-Z][a-zA-Z0-9]* {
Symbol *s;
if ((s=lookup(yytext)) == 0)
s = install(yytext, UNDEF, 0.0);
yylval.sym = s;
return s->type == UNDEF ? VAR : s->type;
}
\n { lineno++; return '\n'; }
/* everything else */
. { return yytext[0]; }
$
ΠΠ°ΠΆΠ΄ΠΎΠ΅ "ΠΏΡΠ°Π²ΠΈΠ»ΠΎ" ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ΅Π³ΡΠ»ΡΡΠ½ΡΠΌ Π²ΡΡΠ°ΠΆΠ΅Π½ΠΈΠ΅ΠΌ, ΠΊΠ°ΠΊ ΠΈ ΡΠ΅, ΡΡΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈΡΡ Π² egrep ΠΈΠ»ΠΈ awk, ΠΎΠ΄Π½Π°ΠΊΠΎ Π² ΠΎΡΠ»ΠΈΡΠΈΠ΅ ΠΎΡ Π½ΠΈΡ lex ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π΅Ρ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°ΡΠΈΠΈ Π² ΡΡΠΈΠ»Π΅ Π‘ΠΈ ΡΠΈΠΏΠ° \t ΠΈ \n. ΠΠ΅ΠΉΡΡΠ²ΠΈΠ΅ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠΈΠ³ΡΡΠ½ΡΠ΅ ΡΠΊΠΎΠ±ΠΊΠΈ. ΠΡΠ°Π²ΠΈΠ»Π° ΠΏΡΠΎΠ²Π΅ΡΡΡΡΡΡ ΠΏΠΎ ΠΏΠΎΡΡΠ΄ΠΊΡ, Π° ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΈΠΈ Ρ ΡΠΈΠΌΠ²ΠΎΠ»Π°ΠΌΠΈ * ΠΈ + Π·Π°Π΄Π°ΡΡ ΡΠΊΠΎΠ»Ρ ΡΠ³ΠΎΠ΄Π½ΠΎ Π΄Π»ΠΈΠ½Π½ΡΡ ΡΡΡΠΎΠΊΡ. ΠΡΠ»ΠΈ ΠΏΡΠ°Π²ΠΈΠ»ΠΎ ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌΠΎ ΠΊ ΡΠ΅ΠΊΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ°, ΡΠΎ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅. Π‘ΠΎΠ²ΠΏΠ°Π²ΡΠ°Ρ Ρ ΠΏΡΠ°Π²ΠΈΠ»ΠΎΠΌ Π²Ρ ΠΎΠ΄Π½Π°Ρ ΡΡΡΠΎΠΊΠ° Π΄ΠΎΡΡΡΠΏΠ½Π° Π² lex-ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ΅ ΠΏΠΎΠ΄ ΠΈΠΌΠ΅Π½Π΅ΠΌ yytext. Π§ΡΠΎΠ±Ρ ΡΠ°Π±ΠΎΡΠ°ΡΡ Π² lex, Π½ΡΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΡΠ°ΠΉΠ» makefile: ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° make
$ cat makefile
YFLAGS = -d
OBJS = hoc.o lex.o init.o math.o symbol.o
hoc3: $(OBJS)
cc $(OBJS) -lm -ll -o hoc3
hoc.o: hoc.h
lex.o init.o symbol.o: hoc.h y.tab.h
...
$
"Π·Π½Π°Π΅Ρ", ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡΡΠΈΡΡ ΠΈΠ· ΡΠ°ΠΉΠ»Π° .l Π½Π°ΡΡΠΎΡΡΠΈΠΉ ΡΠ°ΠΉΠ» .o; Π²ΡΠ΅, ΡΡΠΎ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ ΠΎΡ Π½Π°Ρ, Π΄Π°ΡΡ Π΅ΠΉ ΡΠ²Π΅Π΄Π΅Π½ΠΈΡ ΠΎ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡΡ . (ΠΡΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΡ lex -ll ΠΊ ΡΠΏΠΈΡΠΊΡ ΠΊΠ°ΡΠ°Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡΠΎΡΡΡ Π²Π΅Π΄Π΅Ρ ΠΏΠΎΠΈΡΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π° ΡΡ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»Ρ, ΡΠΎΠ·Π΄Π°Π²Π°Π΅ΠΌΡΠΉ lex, Π½ΡΠΆΠ΄Π°Π΅ΡΡΡ Π² Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ ΡΡΠ½ΠΊΡΠΈΡΡ .) ΠΡΡΠ΅ΠΊΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΡΡΡ Π²Π΅ΡΡΠΌΠ° ΠΎΡΡΡΠΈΠΌΡΠΌ, ΠΏΡΠΈΡΠ΅ΠΌ ΡΠΎΠ²Π΅ΡΡΠ΅Π½Π½ΠΎ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ:
$ make
yacc -d hoc.y
conflicts: 1 shift/reduce
ΡΡ -Ρ y.tab.c
rm y.tab.c
mv y.tab.o hoc.o
lex lex.l
ΡΡ -Ρ lex.yy.c
rm lex.yy.c
mv lex.yy.o lex.o
ΡΡ -c init.c
ΡΡ -c math.c
ΡΡ -c symbol.c
cc hoc.o lex.o init.o math.o symbol.o -lm -ll -o hoc3
$
ΠΡΠ»ΠΈ ΠΎΠ΄ΠΈΠ½ ΡΠ°ΠΉΠ» ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡΡ, Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π΅Π΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Ρ make Π΄Π»Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡ Π΄Π΅ΠΉΡΡΠ²ΡΡΡΠ΅ΠΉ Π²Π΅ΡΡΠΈΠΈ:
$ touch lex.l Π‘ΠΌΠ΅Π½Π° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠ°ΠΉΠ»Π° lex.l
$ make
lex lex.l
cc -Ρ lex.yy.c
rm lex.yy.c
mv lex.yy.o lex.o
cc hoc.o lex.o init.o math.o symbol.o -ll -lm -o hoc3
$
ΠΠ΅ΠΊΠΎΡΠΎΡΠΎΠ΅ Π²ΡΠ΅ΠΌΡ ΠΌΡ Π΄Π΅Π±Π°ΡΠΈΡΠΎΠ²Π°Π»ΠΈ ΠΎ ΡΠΎΠΌ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΡΡΠΈΡΠ°ΡΡ ΠΎΠ±ΡΡΠΆΠ΄Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ lex ΠΎΡΡΡΡΠΏΠ»Π΅Π½ΠΈΠ΅ΠΌ ΠΎΡ Π½Π°ΡΠ΅ΠΉ ΡΠ΅ΠΌΡ ΠΈ ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΡ Π΅Π΅ ΠΊΡΠ°ΡΠΊΠΎ, Π° Π·Π°ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ΅ΠΉΡΠΈ ΠΊ Π΄ΡΡΠ³ΠΈΠΌ Π²ΠΎΠΏΡΠΎΡΠ°ΠΌ ΠΈΠ»ΠΈ ΡΠ°ΡΡΠΌΠ°ΡΡΠΈΠ²Π°ΡΡ Π΅Π΅ ΠΊΠ°ΠΊ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ΅ ΡΡΠ΅Π΄ΡΡΠ²ΠΎ Π΄Π»Ρ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠΎΠ³Π΄Π° ΡΠ·ΡΠΊ ΡΡΠ°Π½ΠΎΠ²ΠΈΡΡΡ ΡΠ»ΠΈΡΠΊΠΎΠΌ ΡΠ»ΠΎΠΆΠ½ΡΠΌ. Π£ Π½Π°Ρ Π±ΡΠ»ΠΈ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΡ "Π·Π°" ΠΈ "ΠΏΡΠΎΡΠΈΠ²". ΠΠ°ΡΡΡΠ΄Π½Π΅Π½ΠΈΡ Π² ΡΠ°Π±ΠΎΡΠ΅ Ρ lex (ΠΏΠΎΠΌΠΈΠΌΠΎ ΡΠΎΠ³ΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠ·ΡΡΠΈΡΡ Π΅ΡΠ΅ ΠΎΠ΄ΠΈΠ½ ΡΠ·ΡΠΊ) ΡΠ²ΡΠ·Π°Π½Ρ Ρ ΡΠ΅ΠΌ, ΡΡΠΎ Π·Π°ΠΌΠ΅Π΄Π»ΡΠ΅ΡΡΡ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, Π° ΡΠ°ΡΠΏΠΎΠ·Π½Π°Π²Π°ΡΠ΅Π»ΠΈ ΠΎΠΊΠ°Π·ΡΠ²Π°ΡΡΡΡ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠ΅ΠΌΠ½ΡΠΌΠΈ ΠΈ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΡΠΌΠΈ, ΡΠ΅ΠΌ ΡΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½ΡΠ½ΡΠ΅ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΡΠ·ΡΠΊΠ΅ Π‘ΠΈ. Π ΡΠΎΠΌΡ ΠΆΠ΅ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡΡ ΡΡΡΠ΄Π½ΠΎΡΡΠΈ Ρ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΎΠΌ Π²Π²ΠΎΠ΄Π° Π² Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΠΎΡΠΎΠ±ΡΡ ΡΠ»ΡΡΠ°ΡΡ , ΡΠ°ΠΊΠΈΡ , ΠΊΠ°ΠΊ Π²ΠΎΡΡΡΠ°Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΠ»Π΅ ΠΎΡΠΈΠ±ΠΊΠΈ, Π° ΡΠ°ΠΊΠΆΠ΅ Ρ Π²Π²ΠΎΠ΄ΠΎΠΌ ΠΈΠ· ΡΠ°ΠΉΠ»Π°. ΠΠΈ ΠΎΠ΄Π½Π° ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΠΏΡΠΎΠ±Π»Π΅ΠΌ Π½Π΅ ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π½ΠΎΠΉ Π΄Π»Ρ hoc. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΈΠ·-Π·Π° ΠΎΠ³ΡΠ°Π½ΠΈΡΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΌΠ° ΠΊΠ½ΠΈΠ³ΠΈ ΠΌΡ Π²ΡΠ½ΡΠΆΠ΄Π΅Π½Ρ Π²Π΅ΡΠ½ΡΡΡΡΡ Π² ΠΏΠΎΡΠ»Π΅Π΄ΡΡΡΠΈΡ Π»Π΅ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΡ Π°Π½Π°Π»ΠΈΠ·Π°ΡΠΎΡΠ°Ρ ΠΊ Π‘ΠΈ. ΠΠ΄Π½Π°ΠΊΠΎ ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ Ρ lex Π±ΡΠ΄Π΅Ρ Π΄Π»Ρ Π²Π°Ρ Ρ ΠΎΡΠΎΡΠ΅ΠΉ ΠΏΡΠ°ΠΊΡΠΈΠΊΠΎΠΉ.
Π£ΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ 8.9Π‘ΡΠ°Π²Π½ΠΈΡΠ΅ ΡΠ°Π·ΠΌΠ΅ΡΡ Π΄Π²ΡΡ Π²Π΅ΡΡΠΈΠΉ hoc3. ΠΠΎΠ΄ΡΠΊΠ°Π·ΠΊΠ°: ΠΎΠ±ΡΠ°ΡΠΈΡΠ΅ΡΡ ΠΊ ΡΠΏΡΠ°Π²ΠΎΡΠ½ΠΎΠΌΡ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²Ρ ΠΏΠΎ size(1).
8.4 ΠΡΠ°ΠΏ 4: ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΈΡ Π½Π° ΠΌΠ°ΡΠΈΠ½Ρ
ΠΡ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ°Π΅ΠΌΡΡ ΠΊ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ hoc5 β ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ° ΡΠ·ΡΠΊΠ° ΡΠΎ ΡΡΡΡΠΊΡΡΡΠ°ΠΌΠΈ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΡ. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° hoc4 ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠΌΠ΅ΠΆΡΡΠΎΡΠ½ΡΠΌ Π·Π²Π΅Π½ΠΎΠΌ: ΠΎΠ½Π° ΠΈΠΌΠ΅Π΅Ρ ΡΠ΅ ΠΆΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ, ΡΡΠΎ ΠΈ hoc3, Π½ΠΎ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅ΡΡΡ Π½Π° Π±Π°Π·Π΅ ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠ°, ΠΊΠ°ΠΊ hoc5. ΠΡ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ ΡΠ°ΠΊΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ hoc4 ΠΈ Π² ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠΌΠΈ, ΡΡΠΎ ΡΠ΅Π½Π½ΠΎ Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ. ΠΠΎ ΠΌΠ΅ΡΠ΅ ΡΠ°Π·Π±ΠΎΡΠ° Π²Ρ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΎΠΊΠ° hoc4 ΠΏΠΎΡΠΎΠΆΠ΄Π°Π΅Ρ ΠΊΠΎΠ΄, ΡΠ°ΡΡΡΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° ΠΏΡΠΎΡΡΡΡ ΠΌΠ°ΡΠΈΠ½Ρ, Π° Π½Π΅ Π²ΡΠ΄Π°Π΅Ρ ΡΡΠ°Π·Ρ ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ. ΠΡΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½ΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡΠ° Π±ΡΠ΄Π΅Ρ Π²ΡΠΏΠΎΠ»Π½Π΅Π½ ΠΊΠΎΠ΄, ΠΏΠΎΡΠΎΠΆΠ΄Π΅Π½Π½ΡΠΉ Π΄Π»Ρ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Π½ΡΠΆΠ½ΠΎΠ³ΠΎ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ° (Ρ.Π΅. ΠΏΡΠΎΠΈΠ·ΠΎΠΉΠ΄Π΅Ρ "ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΈΡ").
ΠΠΎΠ΄ ΠΏΡΠΎΡΡΠΎΠΉ ΠΌΠ°ΡΠΈΠ½ΠΎΠΉ Π·Π΄Π΅ΡΡ ΠΏΠΎΠ΄ΡΠ°Π·ΡΠΌΠ΅Π²Π°Π΅ΡΡΡ ΡΡΠ΅ΠΊΠΎΠ²Π°Ρ ΠΌΠ°ΡΠΈΠ½Π°: ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΠΏΠ΅ΡΠ°Π½Π΄, ΠΎΠ½ Π·Π°Π½ΠΎΡΠΈΡΡΡ Π² ΡΡΠ΅ΠΊ, ΡΠΎΡΠ½Π΅Π΅, ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΠΊΠΎΠΌΠ°Π½Π΄Ρ, Π·Π°Π½ΠΎΡΡΡΠΈΠ΅ ΠΎΠΏΠ΅ΡΠ°Π½Π΄ Π² ΡΡΠ΅ΠΊ). ΠΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ Π½Π°Π΄ ΠΎΠΏΠ΅ΡΠ°Π½Π΄Π°ΠΌΠΈ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΡΡ Π² Π²Π΅ΡΡΠΈΠ½Π΅ ΡΡΠ΅ΠΊΠ°. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΏΡΠΈΡΠ²Π°ΠΈΠ²Π°Π½ΠΈΡ
x=2*y
ΡΠΎΠ·Π΄Π°ΡΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ:
constpush ΠΠ°ΠΏΠΈΡΠ°ΡΡ Π² ΡΡΠ΅ΠΊ: ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ° β¦ ΠΊΠΎΠ½ΡΡΠ°Π½ΡΠ°2
2
varpush ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½ Π² ΡΡΠ΅ΠΊ
y β¦ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ
eval ΠΡΡΠΈΡΠ»ΠΈΡΡ: Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ
mul ΠΠ΅ΡΠ΅ΠΌΠ½ΠΎΠΆΠΈΡΡ Π΄Π²Π° Π²Π΅ΡΡ Π½ΠΈΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ°; ΡΠ΅Π·ΡΠ»ΡΡΠ°Ρ Π·Π°ΠΌΠ΅Π½ΡΠ΅Ρ ΠΈΡ
varpush ΠΠ°ΠΏΠΈΡΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π½Π° ΡΠ°Π±Π»ΠΈΡΡ ΠΈΠΌΠ΅Π½ Π² ΡΡΠ΅ΠΊ
x β¦ Π΄Π»Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΠΎΠΉ x
assign ΠΠ°ΠΏΠΈΡΠ°ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π² ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ, ΡΠ±ΡΠ°ΡΡ ΡΠΊΠ°Π·Π°ΡΠ΅Π»Ρ