ウォンツテック

そでやまのーと

NFAのデータ構造をどうするか考えてみた。
状態番号ではなく状態遷移に着目して以下のような構造を考える

struct ntrans {
  char ch;
  int from;
  int to;
};

chは文字で空文字の場合は「-1」としてセットしておく。
fromはどの遷移元の状態番号でtoは遷移先の状態番号とする。
さらにfromに着目して状態番号の構造体を考える

struct _nnode {
  char ch;
  int to;
  nnode* next;
};

この構造体は各from毎に持たせて複数のtoを持つ場合はnextで片方向リストとして連結させておく。
正規表現からnnodeへの変換は以下のような流れでとりあえずやってみる

1. OPを調べその状態により以下のような再帰的処理をする。
 ※再帰処理をさせるときの始点と終点をそれぞれSとEとしておく
 a) Union(X|Y)の場合
   S,Eは関数の引数として渡し、間に4つの状態(A,B,C,D)を作り左枝には始点と終点をA,Bとして渡し、右枝には始点と終点をC,Dとして渡し再帰処理をさせる。また、以下のntransに状態遷移を追加する
 ※ntransは配列としておき、最大番地に格納していく事とする
 S⇒A empty
 B⇒E empty
 S⇒C empty
 D⇒E empty

 b) Concat(XY)の場合
   一つ状態を作成しそれをAとし左枝には始点とAをそれぞれ始点と終点として渡し、右枝にはAと終点をそれぞれ始点と終点として渡し再帰処理をさせる。

 c) Closure(X*)の場合
   二つ状態を作成しそれをA,Bとし、左枝にA,Bをそれぞれ始点と終点として渡し再帰処理をさせる。また、以下の状態遷移を追加する
 S⇒A empty
  B⇒A empty
  A⇒E empty

 d) PClosure(X+)の場合
   二つ状態を作成しそれをA,Bとし、左枝にA,Bをそれぞれ始点と終点として渡し再帰処理をさせる。また、以下の状態遷移を追加する
 S⇒A empty
  B⇒A empty
  B⇒E empty

 e) Charcter or Emptyの場合
  以下の状態遷移を追加する
  S⇒E char(or empty)

2. ntransが完成したらそのfrom値を元にnnodeを作成する。

ntransなんて作らずにnnode作る事も可能っぽいけどそれはコーディングしながら考えてみるかな。。