NFAからDFAへの変換アルゴリズムを以下のように変更
※「状態」と単体で書いた場合はDFAの状態とする
Dtrans ... nnodeの状態番号のリストを保持させる
Dnode .... 二つの状態を表しそれをe_node, e_transitionとし、それぞれ、「DFAの状態」と「その状態からの遷移」を表す。e_transitionはその状態から移動出来る文字を持ちそれらを連結リストとしてe_nodeを持つDnodeに繋げる。
1.状態0のDtrans, Dnodeを作成する。
nnode[0]からεで辿れるnnodeの状態番号を全て調べてdtrans[0]のnextに連結させる。また、op=e_nodeであるdnode[0]を作成し、sibling=NULLとしておく
2.状態nのDFAについてのwhileループ
現在調べてようとする状態番号nが調べる必要がある現在の状態数(numOfDnode)より小なりイコール(≦)か調べ、trueであれば続行。
2.1 dtrans[n]に連結されている全てのnnodeについて
その一つのnnodeの状態mにおいてnnode[m]が保持する文字が
ε以外の物を探し、その文字をCHとする。
2.1.1
新しいDtransを作りそれをdtrans_tmpとする
そのnnode[m]と同じ文字を持つnnodeを探しdtrans_tmpに連結する
またそれらのnnodeの状態からεで遷移可能な状態もdtrans_tmp
に連結する。
IF:
ここでこのdtrans_tmpと同じnnodeの集合を持つdtrans[x]があかxop = e_node
dnode[A]->sibling = NULL
とする。またDnode* newDnodeを作成し、
op = e_transition
next = dnode[A]
とし、dnode[n]のsiblingの先頭にnewDnodeを連結する。
次に調べる状態をn++とする。
新しい状態が作成されなくなると次のwhileループの条件でn>numOfDnodeとなり、処理は終了する。