-1

我正在使用 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
4

1 回答 1

0

为感兴趣的人找到了问题:

原来我没有注意到,在我制作新的 makefile 的同时,我还在我的词法分析器中引入了新的规则,使用strdup. 我曾在 linux 计算机上尝试过这种更改。然后现在在我自己的计算机上使用 minGW 工作失败,这是由于已知的 minGW 存在字符串转换问题而不是 makefile 问题。

于 2016-03-19T17:49:57.730 回答