560 likes | 728 Views
正規表現から DFA への変換. 正規表現受理器. 正規表現で表されたパターンが検索対象のテキストに出現するかどうかをチェックする プログラム 1.正規表現を NFA に変換 2. NFA を DFA に変換. 正規表現の NFA への変換. 正規表現の NFA への変換. 3つの基本形をおさえるだけ! ・ XY ・ X|Y ・ X*. 正規表現の NFA への変換. NFA の基本形. 出力シンボル. 初期状態. 終了状態. ?. 開始. 正規表現の NFA への変換. NFA の基本形. 出力シンボル. 初期状態. 終了状態. ε.
E N D
正規表現受理器 • 正規表現で表されたパターンが検索対象のテキストに出現するかどうかをチェックする プログラム 1.正規表現をNFAに変換 2.NFAをDFAに変換
正規表現のNFAへの変換 • 3つの基本形をおさえるだけ! ・ XY ・ X|Y ・ X*
正規表現のNFAへの変換 • NFAの基本形 出力シンボル 初期状態 終了状態 ? 開始
正規表現のNFAへの変換 • NFAの基本形 出力シンボル 初期状態 終了状態 ε 開始 空の正規表現に対応するNFA
正規表現のNFAへの変換 • NFAの基本形 出力シンボル 初期状態 終了状態 a 開始 正規表現 a に対応するNFA
正規表現のNFAへの変換 • XY
正規表現のNFAへの変換 • XY X 開始 Y
正規表現のNFAへの変換 • X|Y
正規表現のNFAへの変換 • X|Y X ε ε 開始 ε ε Y
正規表現のNFAへの変換 • X*
正規表現のNFAへの変換 • X* ε 開始 X 8 ε
正規表現のNFAへの変換 • X+
正規表現のNFAへの変換 • X+ = XX*
正規表現のNFAへの変換 • X+ = XX* ε 開始 X X 8 ε
正規表現のNFAへの変換 • y(yz|x)*
正規表現のNFAへの変換 • y(yz|x)*=yX*(X=yz|x)
正規表現のNFAへの変換 • y(yz|x)*=yX*(X=yz|x) ε 開始 y X 8 ε
正規表現のNFAへの変換 • y(yz|x)*=yX*(X=yz|x) ε 開始 y yz|x 8 ε
正規表現のNFAへの変換 • y(yz|x)*=yX*(X=yz|x) yz ε 開始 ε ε y 8 ε ε ε x
正規表現のNFAへの変換 • y(yz|x)*=yX*(X=yz|x) y z ε 開始 ε ε y 8 ε ε ε x
正規表現のNFAへの変換 • y(yz|x)* y z ε 開始 ε ε y 8 ε ε ε x
y z ε ε ε y 8 ε ε ε x NFAをDFAに変換するアルゴリズム y(yz|x)* 開始
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x NFAをDFAに変換するアルゴリズム y(yz|x)* 開始
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x {0}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x y 1 {0}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x y {1, 2, 5, 8} {0}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x 6 x y {1, 2, 5, 8} {0}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x {6, 7, 1, 2, 5, 8} x y {1, 2, 5, 8} {0}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x {6, 7, 1, 2, 5, 8} x y {1, 2, 5, 8} {0} {3} y
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y {1, 2, 5, 8} {0} {3} y
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y y {1, 2, 5, 8} {0} {3} y
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 8} x y y {1, 2, 5, 8} {0} {3} y z 4
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y y {1, 2, 5, 8} {0} {3} y z {4, 7, 1, 2, 5, 8}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y y x {1, 2, 5, 8} {0} {3} y z {4, 7, 1, 2, 5, 8}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y y x {1, 2, 5, 8} {0} {3} y y z {4, 7, 1, 2, 5, 8}
y z ε 2 3 4 ε ε y 7 8 8 0 1 ε ε ε 5 6 x x {6, 7, 1, 2, 5, 8} x y y x {1, 2, 5, 8} {0} {3} y y z {4, 7, 1, 2, 5, 8}
y z ε 2 3 4 {4, 7, 1, 8} ε {6, 7, 1, 8} ε y 7 8 8 0 1 {1, 2, 5, 8} {1, 2, 5, 8} ε ε ε 5 6 x {6, 7, 1, 8} {4, 7, 1, 8} x 4 x y y x {0} {3} y y z
y z ε 2 3 4 {4, 7, 1, 8} ε {6, 7, 1, 8} ε y 7 8 8 0 1 {1, 2, 5, 8} {1, 2, 5, 8} ε ε ε 5 6 x {6, 7, 1, 8} {4, 7, 1, 8} x 4 x y y x {0} {3} y y z
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} 状態数最小化アルゴリズム x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: b: c: d: e: x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c: d: e: x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c d - c: d: e: x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c d - c: c d - d: e: x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c d - c: c d - d: - - e e: x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c d - c: c d - d: - - e e: c d - x c 4 x y a b y x d {0} {3} y y z e
{4, 7, 1, 8} {6, 7, 1, 8} {1, 2, 5, 8} {1, 2, 5, 8} {6, 7, 1, 8} {4, 7, 1, 8} x y z a: - b - b: c d - c: c d - d: - - e e: c d - x c 4 x y a b y x d {0} {3} y y z e