yacc/lexについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ユーマ
記事: 33
登録日時: 7年前

yacc/lexについて

#1

投稿記事 by ユーマ » 7年前

皆さんこんにちは。ユーマと申します。
長文失礼します。

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

私は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について

#2

投稿記事 by かずま » 7年前

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

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

ユーマ
記事: 33
登録日時: 7年前

Re: yacc/lexについて

#3

投稿記事 by ユーマ » 7年前

返信ありがとうございます。
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
からダウンロードさせていただいたものなのですが、もしお時間が許されるならばこちらの原因も教えていただけませんでしょうか?
よろしくお願いします。

ユーマ
記事: 33
登録日時: 7年前

Re: yacc/lexについて

#4

投稿記事 by ユーマ » 7年前

付け加えるのを忘れていました。

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

かずま

Re: yacc/lexについて

#5

投稿記事 by かずま » 7年前

ユーマ さんが書きました:
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 を付けてください。

ユーマ
記事: 33
登録日時: 7年前

Re: yacc/lexについて

#6

投稿記事 by ユーマ » 7年前

できました!感激です!
おしえていただいた、宣言を追加する方法、コンパイルオプション、いずれの方法でも動かすことができました。
質問できるような方が身近におらず苦戦しておりました。
これからもどうぞよろしくお願いいたします。

返信

“C言語何でも質問掲示板” へ戻る