• 締切済み

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 などをインストールしました。 何が足りないでしょうか。。すいません、お願いします。

  • Perl
  • 回答数1
  • ありがとう数2

みんなの回答

  • ssk38
  • ベストアンサー率44% (22/49)
回答No.1

警告だけなので、コンパイルできてますよ #include "lex.yy.c" #include <stdio.h> /*追加してみましたが変わりませんでした。"stdio.h"にしてもダメでした*/ ↓ 入れ替えてみるとか。 #include <stdio.h> #include "lex.yy.c" y.tab.c の中身をを貼ってください。

kengyaiji
質問者

お礼

すいません、なぜかできました。ありがとうございました

関連するQ&A

  • yacc,lexで作ったプログラムが正しく動きません。

    加減乗除ができ、平方根や常用対数を計算でき、PIが円周率3.14159265に変換される、負の数、浮動小数点数を扱える電卓のインタプリタ(数式を入力すると計算結果を表示して終了するプログラム)をyacc構文解析とlex字句解析を用いて以下のようにしました。 yacc %{ #include<stdio.h> #include<math.h> int yyerror(char* s); %} %union{ double num; } %type<num> E T F %token<num> NUM SQRT LOG10 PI %% program: E {printf("%lf\n", $1); } E : E'+'T {$$=$1+$3; } |E'-'T {$$=$1-$3; } |T {$$=$1; } ; T : T'*'F {$$=$1*$3; } |T'/'F {$$=$1/$3; } |F {$$=$1; } ; F : '('E')' {$$=$2; } |SQRT'('E')' {$$=sqrt($3); } |LOG10'('E')' {$$=log10($3); } |PI {$$=3.14159265; } |NUM {$$=$1; } |'-'F {$$=$2*(-1); } ; %% main(){ yyparse(); } yyerror(char* s){ fprintf(stderr, "%s\n", s); } lex %{ #include "j5_13y.h" %} D 0|1|2|3|4|5|6|7|8|9 DEZ 1|2|3|4|5|6|7|8|9 %% "+" {return *yytext; } "-" {return *yytext; } "*" {return *yytext; } "/" {return *yytext; } "(" {return *yytext; } ")" {return *yytext; } "sqrt" {return SQRT; } "log10" {return LOG10; } "PI" {return PI; } ({DEZ}{D}*|0)|({DEZ}{D}*|0).{D}* {yylval.num=atof(yytext); return NUM; } . {yyerror("invalid character"); exit(1); } %% int yywrap(){return 1; } コンパイルは通り、実行時エラーも出ません。 しかし、数式を入力してエンターキーを押すと、何も表示せず入力待ち状態が続き、ここでの入力は前の入力に連結されて処理されます。 (例)入力1.0+2.0(Enter)      ↓    改行して入力待ち状態      ↓    入力-log10(100.0)(Enter)      ↓    改行して入力待ち      ↓    入力+sqrt(4.0)(Enter)      ↓    改行して入力待ち      ↓    入力-2.0*PI(Enter)      ↓    改行して入力待ち      ↓    入力2.0-1.0      ↓    syntax error表示し終了 上記コードのどこが悪いのでしょうか。よろしくお願いします。

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

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

  • ファイル分割について

    今本をみながら練習中なのですが、ファイル分割がうまくいきません。以下のような3つのプログラムをかいたのですが実行できません。 (一つ目:myfunc.h) int max(int x,int y); (二つ目:myfunc.c) int max(int x,int y){ if(x > y) return x; else return y;} (三つ目:sample.c) #include <stdio.h> #include "myfunc.h" int main(void){ int x,y,c; printf("1番目の整数\n"); scanf("%d",&x); printf("2番目の整数\n"); scanf("%d",&y); c = max(x,y); printf("最大値は%d\n",c); return 0;} すべてコンパイルしてsample.cを実行してもだめでした。ご指導お願いします><

  • 静的ライブラリについて教えて下さい

    静的ライブラリについて教えて下さい。作成方法は大体わかったのですが、使い方と利用シーンがわかりません。例えば、 -main.c- #include <stdio.h> #include "abc.h" int main(){ a(); b(); c(); } -a.c- #include <stdio.h> void a(void){ printf("a\n"); } -b.c- #include <stdio.h> void b(void){ printf("b\n"); } -c.c- #include <stdio.h> void c(void){ printf("c\n"); } -abc.h- void a(void); void b(void); void c(void); というファイルを作成した上で以下のようにコンパイルしました。 gcc -c a.c gcc -c b.c gcc -c c.c これで、a.o, b.o, c.oというオブジェクトファイルが出来ました。 次にar rcs static a.o b.o c.oとコマンドを打ったところ、問題なくstaticという静的ライブラリと思われるファイルが出来ました。で、そもそもですがこの使い方がわかりません。main.cをコンパイルする際に使うのでしょうか?そもそも上で作成した静的ライブラリにはmain.oも含めるべきものでしょうか?初歩的な質問ですみません。宜しくお願いします。

  • 配列について

    初歩的な質問ですいませんが、質問よろしくお願いします。 ◎1----------------------------- #include<stdio.h> int main(void) { char ss[10]="AB"; printf("ss=%s\n",ss); return 0; } ------------------------------------ ◎2-------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss[0]='A'; ss[1]='B'; ss[2]=0; printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎3------------------------------- #include<stdio.h> #include<string.h> int main(void) { char ss[10]; strcpy(ss,"AB"); printf("ss=%s\n",ss); return 0; } ----------------------------------- ◎4------------------------------- #include<stdio.h> int main(void) { char ss[10]; ss="AB"; printf("ss=%s\n",ss); return 0; } ---------------------------------- 以上4つのプログラムで、◎2と◎3は正常に動くと理解できたのですが、何故、◎1は正常に動き、◎4は「'const char [3]' から 'char [10]' に変換できません。」といったようなエラーが出てしまうか分かりません。 教えていただければ嬉しいです。

  • C言語でヘッダファイルを自作する

    C言語で#defineを用いてヘッダファイルを作成したのですが、 作成したコンパイルするときにヘッダファイルがオープンできません。 参考にしている資料があるのですが、そこに書かれているサンプルプログラムを 丸ごとコピーして作ったプログラムも同様にヘッダファイルがオープンできない というエラーが出るので、ヘッダファイルを定義する方法そのものが間違っていると 思うのですが、どこが間違っているのでしょうか? よろしければ正しい記述方法もお教えください。 #include <stdio.h> #if !defined SAMPLE_H #define SAMPLE_H wa(int a, int b) { return a+b; } #endif #include "sample.h" int main(){ printf("%d\n",wa(40,70)); return 0; } ヘッダファイルの定義の方法は他にもあるとは思いますが、 今回は#defineを用いた方法でお願いします。

  • 標準ライブラリのcos関数の値がおかしいです。

    標準ライブラリのcos関数の値がおかしいです。 環境は OS:WindowsXP 言語:C++ 開発環境:Visual C++ ExpressiEdition です。 以下がサンプルコードです。 #include<iostream> #include<stdio.h> #include<math.h> int main(){ double y=cos(90.0 * 3.14159265358979323846264338327950288 / 180.0); printf("%lf\n",y); std::cout<<y<<std::endl; printf("%d\n",y*10); std::cout<<y*10<<std::endl; getchar(); return 0; } 上記のコードを実行すると、 0.000000 6.12323e-017 -1076268279 6.12323e-016 と出力されます。 本来なら、cos90の値は0ですから全て「0」と表示されると思うのですが・・・ 原因が分かる方がいらっしゃいましたら、教えていただけると助かります。

  • ヘッダファイルの2重のインクルードについて

    ある書物に「ヘッダファイルを複数回インクルードすると、それを”再定義”することによるエラーになる」と書いてありますたが、以下のようなヘッダファイルを作りそれを数回インクルードしても何ら異状が無くコンパイルできました。 math.h→ヘッダファイル名 #define max(a,b)  ((a)>(b)?(a):(b))→ヘッダファイルの内容 c ファイル #include<stdio.h> #include"math.h"←複数回インクルード #include"math.h"←複数回インクルード int main(void){ int x=1,y=2; printf("max(x,y)=%d\n",max(x,y)); return 0; } 環境としては、RedHat Linuxでviです。 何ゆえ、エラーにならないのか良く解りません。 宜しくお願いします。

  • 書いたプログラムの間違いを教えてください

    こんにちは。 C言語を学習し始めた者です。 入力した円をユーロとドルに替えるというプログラムで、下のように書きました。 しかし、実行結果が、何円でも、0.00ドル、0.00ユーロになってしまいます。 間違いを教えてください #include <stdio.h> main() { double Y,E,D; E=Y/132.12; D=Y/101.48; printf("金額(円)を入力せよ:",Y); scanf("%lf",&Y); printf("%lf円は%.2lfユーロになります。\n",Y,E); printf("米ドルでは、%.2lfドルです。\n",D); }

専門家に質問してみよう