Puisque vous voulez "convertir des regex en DFA en moins de 30 minutes", je suppose que vous travaillez à la main sur des exemples relativement petits.
Dans ce cas, vous pouvez utiliser l'algorithme de Brzozowski , qui calcule directement l'automate Nérode d'un langage (connu pour être égal à son automate déterministe minimal). Il est basé sur un calcul direct des dérivées et fonctionne également pour les expressions régulières étendues permettant l'intersection et la complémentation. L'inconvénient de cet algorithme est qu'il nécessite de vérifier l'équivalence des expressions calculées en cours de route, un processus coûteux. Mais en pratique, et pour les petits exemples, c'est très efficace.[ 1 ]
Quotients de gauche . Soit un langage de A ∗ et soit u un mot. Alors
u - 1 L = { v ∈ A * | u v ∈ L }
La langue u - 1 L est appelé quotient gauche (ou à gauche dérivé ) de L .LUNE∗u
u- 1L = { v ∈ A∗∣ u v ∈ L }
u- 1LL
Automate Nérode . L' automate nérode de est l'automate déterministe A ( L ) = ( Q , A , ⋅ , L , F ) où Q = { u - 1 L ∣ u ∈ A ∗ } , F = { u - 1 L ∣ u ∈ L } et la fonction de transition est définie, pour chacun a ∈LUNE( L ) = ( Q , A , ⋅ , L , F)Q = { u- 1L ∣ u ∈ A∗}F= { u- 1L ∣ u ∈ L } , par la formule
( u - 1 L ) ⋅ a = a - 1 ( u - 1 L ) = ( u a ) - 1 L
Attention à cette définition plutôt abstraite. Chaque état de A est un quotient gauche de L par un mot, et est donc un langage de A ∗ . L'état initial est la langue L , et l'ensemble des états finaux est l'ensemble de tousquotients gauche de L par un mot de L .a ∈ A
( u- 1L ) ⋅ a = a- 1( u- 1L ) = ( u a )- 1L
UNELUNE∗LLL
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
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]
Modifier . (5 avril 2015) Je viens de découvrir qu'une question similaire: Quels algorithmes existent pour construire un DFA qui reconnaît le langage décrit par une expression régulière donnée? a été demandé sur cstheory. La réponse traite en partie des problèmes de complexité.
a(a|ab|ac)*a+
. Vous pouvez soit traduire cela directement en NDFA que vous réduisez en DFA, soit le normaliser en quelque chose qui correspond immédiatement à un DFA.