8

レクサーに DFA ミニマイザーを実装しようとしていますが、式の最小 DFA であるとは思えない DFA を生成することはできません。

後置正規表現からトムソン構築を使用して構築された NFA から DFA を構築しています。ドラゴンブックに書かれていることとほぼ同じです。レクサーを作成するために、いくつかの NFA が開始状態からのイプシロン遷移を使用して結合されます。DFA アルゴリズムが適用されるのは、この結合された NFA です。

では、デッドステートの除去とステートの最小化のための優れたテストベッドとなる DFA を生成する「既知の」正規表現はありますか?

もちろん、奇妙な DFA をハックしてそれにアルゴリズムを適用することもできますが、それは実際には適切なテスト ケースではないでしょうか? 私が構築している DFA のメソッドがデッド ステートになりにくいようにするためである場合、その情報は同様に価値があります。その場合、ステート エリミネーション機能の実装を完全にスキップできるからです。

編集:正確に答えるために実装の詳細が必要な場合は、コードはgithub、特にNFA.csおよびDFA.csクラスで入手できます。さらに、私が使用している構築アルゴリズムに関する一連のブログ記事を書いています。

4

1 に答える 1

3

わかりましたので、私はこれを完全に迂回して見つけました。パーサーから非常に優れたデバッグ出力が得られたので、正規表現を視覚化するためのツールを作成しました。これは、標準的なトンプソン構成手法を使用するとかなりばかげたオートマトンが得られるような式を適切に示しています。(a+b+c+)+|abc

ツールに表示: http://regexvisualizer.apphb.com/?Regex=%28a%2Bb%2Bc%2B%29%2B%7Cabc&NfaSize=300&DfaSize=250#

このツールは現在、最適化を行わずにまっすぐなトンプソン構築を実行します。完全に余分な表現の部分を削除して|abcも、表現は同じままです。そうではありません。

于 2012-03-17T22:32:10.573 に答える