yaccとlexでメモリ内の文字列を使いたい場合

●問題点
yaccとlexは文字を標準入力(キーボード)から取得する。実際にプログラムで使う場合は、自分で構築したメモリーから渡したい

●対処方法
FLEXファイルにYY_INPUTを再定義して、関数の引数で渡す

PG例)FLEXファイル
%{

:
#include <string.h> ←strcpy,strlen用
extern int my_input(char*buf, int maxlen);
#undef YY_INPUT
#defne YY_INPUT(buf,retvl,maxlen) ( retval = my_yyinput(buf,maxlen))
:
%}
%%
:
:
%%
int my_yyinput(char*buf,int maxlen)
{
char* p = "11+34\n"; ←このままだと毎回同じのが渡されるので
             自分で何か変えましょう
strcpy(buf,p) ←コピーすること。bufの領域は多分大丈夫でしょう
maxlen(strlen(p));
return maxlen; /* ←0を返すとEOFと判断される*/
}

●キーワード
yacc lex コンソール 標準入力
コメント ( 0 ) | Trackback ( 0 )

VCでyaccとlexを使いたい

●問題点
VisualC++(以下VC)でyaccとlexを使いたいが、VCの環境設定はどうすればいいのか

●対処方法:目次
1)Bison(yaccの上位互換)とFlex(lexの上位互換)をダウンロード
2)インストール
3)VCのパスの設定
4)VCのプロジェクトにyaccとlexのソース追加
5)VCのカスタムビルドの設定
6)リビルド(仮)でファイル作成
7)ファイルをプロジェクトに追加
8)設定変更
9)リビルド

●対処方法:詳細

1)Bison(yaccの上位互換)とFlex(lexの上位互換)をダウンロード

例)http://sourceforge.net/projects/gnuwin32
bison1.875:bison-1.875-3.exe
flex2.5.4a-1:flex-2.5.4a-1.exe

2)インストール
それぞれのexeファイルを実行してインストールする

例)インストールパス
C:\Program Files\GnuWin32

実行ファイル
C:\Program Files\GnuWin32\bin\bison.exe
C:\Program Files\GnuWin32\bin\flex.exe

3)VCのパスの設定
VC→ツール→オプション→ディレクトリ→実行可能ファイル
に2)の実行ファイルのパスを追加する

例)C:\Program Files\GnuWin32\bin

4)VCのプロジェクトにyaccとlexのソース追加

例)
test.y___yacc(Bison)
test.l___lex (Flex)

5)VCのカスタムビルドの設定

Bisonファイルのプロジェクトの設定に以下のものを設定
プロジェクトの設定
→一般
→→常にカスタムビルドステップを使用[チェックON]
→→→カスタムビルド
→→→→コマンド:bison -d -o$(InputName)bison.c $(InputName).y
→→→→→出力:$(ProjDir)/$(InputName)bison.c
※[-d]を忘れると左辺値が構造体または共用体ではないというコンパイルエラーが出る

Flexファイルのプロジェクトの設定に以下のものを設定
プロジェクトの設定
→一般
→→常にカスタムビルドステップを使用[チェックON]
→→→カスタムビルド
→→→→コマンド:flex -o$(InputName)flex.c $(InputName).l
→→→→→出力:$(ProjDir)/$(InputName)flex.c

6)リビルド(仮)でファイル作成
ここで1度リビルドを行うと
bisonの出力ファイルが2つ(.cと.h)
lexの出力ファイルが1つ(.c)ができる

例)
testbison.c/testbison.h
testflex.c

7)ファイルをプロジェクトに追加
出力されたファイル(.c/.h)をプロジェクトに追加

8)設定変更
この後のリビルドで「マクロが再定義されました」というエラーが出る場合
.cファイルの設定を以下のように変更
→設定
→→C/C++
→→プリコンパイル済みヘッダー
→→→プリコンパイル済みヘッダーを使用しない

9)リビルド
VCのリビルドを行うとFlex/BisonがCのソースを吐き出し、VCがそのCソース
をリビルドして実行ファイルを作成することを確認する。
※コンパイル中にワーニングが出るかもしれないが多少のことは無視しましょう。

●キーワード
VisualC++ yacc lex 構文解析 字句解析 Microsoft bison flex development
コメント ( 0 ) | Trackback ( 0 )