Conversión de una expresión regular en un autómata
Veamos cómo convertir cualquier expresión regular en un autómata finito no determinista.
Ejemplo
Antes de describir el algoritmo en sí, veamos con un ejemplo de qué se trata. Tomemos esta expresión regular: a(b ∣ c)x∗. Con palabras describiríamos el lenguaje que genera la expresión regular como las palabras que empiezan por la letra «a», seguida de «b» o de «c», y a continuación una cantidad cualquiera de letras «x». ¿Sabríamos construir un autómata que aceptara este lenguaje? Pues sí, mira:
Este autómata acepta, evidentemente, el mismo lenguaje. Surge entonces la pregunta de si para toda expresión regular existe un autómata que acepte el lenguaje correspondiente. Pues sí.
Descripción del algoritmo de conversión de una expresión regular en un autómata
Suponemos que tenemos como entrada una expresión regular R. De la parte anterior sobre las expresiones regulares sabemos que una expresión regular puede tener en total seis formas distintas. Distinguimos, por tanto, seis casos:
-
R = a para algún símbolo a ∈ Σ. Es decir, la expresión regular es solo un símbolo del alfabeto Σ sobre el que trabajamos. El autómata que aceptara un único símbolo a tendría este aspecto:
-
R = ϵ, la palabra vacía. El autómata que aceptara la palabra vacía tendría este aspecto:
-
R = ∅, una expresión regular que genera el lenguaje vacío. El autómata que reconoce ese lenguaje es este:
-
R = R1 ∪ R2, donde R1, R2 son expresiones regulares. Ya sabemos que la unión de lenguajes regulares es de nuevo un lenguaje regular y que sabemos construir un autómata que acepte ese lenguaje. Dicho de otro modo, suponemos que tenemos autómatas que reconocen el lenguaje generado por las expresiones R1 y R2 y con ellos construimos un autómata que acepta el lenguaje generado por la expresión R1 ∪ R2. Ejemplo: si R1 = a y R2 = ϵ, según el procedimiento obtenemos este autómata:
-
R = R1 ∘ R2, donde R1, R2 son expresiones regulares. Es el mismo caso que en el punto anterior. La concatenación de lenguajes regulares es un lenguaje regular y por eso sabemos construir un autómata que acepte ese lenguaje. Así que, si R1 = a, R2 = b, la concatenación tendría este aspecto:
-
, donde R1 es una expresión regular. De nuevo sabemos que la clausura de un lenguaje regular es un lenguaje regular. Así que, si R = a∗, el autómata tendría este aspecto:
Aplicando sucesivamente estos puntos convertimos toda la expresión regular en un autómata finito.
Ejemplo completo
Intentemos convertir la expresión regular (a ∣ bc)∗. Iremos obteniendo estos autómatas:
Este autómata resultante acepta el lenguaje que genera la expresión regular (a ∣ bc)∗. Naturalmente, el autómata es terriblemente complicado y seguro que existe un autómata mucho más sencillo que acepta el mismo lenguaje. Podemos usar el algoritmo de conversión de un AFND en un AFD y después aplicar la minimización del autómata.
Fuentes
Capítulos: Expresiones regulares, Conversión de una expresión regular en un autómata, Autómata finito no determinista generalizado, Conversión de un autómata en una expresión regular