• 締切済み

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]); %%

みんなの回答

回答No.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は関係ありません。

teo98
質問者

補足

複数箇所に文法上の誤りがあり、それらを修正することで、動作可能となりました。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

alloca.cを省いてコンパイルしたらどうなりますか? allocaはたいていのOSではlibcに入っていますので勝手にリンクされるはずです。

teo98
質問者

補足

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 で終了しました

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • flex+bisonで簡単なパーサ

     flexとbisonで簡単な設定ファイルパーサを作ろうと思ったのですが、bisonの方で書き出した$1,$2,...の値が変です。どこが悪いのでしょうか?ファイルが長くなって申し訳ありません。 # my.l(パターン部のみ) %% [=:]      yylval.str_value=yytext; return EQ; [^=:\t\n]+  yylval.str_value=yytext; return TOKEN; [ \t]+     yylval.str_value=yytext; return WS; \n       yylval.str_value=yytext; return CR; %% # my.y(非c宣言・規則部のみ) %union{  char *str_value; } %token EQ TOKEN CR WS %type <str_value> assign noeq_exp exp exp_l EQ TOKEN CR WS %%  input: /* empty */    | input line    ;  line: CR    |assign CR    ;  assign: noeq_exp EQ exp_l    {     printf("<assign>%s|%s|%s\n", $1, $2, $3);    }     ;  noeq_exp:TOKEN     |TOKEN WS     ;  exp: noeq_exp     |EQ     ;  exp_l: exp     |exp_l exp     ; %% これらから作成したパーサを実行すると、 aaa=111 という入力に対して、上のassignルールの箇所に対応した場所で、 Reducing stack by rule 5 (line 21): $1 = nterm noeq_exp () $2 = token EQ () $3 = nterm exp_l () <assign>aaa=111 |=111 |111 と出力されます。期待した出力は、 <assign>aaa|=|111 なのですが。。。

  • flex bisonの導入方法

    とりあえずflex2.5.35、bisonc++2.4.3というのものをダウンロードしてみたものの、どう扱えばいいのか分からず困りました。 「C++ bison」で検索してもマニュアルを読んでも、導入段階の記事がほとんど見つからず、私の頭では理解できませんでした。 (BNF等の組み方については詳しく載っているのですが) VisualStudioのC++で使いたいのですが、ダウンロードからコンパイル・実行までを解説して貰えないでしょうか。

  • yaccのコンパイル法

    Bisonを実行して出力されたPekePeke_Tab.c をコンパイル(ボーランドを使用)すると、_yyerrorが未解決です のコメントが出てうまく行きません。 コマンドは bcc32 PekePeke_Tab.c libmain.obj です。 ライブラリの不足でしょうか? ちなみに Flex のコンパイルはうまく行きました。 bcc32 lex.yy.c libmain.obj libwrap.obj でOKでした。 yacc関連の書物やWEBなどは、yacc lex 本体の説明だけで、コンパイルの説明が皆無なので困っています。  

  • yaccとlexで、logや三角関数を含む電卓を作るプログラムの組み方

    今、yaccとlexで、logや三角関数を含む電卓を作るプログラムを作成しています。四則演算は実装できました。パイも実装できました。しかしlogや三角関数sin,cos,tanやabs,expなどがどうしても実装できません。以下のプログラムをlinux上のターミナルで実行しsin(90)やlog(90)どと入力しても、sintax errorと返されてしまいます。ちなみに実行時は-lmオプションは付けています。どうしたらこれらが実装できるのでしょうか。ご教授願えると幸いです。 ■yaccの.yファイル■ %{ #define YYSTYPE double #define PAICONST 3.14159265358979 #include <stdio.h> #include <math.h> double mcon=PAICONST/180.0; %} %token NL NUM LP RP END %left ADD SUB %left MUL DIV %left Pai Abs Sqrt Sin Cos Tan Log Exp NEG %% s : list ; list : /* empty */ | list expr NL { printf ("result: %lf\n", $2);} | list END { return;} ; expr : expr ADD expr {$$ = $1 + $3;} | expr SUB expr {$$ = $1 - $3;} | expr MUL expr {$$ = $1 * $3;} | expr DIV expr {$$ = $1 / $3;} | SUB expr %prec NEG {$$ = -$2;} | LP expr RP {$$ = $2;} | NUM {$$ = $1;} | Pai {$$=PAICONST;} | Abs "(" expr ")" {$$=abs($3);} | Sqrt "(" expr ")" {$$=sqrt($3);} | Sin "(" expr ")" {$$=sin($3*mcon);} | Cos "(" expr ")" {$$=cos($3*mcon);} | Tan "(" expr ")" {$$=tan($3*mcon);} | Log "(" expr ")" {$$=log($3);} | Exp "(" expr ")" {$$=exp($3);} ; %% yyerror(s) char *s; { printf ("%s\n",s);} main() { yyparse(); } #include "lex.yy.c" ■lexの.lファイル■ %{ #include <math.h> #include <ctype.h> %} %% "+" return (ADD); "-" return (SUB); "*" return (MUL); "/" return (DIV); "(" return (LP); ")" return (RP); "." return (END); (pai|PAI) return(Pai); (abs|ABS) return(Abs); (sqrt|SQRT) return(Sqrt); (sin|SIN) return(Sin); (cos|COS) return(Cos); (tan|TAN) return(Tan); (log|LOG) return(Log); (exp|EXP) return(Exp); [0-9]+\.[0-9]*|[0-9]+ { sscanf (yytext, "%lf", &yylval); return (NUM); } [ \t] ; ^\n return (END); \n return (NL); . return (yytext[0]); %%

  • Flexのコンパイルエラーについて

    Flexをコンパイルするとこのようなエラーになります。 原因がよくわからず悩んでいます。 解決方法を教えてください。よろしくお願いします。 C:\>mxmlc -source-path=./ flex/src/test.as Loading configuration file C:\flex\frameworks\flex-config.xml C:\flex\src\test.as: Error: A file found in a source-path must have the same package structure 'lex.src', as the definition's package, ''.

  • YaccとLex

    macのターミナルでYaccとLexのプログラムを実行しようと思っています。Yaccプログラム(ren.y)は bison -y ren.y の後 gcc y.tab.c -ly -o a.exe の後更に ./a.exe でしっかり実行できます。しかし、YaccとLexのプログラム(Yaccプログラムはren1.y、Lexプログラムはren2.l)において、bison -dv -y ren1.y の後、flex -l ren2.l までのコンパイルはできるのですが、gcc y.tab.c lex.yy.c -ly -lfl -lm -o a でコンパイルリンクしようとすると、 ld: library not found for -lfl clang: error: linker command failed with exit code 1 (use -v to see invocation) と表示されエラーが生じてしまいます。 macにはXcodeもインストールしてあります。 どうしてy.tab.cとlex.yy.cのコンパイルリンクと実行プログラムaの作成に失敗するのでしょうか?

  • lex、yaccファイルのコンパイラができません。このような警告がでます。足りないライブラリはなんでしょうか。

    lexとyaccを復習しているのですがこのサイト​http://cis.k.hosei.ac.jp/~nakata/lectureCompiler/YaccLex/6.2.html​の説明にあるサンプルを実行しようとしているのですがうまくいきません。 以下の作業で何が問題だと考えられるでしょうか。 sample.y sample.l のふたつのファイルを http://cis.k.hosei.ac.jp/~nakata/lectureCompiler/YaccLex/6.htmlのような手順でコンパイルしようとした結果 こうなってしまいます。 ----------------------実行結果-------------------------- ken@ubuntu-vm:~/ken/1$ yacc -d sample.y ken@ubuntu-vm:~/ken/1$ lex sample.l ken@ubuntu-vm:~/ken/1$ cc y.tab.c -ly -ll -o executablesample.y: In function ‘yyparse’: sample.y:8: 警告: incompatible implicit declaration of built-in function ‘printf’ ken@ubuntu-vm:~/ken/1$ -------------------------------------------------------- ------------------sample.yの内容---------------------- %token NL %token NUMBER %left ADDOP %% list: /* Empty */ | list expression NL {printf("%d\n",$2);} ; expression: expression ADDOP expression {$$=$1+$3;} | NUMBER {$$=$1;} ; %% #include "lex.yy.c" #include <stdio.h> /*追加してみましたが変わりませんでした。"stdio.h"にしてもダメでした*/ ----------------------------------------------------- -------------------sample.lの内容---------------------- %{ #include "y.tab.h" #include <stdio.h> /*追加してみましたが変わりませんでした"stdio.h"にしてもダメでした */ %} %% "+" return(ADDOP); [0-9]+ {sscanf(yytext,"%d",&yylval); return(NUMBER);} [ \t] ; \n|\r|\r\n return(NL); . return(yytext[0]); %% -------------------------------------------------------- #include が入ってないせいだと思い、上記のように追加してみたのですが見当違いなことをしているように思えます。ちなみにCでprintfを使うと普通にコンパイルできます。 必要なライブラリが入ってないのだとしたら何かわからず困っています。 最近VMwareでUbuntuは始めたばかりです。 パッケージは build-essentials yum liby-dev bison などをインストールしました。 何が足りないでしょうか。。すいません、お願いします。

  • C言語 "myfunc.h"がエラーになります。

    いつも大変お世話になっております。 C言語に関する質問です。 "myfunc.h"の箇所がコンパイルエラーになります。 全体のコードとコンパイルエラーが下記です。 #include <stdio.h> #include "myfunc.h" int main(void) { int num1, num2, ans; printf("1番目の整数を入力してください。\n"); scanf("%d", &num1); printf("2番目の整数を入力してください。\n"); scanf("%d", &num2); ans = max(num1, num2); printf("最大値は%dです。\n" , ans); return 0; } コンパイルエラー C:\MinGW>gcc text13.c -o text13 text13.c:2:20: fatal error: myfunc.h: No such file or directory #include "myfunc.h" ^ compilation terminated. です。 ご多忙のところ恐れ入ります。 どこがおかしいのか、 ご回答のほどよろしくお願い申し上げます。

  • Cygwin(gcc) lexライブラリ

    WindowsXPにCygwinのすべての項目をInstallにしてインストールして bison -d abc.y flex abc.l と実行し、 abc.tab.c , abc.tab.h , lex.yy.c ができた状態で gcc abc.tab.c -ll とした時 /user/lib/gcc/i686-pc-cygwin/3.4.4/../../../../i686-pc-cygwin/bin/ld: cannot find -ll collect2: ld returned 1 exit status とメッセージが表示されコンパイルできないでのですが gccには標準lexライブラリが無いのでしょうか? それとも別のことが原因なのでしょうか? このエラーの回避法、もしくは別のソフトなどでこれと同様のことができるなら教えてください。

  • Cプログラミング 初歩

    #include <stdio.h> int main (void){ double num; printf("実数を入力して下さい:"); scanf("%lf",&num); printf("あなたは%fと入力しましたね\n",num); return(0); } のプログラミングがコンパイル出来ません↓ printf("あなたは%fと入力しましたね\n",num); をprintf("%f\n",num);のようにすると上手くいくのですが、 どうしたらコンパイルできるか分かる人はいますか?