Mercurial > hg > Applications > Grep
diff regexParser/transition.h @ 167:3bf2c6d6d53e pairPro
move regexparser dir
author | masa |
---|---|
date | Sat, 19 Dec 2015 15:38:45 +0900 |
parents | c/regexParser/transition.h@e2e717fbeb2f |
children | 313f1c176328 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/regexParser/transition.h Sat Dec 19 15:38:45 2015 +0900 @@ -0,0 +1,35 @@ +#include "bitVector.h" + +typedef struct transition { + CharClassPtr condition; + BitVectorPtr nextState; + struct transition *next; +} Transition, *TransitionPtr; + +typedef struct state { + BitVectorPtr bitState; + TransitionPtr transition; + struct state *next; +} State, *StatePtr; + +StatePtr createState(BitVectorPtr bi, TransitionPtr ts, StatePtr next); +StatePtr appendState(StatePtr x, StatePtr y); +TransitionPtr createTransition(CharClassPtr cc ,BitVectorPtr state); +TransitionPtr appendTransition0(TransitionPtr curr,TransitionPtr next); +TransitionPtr appendTransition(TransitionPtr curr,TransitionPtr next); + +/* + 正規表現木を辿って transition のList をつくる + CharClass のかさなりを判定して重なりのない新しいCharClassをつくる + 重なっている状態はbitvectorのorをとる + 重なっている状態はそれぞれの状態について木をたどる + + nextState == 0 は正規表現の末端を表す + nextState == 1 は受理状態を表す + 正規表現のノードの番号 n に対応する 2^n のbitをセットした状態 + + | の場合は両方のListを結合する + + の場合は左のノードに * がある場合は右のリストも結合する + 左のノードに*がない場合は、右のほうだけみる + * は直下のリストを使って、次の状態を自分自身にする + */