Como quiere "convertir expresiones regulares a DFA en menos de 30 minutos", supongo que está trabajando a mano en ejemplos relativamente pequeños.
En este caso, puede usar el algoritmo de Brzozowski , que calcula directamente el autómata Nerode de un lenguaje (que se sabe que es igual a su autómata determinista mínimo). Se basa en un cálculo directo de las derivadas y también funciona para expresiones regulares extendidas que permiten la intersección y la complementación. El inconveniente de este algoritmo es que requiere verificar la equivalencia de las expresiones calculadas en el camino, un proceso costoso. Pero en la práctica, y para pequeños ejemplos, es muy eficiente.[ 1 ]
Cocientes izquierdos . Deje que sea una lengua de y dejar ser una palabra. Entonces
El idioma se denomina cociente izquierda (o dejó derivado ) de .A ∗ u u - 1 L = { v ∈ A ∗ ∣ u v ∈ L } u - 1 L LLUN∗tu
tu- 1L = { v ∈ A∗| T V ∈ L }
tu- 1LL
Autómata Nerode . El autómata Nerode de es el autómata determinista donde , y la función de transición se define, para cada , por la fórmula
Cuidado con esta definición bastante abstracta. Cada estado de es un cociente izquierdo de por una palabra, y por lo tanto es un lenguaje de . El estado inicial es el lenguaje , y el conjunto de estados finales es el conjunto de todos los cocientes izquierdos deLUN( 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 por una palabra de .
L
Algoritmo de Brzozowski . Deje ser letras. Se pueden calcular los cocientes izquierdos utilizando las siguientes fórmulas:
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
Ejemplo . Para , obtenemos sucesivamente:
que proporciona el siguiente autómata mínimo.
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, Derivados de expresiones regulares, J.ACM 11 (4), 481-494, 1964.
Editar . (5 de abril de 2015) Acabo de descubrir una pregunta similar: ¿Qué algoritmos existen para construir un DFA que reconozca el lenguaje descrito por una expresión regular dada? fue preguntado en teoría. La respuesta aborda en parte los problemas de complejidad.
a(a|ab|ac)*a+
. Puede traducirlo directamente a un NDFA que reduce a un DFA, o puede normalizarlo a algo que se asigne inmediatamente a un DFA.