締切り済みの質問
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"*/
%}
%tokenNUM
%%
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*/
\nreturn(0);/*logical EOF*/
.return(yytext[0]);
%%
投稿日時 - 2003-10-21 23:38:40
1人が「このQ&Aが役に立った」と投票しています
回答(2件中 1~2件目)
補足をよみました。
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は関係ありません。
投稿日時 - 2003-10-23 10:46:02
補足
複数箇所に文法上の誤りがあり、それらを修正することで、動作可能となりました。
投稿日時 - 2003-10-26 06:34:00
alloca.cを省いてコンパイルしたらどうなりますか?
allocaはたいていのOSではlibcに入っていますので勝手にリンクされるはずです。
投稿日時 - 2003-10-22 12:47:34
補足
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 で終了しました
投稿日時 - 2003-10-22 20:41:24
OKWaveのオススメ
おすすめリンク