皆さんこんにちは。ユーマと申します。
長文失礼します。
いま、こちらのサイトを参考にして電卓をつくってみようかなと思い勉強していたところ、わからないことが出てきたので質問させてもらいました。
私はwindows10のコマンドプロンプトを用いて字句解析、構文解析、コンパイルをしようとしています。
なのでlexの代わりにflex,yaccの代わりにbisonを用いています。
またCコンパイラはMinGWを用いています。
flex,bisonはC:\Program Files (x86)\GnuWin32\にまとめておいてあり、MinGWはCドライブ直下に置いてあります。
環境変数にはC:\Program Files (x86)\GnuWin32\binとC:\MinGW\binを追加しました。
電卓のファイルを保存しているディレクトリに移動してから次のようにコマンドを入力しました。
1行目 : bison --yacc -dv mycalc.y
2行目 : flex mycalc.l
3行目 : gcc -o mycalc y.tab.c lex.yy.c
すると bison --yacc -dv mycalc.y では
m4: cannot open `Files': No such file or directory
m4: cannot open `(x86)\GnuWin32/share/bison': No such file or directory
m4: cannot open `C:\Program': No such file or directory
m4: cannot open `Files': No such file or directory
m4: cannot open `(x86)\GnuWin32/share/bison/m4sugar/m4sugar.m4': No such file or directory
m4_init()m
4m:4_de fine([b4_actions], c
(この下はおそらく自分が悩んでいる原因ではないと思いカットさせていただきました
もし必要であるならばまた貼らせていただきます。)
また二行目の flex mycalc.lでは
特に何も表示されなかったです。
最後に三行目の gcc -o mycalc y.tab.c lex.yy.c では
mycalc.l:3:19: fatal error: y.tab.h: No such file or directory
#include "y.tab.h"
^
compilation terminated.
と表示されました。
おそらくbisonの構文解析を行うところでおかしくなっていると思うのですが
これはどうしたら直るでしょうか?
また、コマンドラインへの入力一行目の出力のm4とは何なのでしょうか?
(しらべてもいまいちわかりませんでした)
分かりにくい文章ですみません。
何か必要な情報があれば追加させていただきます。
yacc/lexについて
Re: yacc/lexについて
エラーメッセージから考えられることは、C:\Program Files (x86) という
ディレクトリがスペースを含んでいるため、ファイルをオープンできない
ようです。GnuWin32 をスペースを含まないディレクトリに置いて、
環境変数PATH もそれに合わせて設定してみてはいかがでしょうか?
あるいは、PATHに追加するとき、C:\"Program Files (x86)"\GnuWin32\bin
のように " を付けるとうまく行くかもしれません。
m4 というのはマクロプロセッサで、
bison や flex が内部で使用しているのでしょう。
Wikipedia の説明でもわからないということでしょうか?
Re: yacc/lexについて
返信ありがとうございます。
C:\"Program Files (x86)"\GnuWin32\binのように"を付けることではうまくいかなかったため、
スペースを含まないディレクトリにおいてみたところ無事bisonのコマンドを実行することができました。
非常に助かりました。ありがとうございます!
しかし、gcc -o mycalc y.tab.c lex.yy.c のところでつぎのようなエラーみたいなのが出ました。
y.tab.c: In function 'yyparse':
y.tab.c:617:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
# define YYLEX yylex ()
^
y.tab.c:1262:16: note: in expansion of macro 'YYLEX'
yychar = YYLEX;
^~~~~
y.tab.c:1421:7: warning: implicit declaration of function 'yyerror' [-Wimplicit-function-declaration]
yyerror (YY_("syntax error"));
いま、わたしはこのあたりの勉強を始めたばかりなのでどこをどう直せばうごくのかわかりません。
今私が使っているmycalc系のファイルはすべてhttp://kmaebashi.com/programmer/devlang/book/download.html
からダウンロードさせていただいたものなのですが、もしお時間が許されるならばこちらの原因も教えていただけませんでしょうか?
よろしくお願いします。
C:\"Program Files (x86)"\GnuWin32\binのように"を付けることではうまくいかなかったため、
スペースを含まないディレクトリにおいてみたところ無事bisonのコマンドを実行することができました。
非常に助かりました。ありがとうございます!
しかし、gcc -o mycalc y.tab.c lex.yy.c のところでつぎのようなエラーみたいなのが出ました。
y.tab.c: In function 'yyparse':
y.tab.c:617:16: warning: implicit declaration of function 'yylex' [-Wimplicit-function-declaration]
# define YYLEX yylex ()
^
y.tab.c:1262:16: note: in expansion of macro 'YYLEX'
yychar = YYLEX;
^~~~~
y.tab.c:1421:7: warning: implicit declaration of function 'yyerror' [-Wimplicit-function-declaration]
yyerror (YY_("syntax error"));
いま、わたしはこのあたりの勉強を始めたばかりなのでどこをどう直せばうごくのかわかりません。
今私が使っているmycalc系のファイルはすべてhttp://kmaebashi.com/programmer/devlang/book/download.html
からダウンロードさせていただいたものなのですが、もしお時間が許されるならばこちらの原因も教えていただけませんでしょうか?
よろしくお願いします。
Re: yacc/lexについて
付け加えるのを忘れていました。
m4はwikipediaを参考にさせていただいたところ理解することができました。
自分の勉強不足でした。申し訳ないです。
m4はwikipediaを参考にさせていただいたところ理解することができました。
自分の勉強不足でした。申し訳ないです。
Re: yacc/lexについて
これは、警告(warning)であって、エラーではありません。
C は C++ と違って、宣言なしに関数を呼び出すことができるので、
出来た実行ファイル mycalc.exe は動くはずです。
警告を出したくなければ、y.tab.c の最初の方に int yylex(void);
と int yyerror(const char *); という宣言を追加してください。
なお、yyerror の定義は y.tab.c の中にありますが、
yylex の定義は lex.yy.c の中です。
ソースを修正せずに警告を消したいのなら、コンパイルオプション
-Wno-implicit-function-declaration を付けてください。
Re: yacc/lexについて
できました!感激です!
おしえていただいた、宣言を追加する方法、コンパイルオプション、いずれの方法でも動かすことができました。
質問できるような方が身近におらず苦戦しておりました。
これからもどうぞよろしくお願いいたします。
おしえていただいた、宣言を追加する方法、コンパイルオプション、いずれの方法でも動かすことができました。
質問できるような方が身近におらず苦戦しておりました。
これからもどうぞよろしくお願いいたします。