Hatena::ブログ(Diary)

はけの徒然日記 このページをアンテナに追加 RSSフィード

2005 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 04 | 05 | 08 | 09 | 10 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 | 11 |
2011 | 01 | 02 | 03 | 04 | 11 | 12 |
2012 | 02 | 03 | 05 |
2014 | 02 | 03 | 04 | 05 | 12 |
2015 | 05 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 04 | 05 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 10 |

2011-02-12(Sat)

bison & flexメモ その6

C言語でbisonとflexを使う方法のメモ

式の構文木を作ってみる。


mainからyyparse()を呼んで入力した式の構文木作成してそのポインタを返す。そのポインタからeval_tree()で式を評価、free_tree()で構文木の為に確保したメモリ解放を行う。構文木はNode型の構造体を定義して、それを積み重ねていくことで作成している。

よくわからないのが、構文木のトップのポインタをmain側へ渡す方法。yyparse()で渡せないので、とりあえずnode.c内にstaticなポインタ作成してbison側でset_tree()を呼び、main側でget_tree()を呼ぶことで、これを介して渡しているけれども正しい方法なのか不明。

続きを読む

2011-02-07(Mon)

bison & flexメモ その5

C言語でbisonとflexを使う方法のメモ


bison単体で使用する場合比較して、字句解析の関数yylex()部分をflex側にまかせている。このときbisonが生成するヘッダファイルflex側で読み込むことで、bison側で定義したトークンの種別をflex側で使用可能になる、同様にトークン種別以外の値を渡す変数yylvalもflex側で使用可能になる。


続きを読む

2011-02-06(Sun)

bison & flexメモ その4

C言語でbisonを使う方法のメモ


基本的なフォーマットは以下、flexと同じような感じ

%{
初期Cコード
%}

BISON宣言

%%
構文規則
%%
他のCコード

続きを読む

2011-02-05(Sat)

bison & flexメモ その3

C言語flexを使う方法のメモ その3

スタート状態について


%% 〜 %%間のどのルールを有効にするかを指定する。

%x state_name
%s state_name

%sまたは%xに続いて使用する状態名を記述する。

%x(排他的スタート)はその状態名が書かれたルールのみ有効になり、%s(包含スタート)はその状態名で書かれたルールと状態名が書かれていないルールが有効になる。ルールセクションでの記述は以下のとおり。

%%
<state_name> pattern  action
<state_name> pattern  action
%%

または

%%
<state_name> {
pattern  action
pattern  action
}
%%

デフォルトの状態はINITIALであり、別のスタート状態に移行するにはアクションの中で、BEGIN(state_name);を記述する。

続きを読む

bison & flexメモ その2

C言語flexを使う方法のメモ つづき

ファイルの入出力は、FILE*型の変数yyinとyyoutによって行われる。デフォルトではstdinとstdoutが選択されているので、これをfopen()で開いたファイルに変更することで、ファイルへの入出力が可能になる。


続きを読む

bison & flexメモ その1

環境は、Windows XP上のMinGWで、flexバージョンは2.5.35、bisonのバージョンは2.4.2

いきなり両者を使うとよく理解できないので、まずはC言語flexを使う方法のメモ

基本的なフォーマットは以下

%{
初期Cコード
%}
%%
パターン アクション
%%
他のCコード

初期Cコード部分にヘッダファイル定義等を記述して、他のCコード部分にはmain()等の関数記述パターンには適合させたい文字列正規表現で、アクションには適合するパターンが見つかった場合に実行させたい内容を記述する。

続きを読む

2011-02-04(Fri)

MinGW+MSYSのインストール

インストール方法のメモ

start.bat

@echo off
set PATH=D:\MinGW\bin;D:\MinGW\msys\1.0\bin;%PATH%
set C_INCLUDE_PATH=D:\MinGW\include;D:\MinGW\msys\1.0\include
set CPLUS_INCLUDE_PATH=D:\MinGW\include;D:\MinGW\msys\1.0\include
set LIBRARY_PATH=D:\MinGW\lib;D:\MinGW\msys\1.0\lib
set MINGW_DIR=D:\MinGW

bash -rcfile bashrc.txt

bashrc.txt

if [ -z "$MSYSTEM" ]; then
  MSYSTEM=MINGW32
fi

export HOME=`pwd`
export MSYSTEM
export PS1='\w$ '