Karena Anda ingin "mengubah regex menjadi DFA dalam waktu kurang dari 30 menit", saya kira Anda bekerja dengan tangan pada contoh yang relatif kecil.
Dalam hal ini Anda dapat menggunakan algoritma Brzozowski , yang menghitung secara langsung otomat Nerode dari suatu bahasa (yang diketahui sama dengan otomat deterministik minimalnya). Ini didasarkan pada perhitungan langsung dari derivatif dan juga berfungsi untuk ekspresi reguler yang diperpanjang yang memungkinkan persimpangan dan komplementasi. Kelemahan dari algoritma ini adalah bahwa ia perlu memeriksa ekuivalensi ekspresi yang dihitung sepanjang jalan, proses yang mahal. Tetapi dalam praktiknya, dan untuk contoh kecil, ini sangat efisien.[1]
Quotients kiri . Biarkan menjadi bahasa dan biarkan menjadi kata. Kemudian
Bahasa disebut quotient kiri (atau kiri turunan ) dari .LA∗u
u−1L={v∈A∗∣uv∈L}
u−1LL
Otomat Nerode . The Nerode otomat dari adalah deterministik otomat di mana , dan fungsi transisi didefinisikan, untuk setiap , dengan rumus
Waspadai definisi yang agak abstrak ini. Setiap status adalah hasil bagi kiri dari per kata, dan karenanya adalah bahasa . Keadaan awal adalah bahasa , dan himpunan menyatakan akhir adalah himpunan semua quotients kiriLA(L)=(Q,A,⋅,L,F)Q={u−1L∣u∈A∗}F={u−1L∣u∈L}a∈A
(u−1L)⋅a=a−1(u−1L)=(ua)−1L
ALA∗LL oleh firman .
L
Algoritma Brzozowski . Biarkan menjadi huruf. Seseorang dapat menghitung quotients kiri menggunakan rumus berikut:
a,b
a−11a−1(L1∪L2)a−1(L1∩L2)=0=a−1L1∪u−1L2,=a−1L1∩u−1L2,a−1ba−1(L1∖L2)a−1L∗={10if a=bif a≠b=a−1L1∖u−1L2,=(a−1L)L∗
a−1(L1L2)={(a−1L1)L2(a−1L1)L2∪a−1L2si 1∉L1,si 1∈L1
Contoh . Untuk , kami mendapatkan berturut-turut:
yang memberikan otomat minimal berikut.
L=(a(ab)∗)∗∪(ba)∗
1−1La−1L1b−1L1a−1L2b−1L2a−1L3b−1L3a−1L4b−1L4a−1L5b−1L5=L=L1=(ab)∗(a(ab)∗)∗=L2=a(ba)∗=L3=b(ab)∗(a(ab)∗)∗∪(ab)∗(a(ab)∗)∗=bL2∪L2=L4=∅=(ba)∗=L5=∅=a−1(bL2∪L2)=a−1L2=L4=b−1(bL2∪L2)=L2∪b−1L2=L2=∅=a(ba)∗=L3
[1] J. Brzozowski, Derivatif Ekspresi Reguler, J.ACM 11 (4), 481–494, 1964.
Edit . (5 April 2015) Saya baru saja menemukan bahwa pertanyaan serupa: Algoritma apa yang ada untuk konstruksi DFA yang mengenali bahasa yang dijelaskan oleh regex yang diberikan? diminta pada cstheory. Jawabannya sebagian membahas masalah kompleksitas.
a(a|ab|ac)*a+
. Anda bisa langsung menerjemahkannya ke NDFA yang Anda kurangi menjadi DFA, atau Anda bisa menormalkannya menjadi sesuatu yang segera dipetakan ke DFA.