У вас есть прямой ответ на ваш вопрос от trojanfoe - вам нужно включить <stdio.h>
, чтобы объявить функцию printf()
. Это верно в любом исходном коде, представленном компилятору C.
Однако следует также отметить, что условный суффикс для источника Yacc равен .y
(вместо .yacc
), а для источника Lex - .l
(вместо .lex
). В частности, использование этих суффиксов означает, что make
будет знать, что делать с вашим исходным кодом, вместо необходимости вручную кодировать правила компиляции.
Данные файлы lex.l
и yacc.y
, make
компилируют их в объектный код, используя:
$ make lex.o yacc.o
rm -f lex.c
lex -t lex.l > lex.c
cc -O -std=c99 -Wall -Wextra -c -o lex.o lex.c
yacc yacc.y
mv -f y.tab.c yacc.c
cc -O -std=c99 -Wall -Wextra -c -o yacc.o yacc.c
rm lex.c yacc.c
$
Это каталог с make-файлом, который устанавливает CFLAGS = -O -std=c99 -Wall -Wextra
. (Это было в MacOS X 10.6.6.) Иногда вы увидите другие подобные правила; в частности, lex
генерирует файл lex.yy.c
по умолчанию (по крайней мере, в MacOS X), и вы часто будете видеть правило, такое как:
lex lex.l
mv lex.yy.c lex.c
cc -O -std=c99 -Wall -Wextra -c -o lex.o lex.c
Или даже:
lex lex.l
cc -O -std=c99 -Wall -Wextra -c -o lex.o lex.yy.c
Альтернативы легион; используйте make
, и все правильно.