Bison ve Flex kullanarak bir derleyici yazıyorum ve yakın bir zamana kadar make all
hedefiyle çalışıyorum (bir fikri iyi bilmiyorum). Şimdi dizin yapısını yeniden yapıyorum ve makefile yeniden uygun bir şekilde. Şu anda var:Bir makefile içinde bağlantı sorunu
/Derleyici
---/src
---------- c_parser.y
---------- c_lexer.l
---------- AST.cpp
---------- AST.h
--------- - Context.cpp
---------- Context.h
Ben AST, Bağlam ve bizon ve flex çıkışları bağlıdır bin/c_codegen
elde etmek istiyorum
---/bin (c_parser.tab.c c_parser.tab.h c_lexer.yy.c
). Ancak c_lexer.yy.c ayrıca src/
dizininde oluşturulan c_parser.tab.h
'a da bağlıdır. Bu kuralda, (c_parser.tab.h bildirilen) bildirilmemiş fonksiyonların hataları atıyor:
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
Hata:
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;
Bu başlığındaki ararken ile ilgisi var inan dosyaları ve dolayısıyla -I
bayrağı kullanarak çalıştı ama işe yaramadı. tam yapın dosyasıdır:
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
lex kodunuza stdio.h eklediniz mi? – arved