2016-03-19 60 views
-1

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 
+0

lex kodunuza stdio.h eklediniz mi? – arved

cevap

0

için problem Bulunan ilgilenenler:

Aynı anda ben de yeni kurallar tanıştırmıştı yeni makefile yapılan fark olmadığını çıkıyor benim strdup kullanan lexer. Bu değişiklikleri bir linux bilgisayarında denedim. O zaman şimdi kendi bilgisayarımda minGW ile çalışarak makGile ile değil, dize dönüştürme problemleriyle bilinen minGW problemi yüzünden başarısız oldu.