我正在使用Bison和Flex编写一个编译器,直到最近才使用make all
目标(我知道这不是一个好主意)。我现在正在重新构建我的目录结构并正确地重新构建makefile。目前我有:
/编译
--- / src
---------- c_parser.y
---------- c_lexer.l
---------- AST.cpp
---------- AST.h
---------- Context.cpp
---------- Context.h
--- / bin
我想获得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
答案 0 :(得分:0)
为有兴趣的人找到了问题:
事实证明我没有注意到,在我制作新的makefile的同时,我还在我的词法分析器中引入了使用strdup
的新规则。我在linux计算机上试过这个改变。然后现在使用minGW在我自己的计算机上工作,由于已知的minGW问题导致字符串转换问题,而不是使用makefile,因此失败了。