LoginSignup
4
1

More than 5 years have passed since last update.

FlexとBisonをVisualStudio2017で使う

Last updated at Posted at 2017-11-04

はじめに

まず、flex と bisonを ダウンロードしてインストールしてください。

そして、パスを通す(環境変数Pathに、インストール先のbinファイルのパスを追加登録する)のですが、ここで注意!

実行ファイルがディレクトリC:\Program Files\GnuWin32\binとかにおいてあると、パス名にスペースがあるとbisonを実行したいときにエラーが出るので、C:\GnuWin32\binなどに移動してからパスを通してください。

つぎに、ふつうにflexファイルとbisonファイルを用意して、コマンドラインから実行してC言語のソースを作ってみてください。これが上手く行かないと、VisualStudioにもっていっても動かないです。

コマンドは、test.l、test.y をgccだと

flex test.l
bison -d test.y
gcc lex.yy.c test.tab.c -o test.exe -lfl

この際、-lfl はライブラリのリンクです。これは、libfl.a という lex のライブラリなので、gccに入れ解く必要があります。もし gcc を使っているのなら、先ほどインストールしたflex の、デフォルトなら "C:\Program Filess(x86)\GnuWin32\lib\libfl.a" にあるライブラリを gcc の C:\MinGW\lib にコピペしてください。べつにリンクしなくてもいいです。でも、その際はyywrap関数を(ほかにもあるかもしれない)自分で定義してください(.yのファイルに)。

int  yywrap(void) { return 1; }

あと、コンパイラが 'yylval' が見つからないというエラーを出す場合は、#include "任意の名前.tab.h" の直後に、

extern YYSTYPE yylval; 

を入れるといいらしいです。

VisualStudioでビルドできるようにする

flexの(拡張子が .l )ファイルを開き、#define YY_NO_UNISTD_H と追加してください。これは、unistd.h を使わないという意味で、visualstudio にはこれがついていないようです。

そして、追加したところの下あたりに、#include <io.h>、#define fileno _fileno、#define isatty _isatty を追加してください。(これで、gccではコンパイルできなくなりました!)ちなみに、io.h は、isatty 関数を使うためのヘッダーです。それぞれのdefineは、関数の名前がVSでは変更になったらしいので( isatty が _isattyとか )、関数の名前を置き換えているというわけです。

visualstudio での設定

まず、VC++の空のプロジェクトを作ってください。

そして、先ほどコンパイルしたファイル(.cとか、.lとか、.yとか)を全部まとめて入れてください。

まずライブラリをリンクします。リンカー/全般の追加のライブラリディレクトリに、先ほどの libfl.a があるフォルダを追加して、リンカー/入力の追加の依存ファイルに libfl.a を追加してください。(しなくてもいいかもしれない)

ここまで来たら、あとはこの .l , .y ファイルをC言語のソースにして(flex, bison のコマンドを使う)、vs2017に読み込ませて、(改行タイプを聞かれると思うので、windowsのにして)、vs2017でコンパイルするだけです。

ここから先、やんなくても動きます

bison,flexコマンドを打つ作業は「ビルドイベント」の「ビルド前のイベント」の「コマンドライン」に flex test.lとか bison -d test.y (test.l, test.yの場合)を追加すれば自動化できます。バッチファイルを作って呼び出してもいいかもしれません。

そして、flexは、lex.yy.c を作る際に改行コードが visualstudio のデフォルトと違います。これを、ビルドの段階で visualstudio の改行コードに直せます。これは、powershell のコマンドで出来ます。これもバッチファイルに書き加えてもいいかもしれません

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1