私は Bison と Flex を使用してコンパイラを作成しており、最近までmake all
ターゲットを使用して作業してきました (あまり良いアイデアではないことはわかっています)。現在、ディレクトリ構造を作り直し、makefile を適切に作り直しています。現在私は持っています:
/コンパイラ
--- /src
---------- c_parser.y
---------- c_lexer.l
---------- AST.cpp
---------- AST.h
---------- Context.cpp
---------- Context.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
フラグを使用しようとしましたが、機能しませんでした。完全なメイク ファイルは次のとおりです。
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