我正在使用 Bison 和 Flex 编写编译器,并且直到最近一直在使用make all
目标(我知道这不是一个好主意)。我现在正在重新制作我的目录结构并正确地重新制作 makefile。目前我有:
/编译器
--- /src
---------- c_parser.y
---------- c_lexer.l
---------- AST.cpp
---------- AST.h
---------- 上下文.cpp
---------- 上下文.h
- - /垃圾桶
我想获得bin/c_codegen
取决于 AST、Context 以及 bison 和 flex ( c_parser.tab.c c_parser.tab.h c_lexer.yy.c
) 的输出。但是 c_lexer.yy.c 还取决于在目录c_parser.tab.h
中创建的内容src/
。这会在规则中引发未声明函数(在 c_parser.tab.h 中声明)的错误:
bin/lex.yy.o: src/lex.yy.c src/c_parser.tab.h
g++ -std=c++11 -w -I ./src -c -o bin/lex.yy.o src/lex.yy.c
错误:
src/lex.yy.c: In function 'void yy_init_buffer(YY_BUFFER_STATE, FILE*)':
src/lex.yy.c:1690:59: error: 'fileno' was not declared in this scope
b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0;
我相信这与搜索头文件有关,因此尝试使用该-I
标志但它不起作用。完整的make文件是:
bin/c_codegen: bin/lex.yy.o bin/c_parser.tab.o bin/AST.o bin/context.o
g++ -std=c++11 -w -I ./src -o bin/c_codegen bin/lex.yy.o bin/c_parser.tab.o bin/AST.o bin/context.o
bin/lex.yy.o: src/lex.yy.c src/c_parser.tab.h
g++ -std=c++11 -w -I ./src -c -o bin/lex.yy.o src/lex.yy.c
bin/c_parser.tab.o: src/c_parser.tab.c src/c_parser.tab.h
g++ -std=c++11 -w -c -o bin/c_parser.tab.o src/c_parser.tab.c
bin/AST.o: src/AST.cpp src/AST.h
g++ -std=c++11 -w -c -o bin/AST.o src/AST.cpp
bin/context.o: src/context.cpp src/context.h
g++ -std=c++11 -w -c -o bin/context.o src/context.cpp
src/c_parser.tab.c src/c_parser.tab.h: src/c_parser.y
win_bison -d -o src/c_parser.tab.c -v src/c_parser.y
src/lex.yy.c: src/c_parser.tab.h
flex -o src/lex.yy.c src/c_lexer.l
all:
flex -o src/lex.yy.c src/c_lexer.l
win_bison -d -o src/c_parser.tab.c -v src/c_parser.y --warnings=none
g++ -std=c++11 -w -o bin/c_codegen src/lex.yy.c src/c_parser.tab.c src/AST.cpp src/context.cpp
clean:
rm -f src/lex.yy.c src/c_parser.tab.h src/c_parser.tab.c bin/*.o bin/c_codegen tmp_*.txt