-1

私は Bison と Flex を使用してコンパイラを作成しており、最近までmake allターゲットを使用して作業してきました (あまり良いアイデアではないことはわかっています)。現在、ディレクトリ構造を作り直し、makefile を適切に作り直しています。現在私は持っています:

/コンパイラ

--- /src

---------- c_parser.y

---------- c_lexer.l

---------- AST.cpp

---------- AST.h

---------- Context.cpp

---------- Context.h

- - /置き場

bin/c_codegenAST、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フラグを使用しようとしましたが、機能しませんでした。完全なメイク ファイルは次のとおりです。

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

興味のある人のために問題を見つけました:

新しいメイクファイルを作成すると同時に、 を使用するレクサーに新しいルールを導入していたことに気付いていなかったことが判明しましたstrdup。Linuxコンピューターでこの変更を試しました。次に、自分のコンピューターで minGW を使用して作業すると、makefile ではなく、文字列変換の問題を伴う minGW の既知の問題が原因で失敗しました。

于 2016-03-19T17:49:57.730 に答える