- 締切済み
bison&flex
Linux上で、以下の記述を行い、一番最後に参照のFLEXのマニュアルにしたがって、コンパイルしてみたところ、alloca.cなどと言うファイルは存在しないとのエラーが出ました。bison単独では、コンパイルと実行とが可能なのですが、flexとの連携方法が分かりません。他のWeb上の例では、alloca.cなどを使ったコンパイル例も無いわけで、実際のところ、どのように変更すれば、コンパイル出来るようになるのか、追加のインクルードファイルなども含めて、教えてください。 bison -d parse.y flex -I parse.l gcc -o parse alloca.c parse.tab.c lex.yy.c Bisonの記述 %{ #define YYSTYPE double #include <stdio.h> /*#include "lex.yy.c"*/ %} %token NUM %% input: /* empty */ | input line ; line: '\n' | exp '\n' { printf("\t%.10g\n",$1);} ; exp: NUM {$$ = $1; } | exp exp '+' {$$ = $1 + $2; } | exp exp '-' {$$ = $1 - $2; } | exp exp '*' {$$ = $1 * $2; } | exp exp '/' {$$ = $1 / $2; } ; %% #include <ctype.h> /*yylex () { int c; while((c = getchar ()) == ' ' || c == '\t') ; if (c== '.' || isdigit(c)) { ungetc(c,stdin); scanf("%lf",&yylval); return NUM; } if(c == EOF) return 0; return c; } */ main() { yyparse(); } yyerror(s) char *s; { printf("%s\n",s); } FLEXの記述 %{ #include <stdio.h> #include "parse.tab.h" %} extern int yylval; %% [0-9]+ {yylval = atoi(yytext);return NUMBER; } [ \t] ; /*eat whitespace*/ \n return (0); /*logical EOF*/ . return (yytext[0]); %%
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- kaitou-man
- ベストアンサー率60% (86/141)
補足をよみました。 gcc -o parse.tab.c lex.yy.c ではなく、 gcc -o parse parse.tab.c lex.yy.c のつもりです。が、さらにflex用のライブラリも必要です。つまり gcc -o parse parse.tab.c lex.yy.c -lfl でないといけません。環境によっては最後は-llかもしれません。 あと、上記parse.lのNUMBERをNUMに変更しないといけません。私の環境では、それだけの修正で、 bison -d parse.y flex -I parse.l gcc -o parse parse.tab.c lex.yy.c -lfl で完全にコンパイルできました。これらのファイルはコピー&ペーストして、NUMを修正しただけです。 allocaは関係ありません。
- kaitou-man
- ベストアンサー率60% (86/141)
alloca.cを省いてコンパイルしたらどうなりますか? allocaはたいていのOSではlibcに入っていますので勝手にリンクされるはずです。
補足
alloca.c抜きのリンカの結果ですが、そもそも自分のgccには、alloca.cは存在しません。自分がbisonやflexのマニュアルのソースに追加した箇所に誤りがありそうですので、bisonの経験者からのアドバイスをお待ちしています。 [root@localhost root]# bison -d parse.y [root@localhost root]# flex parse.l [root@localhost root]# gcc -o parse.tab.c lex.yy.c /usr/lib/gcc-lib/i386-redhat-linux/3.2.2/../../../crt1.o(.text+0x18): In function `_start': ../sysdeps/i386/elf/start.S:77: undefined reference to `main' /tmp/cc9PGpfp.o(.text+0x1ec): In function `yylex': : undefined reference to `yylval' /tmp/cc9PGpfp.o(.text+0x33b): In function `yylex': : undefined reference to `yywrap' /tmp/cc9PGpfp.o(.text+0xa7b): In function `input': : undefined reference to `yywrap' collect2: ld はステータス 1 で終了しました
補足
複数箇所に文法上の誤りがあり、それらを修正することで、動作可能となりました。