$ 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