#はじめに
まず、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 のコマンドで出来ます。これもバッチファイルに書き加えてもいいかもしれません