ページ 11

yacc/lexについて

Posted: 2018年4月24日(火) 23:31
by ユーマ
皆さんこんにちは。ユーマと申します。
長文失礼します。

いま、こちらのサイトを参考にして電卓をつくってみようかなと思い勉強していたところ、わからないことが出てきたので質問させてもらいました。

私は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とは何なのでしょうか?
(しらべてもいまいちわかりませんでした)

分かりにくい文章ですみません。
何か必要な情報があれば追加させていただきます。

Re: yacc/lexについて

Posted: 2018年4月25日(水) 01:26
by かずま
ユーマ さんが書きました:
7年前
おそらくbisonの構文解析を行うところでおかしくなっていると思うのですが
これはどうしたら直るでしょうか?
エラーメッセージから考えられることは、C:\Program Files (x86) という
ディレクトリがスペースを含んでいるため、ファイルをオープンできない
ようです。GnuWin32 をスペースを含まないディレクトリに置いて、
環境変数PATH もそれに合わせて設定してみてはいかがでしょうか?

あるいは、PATHに追加するとき、C:\"Program Files (x86)"\GnuWin32\bin
のように " を付けるとうまく行くかもしれません。
ユーマ さんが書きました:
7年前
また、コマンドラインへの入力一行目の出力のm4とは何なのでしょうか?
(しらべてもいまいちわかりませんでした)
m4 というのはマクロプロセッサで、
bison や flex が内部で使用しているのでしょう。
Wikipedia の説明でもわからないということでしょうか?

Re: yacc/lexについて

Posted: 2018年4月25日(水) 21:29
by ユーマ
返信ありがとうございます。
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について

Posted: 2018年4月25日(水) 21:30
by ユーマ
付け加えるのを忘れていました。

m4はwikipediaを参考にさせていただいたところ理解することができました。
自分の勉強不足でした。申し訳ないです。

Re: yacc/lexについて

Posted: 2018年4月25日(水) 22:22
by かずま
ユーマ さんが書きました:
7年前
しかし、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]
これは、警告(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について

Posted: 2018年4月25日(水) 23:29
by ユーマ
できました!感激です!
おしえていただいた、宣言を追加する方法、コンパイルオプション、いずれの方法でも動かすことができました。
質問できるような方が身近におらず苦戦しておりました。
これからもどうぞよろしくお願いいたします。