Está en la página 1de 67

Compiladores e

Interpretes
Autómatas Finitos Deterministas (DFA)
Autómatas Finitos No Deterministas (NFA)
UNET 2012
Definición formal de un autómata
finito determinista (DFA)
Los autómatas con un número finito de estados, que tienen un único
estado inicial, y para cada estado una, y solo una transición para cada
símbolo, se denominan autómatas finitos deterministas y para
poderlo definir se requiere conocer:

• Cuál es el conjunto de estados.


• Cuál de estos estados es su estado inicial.
• Cuáles son los estados aceptadores.
• Cuál es el alfabeto de la palabra que se escribe en la cinta.
• Una manera de determinar el nuevo estado en función del símbolo
leído y del estado actual.
Definición formal de un autómata
finito determinista (DFA)
Definición formal de un autómata
finito determinista (DFA)
Como ejemplo de esta definición consideraremos el
siguiente autómata sobre ∑ = {a,b}
Definición formal de un autómata
finito determinista (DFA)
Ejercicio para la casa: escribir
el Algoritmo en lenguaje C
para este autómata finito,
que lea una palabra carácter
por carácter indicando si la
palabra es aceptada o no
Lenguajes regulares y lenguajes
reconocidos por los DFA
El lenguaje regular y el reconocido por un DFA
son expresiones sinónimas, pero es
importante tener en cuenta que un lenguaje
es regular, si y sólo si, existe un DFA que lo
reconozca.
Lenguajes regulares y lenguajes
reconocidos por los DFA
• Muchos lenguajes son reconocidos como regulares, pero para
demostrar que un lenguaje es regular basta con exhibir un
autómata que lo reconozca

• Pero es preciso asegurarse que el lenguaje reconocido por el


autómata es exactamente el que dice que es.
Lenguajes regulares y lenguajes
reconocidos por los DFA
A continuación se presentan algunos ejemplos de lenguajes
regulares, sobre ∑={a,b} y su DFA correspondiente.
Lenguajes regulares y lenguajes
reconocidos por los DFA
Ejercicio:
Cree el DFA correspondiente a los siguientes lenguajes:
Lenguajes regulares y lenguajes
reconocidos por los DFA
Solución:
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

1. L = {abba}

1
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

2. L = {abba,ababba}

2
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

3. L = {a}*={an |n ≥ 0 } = { w | |w|b= 0}

3
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

4. L = {a}+

4
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

5. L = { w | |w| ≥ 3}

5
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

6. L = { w | |w| < 4}

6
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

7. L = { w | |w|a= 3}

7
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

8. L = { w | |w|b= 4n, n ≥ 0 }

8
Ejercicios
• Encontrar un DFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

9. L = { w | |w|b= 4n, n > 0 }

9
Lenguajes No Regulares
• No todos los lenguajes son regulares

• De hecho estos últimos representan una minoría (infinita) entre todos


los lenguajes, es por esto que debemos razonar sobre la existencia de
lenguajes que no son regulares

• Es decir lenguajes que no pueden ser reconocidos por ningún DFA.

• Concretamente nos podemos conseguir con lenguajes que para ser


reconocidos necesitarían autómatas con un número infinito de estados,
como por ejemplo:
Lenguajes No Regulares
• Para comprender este problema hay que situarnos en el hecho de
que una palabra que sea reconocida como perteneciente a este
lenguaje requiere tener la misma cantidad de as y bs.
• Por lo tanto es indispensable recordar el número de símbolos a,
para verificar el número de símbolos b, pero ¿Cómo puede un
autómata finito recordar algo?
Lenguajes No Regulares

¿Qué tendría que hacerse para que aceptara la palabra aaaabbbb.?


Autómatas finitos Indeterministas
¿Qué es un autómata finito indeterminista (NFA)?

Son una forma especial de autómatas finitos que facilitan la tarea de


construcción de los DFA.

El mismo se da cuando se cumple algunas de estas tres condiciones:


1. Tiene más de un estado inicial.
2. Tiene transiciones definidas de forma múltiple.
3. Tiene transiciones no definidas.
Autómatas finitos Indeterministas
Por ejemplo:

Y si es
una b
Aceptación de una palabra en los
Autómatas finitos Indeterministas
Es similar al de los DFA, pero teniendo en cuenta las siguientes
consideraciones:
Aceptación de una palabra en los
Autómatas finitos Indeterministas
Por ejemplo si consideramos la palabra abaabb y el NFA:

• Vemos que si ante el primer símbolo se opta hacia el estado b, no


habrá transición definida, por el contrario si se opta por quedarse
en el estado a, la palabra puede evolucionar hasta su aceptación.
• Por esto debemos concluir que la palabra es aceptada por el
autómata porque como mínimo, hay una secuencia de transiciones
que lo llevan hacia un estado aceptador.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas
Ejemplos paradigmáticos.
Autómatas finitos Indeterministas:
Definición formal
Ejercicios
• Encontrar un NFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

1. L = {abba}

1
Ejercicios
• Encontrar un NFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

2. L = {abba,ababba}

2
Ejercicios
• Encontrar un NFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

3. L = { w | Ǝx,y Є ∑* (w=xy ˄ Ǝz Є ∑2(y=az)) }


= ∑*{a}{a,b}2,
= es decir las palabras cuyo antepenúltimo símbolo es una a

3
Ejercicios
• Encontrar un NFA que reconozca los siguientes lenguajes definidos
en el alfabeto ∑={a,b}:

4. Como se podría convertir el NFA del ejercicio 1 en un DFA.

4
Diferencias Autómatas finitos
Indeterministas y Deterministas
1. El DFA tiene un único estado inicial, mientras
que en un NFA puede tener más de uno.
2. En un DFA, la función de transición
determina un nuevo estado para cada pareja
estado-símbolo, mientras que en un NFA,
para cada pareja estado símbolos tenemos
un conjunto de estados.
Diferencias Autómatas finitos
Indeterministas y Deterministas
Ejemplo:
Coincidencias Autómatas finitos
Indeterministas y Deterministas
• Los lenguajes reconocidos por los autómatas finitos deterministas
son los llamados lenguajes regulares.
• Los lenguajes que los autómatas finitos indeterministas pueden
reconocer son exactamente los mismos que los deterministas, los
lenguajes regulares.
• Un hecho importante es que con un proceso especial conocido
como determinización, ser puede convertir un NFA en un DFA.
Determinización de autómatas no
deterministas
• Un DFA y un NFA se pueden considerar equivalentes:
• Por un lado los DFA pueden considerarse un caso particular de los NFA.
• Por otro lado, cualquier NFA puede convertirse en un DFA que acepta el
mismo lenguaje mediante un procedimiento algorítmico denominado
determinización.
• Y aunque son equivalentes por un lado, por otro no son
equivalentes en todos los sentidos:
• La construcción de NFA es más simple.
• El indeterminismo es una cualidad poco deseable.
• Por estas razones la mayoría de autómatas se crean
indeterministas, se determinizan, y se utiliza su versión
determinada.
Determinización de autómatas no
deterministas
• La clave del proceso de determinización es la siguiente: Cada estado de un
autómata determinista se corresponde con un subconjunto de los estados del
autómata indeterminista. Concretamente:
• El estado inicial del autómata determinista es el conjunto de los estados
iníciales del indeterminista (I).
• Los estados aceptadores del determinista son aquellos que contienen
algún aceptador del indeterminista.
• La función de transición del determinista tiene en consideración todas
las transiciones definidas para cada uno de los estados del autómata
indeterminista que componen un estado del autómata determinista.
Determinización de autómatas no
deterministas
• Por ejemplo, consideremos el autómata indeterminista y veamos su
determinización paso a paso:
Determinización de autómatas no
deterministas
• En primer lugar, el estado inicial del autómata determinista se
corresponderá con los estados iníciales del indeterminista {A,D}:
Determinización de autómatas no
deterministas
La función de transición del estado {A,D} con el símbolo a debe
recoger las transiciones tanto del estado A como del estado D con
este símbolo.
Concretamente, la transición para A con a es hacia el estado B
(δ(A,a)={B}) y, para D con a no esta definido (δ(D,a)={ɸ}).

Así la transición para {A,D} con a es hacia el estado {B} U {ɸ} = {B}:
Determinización de autómatas no
deterministas
Para el estado A,D y el símbolo b se procede de la misma forma
δ(A,b)={ɸ}
y
(δ(D,b)={E}).
Así la transición para {A,D} con b hacia el estado {ɸ} U {E} = {E}
Determinización de autómatas no
deterministas
El mismo proceso que se seguido con el estado {A,D} se debe seguir
con los nuevos estados que han aparecido {B} y {E}:

En relación con {B}, tenemos que


δ(B,a)={B}
y que
δ(B,b)={B,C}
Determinización de autómatas no
deterministas
Del mismo modo, para {E} tenemos que
δ(E,a)={E,F}
y que
δ(E,b)={E}
Determinización de autómatas no
deterministas
• El mismo proceso se repite para los estados {B,C} y {E,F} por lo
que tenemos que:
• δ(B,a)={B} y δ(C,a)={ɸ}, así la transición para {B,C} con a es hacia {B}.
• δ(B,b)={B,C} y δ(C,b)={ɸ}, así la transición para {B,C} con b es hacia {B,C}.
• δ(E,a)={E,F} y δ(F,a)={ɸ}, así la transición para {E,F} con a es hacia {E,F}.
• δ(E,b)={E} y δ(F,b)={ɸ}, así la transición para {E,F} con b es hacia {E}.
Determinización de autómatas no
deterministas
Detalles Finales:
• Como ya no queda ningún nuevo estado por considerar, el
autómata resultante es la versión determinista del autómata
indeterminista original.

• Se debe prestar atención a que {B,C} y {C,F} han sido


marcados como estados aceptadores, siendo esto así porque
contienen estados aceptadores del autómata indeterminista
(C,F).
Determinización de autómatas no
deterministas
Generalmente la determinación no se
hace construyendo gráficamente el
autómata determinista resultante, lo
más habitual es construir la tabla de
función de transición del DFA a partir
del NFA.
Determinización de autómatas no
deterministas
Por ejemplo, veamos la determinación del
autómata que vemos a continuación:

que posee la tabla:


Determinización de autómatas no
deterministas
Iniciamos la construcción de la tabla del DFA a partir de lo
que será su estado inicial: el estado unión de los estados
iníciales del NFA:

Y solo ha sido necesario “unir” las filas correspondientes al


estado A y al estado D:
Determinización de autómatas no
deterministas
Han aparecido dos nuevos estados {B,E} y {C,F},
por lo que es necesario incorporarlos a la tabla de
función de transición del DFA y calcular sus
transiciones:
Determinización de autómatas no
deterministas
El estado {A, D, G} resultante de la unión de las transiciones
de los estados C y F con el símbolo a, no ha aparecido antes
en la tabla, por lo que lo incorporamos y obtenemos:

Observemos {A,D,G} es un estado final, porque contiene a


G, que es un estado final del NFA.
Determinización de autómatas no
deterministas
El proceso de incorporación de estados nuevos a la tabla y
calcular sus transiciones a partir de las transiciones de la tabla
del NFA se repite hasta que ya no aparece ninguno nuevo
más. DFA
NFA
Determinización de autómatas no
deterministas
¿Cuál es el precio que se debe pagar por la determinización de
un autómata indeterminista?

• La respuesta es simple, tomando en cuenta que cada estado


del determinista es un conjunto de estados del
indeterminista.

• En otras palabras cada estado del determinista es un


subconjunto de estados del indeterminista, si el NFA tiene N
estados, el determinista puede llegar a 2N. Por lo que el
crecimiento en el número de estados puede ser exponencial,
y este es el precio a pagar por eliminar el indeterminismo.
Minimización de estados de un
DFA
• La versión mínima de un DFA es otro DFA que reconoce
exactamente el mismo lenguaje que el primero pero lo hace con el
menor número de estados posibles.
• La idea de la minimización es que existen grupos de DFA que se
comporten de la misma manera, y cuando uno de estos sea
encontrado se puede reducir a un único estado.
• Una característica importante es la unicidad del autómata mínimo
que no es otra cosa que: dado un lenguaje regular, el autómata
mínimo que lo reconoce es único.

Si desea profundizar en el tema debe:


Investigar autómata cociente y como sirven para
la minimización de estados de un DFA.
Repasando: Autómatas finitos
• Son un manera matemática para describir clases particulares de
algoritmos (o “máquinas”), en nuestro caso específicamente los
mismos se utilizan para describir el proceso de reconocimiento de
patrones en cadenas de entrada, y de este modo se pueden usar para
construir analizadores léxicos.

• Sus principales componentes son: los estados, las transiciones, el


estado inicial y los estados de aceptación.

• Existen dos tipos principales de autómatas finitos:


• Los determinísticos (DFA).
• Los no determinísticos (NFA).
Implementación de autómatas finitos
en código fuente:
• Existen diversas maneras de implementar un DFA o NFA en
código, sin embargo todos los métodos no serán útiles para
implementar un analizador léxico.

• Consideremos nuestro ejemplo de un DFA que acepte


identificadores compuestos de una letra seguido por una
secuencia de letras o números, en su versión corregida.
letra
ID de
[Otro] retorno
1 letra 2 3

dígito +
Implementación de autómatas finitos
en código
Primera forma de implementación
Es la más sencilla y es la siguiente:
Comentarios:
• Se usa la posición en el
{iniciando en el estado 1} código para mantener el
If el siguiente carácter es una letra then estado implícitamente.
avanza en la entrada;
{Ahora en el estado 2} • Útil si no hay
while el siguiente carácter es una letra o dígito do demasiados estados.
avanza en la entrada;
{permanece en estado 2} • Cada DFA se tiene que
end while; implementar de forma
{ir al estado 3 sin avanzar en la entrada} diferente.
aceptar;
else •La complejidad
{error u otros casos} aumenta a medida que
end if; se eleva el número de
estados.
Implementación de autómatas finitos
en código
Ejercicio para la casa PRIMERA FORMA DE IMPLEMENTACION
Lleve a cabo la implementación del autómata de las constantes
numéricas en notación científica mediante el uso de Java .

digito digito digito


+ +
digito . digito E digito
1 2 3 4 5 6 7 8
- -
digito + + digito +
E
Implementación de autómatas finitos en código
Segunda forma de implementación
Esta forma usa una variable para mantener el estado actual y escribe las transiciones como una sentencia
case doblemente anidada dentro de una iteración, donde la primera sentencia case prueba el estado
actual y el segundo nivel anidado prueba el carácter de entrada, lo que da el estado.
Comentarios:
• Refleja el DFA de manera
estado := 1; {inicio} directa, las transiciones
while estado = 1 o 2 do corresponden con la
case estado of
asignación de un nuevo
1: case carácter de entrada of
letra: avanza en la entrada; estado a la variable estado y
estado:=2; avanza en la entrada,
else estado:= … {error u otro estado} excepto en el caso de
end case; transiciones que no
2: case carácter de entrada of consumen por ejemplo del
letra, dígito: avanza en la entrada; estado 2 al 3.
{innecesario realmente} estado:=2;
else estado:= 3;
end case; •Se puede cambiar el case
end case; exterior para que tenga los
end while; caracteres de entrada y los
If estado=3 then aceptar else error; internos basados en el
estado actual.
Implementación de autómatas finitos
en código
Ejercicio para la casa SEGUNDA FORMA DE IMPLEMENTACION
Lleve a cabo la implementación del autómata de las constantes
numéricas en notación científica mediante el uso de Java .

digito digito digito


+ +
digito . digito E digito
1 2 3 4 5 6 7 8
- -
digito + + digito +
E
Implementación de autómatas finitos
en código
Tercera forma de implementación
Es posible expresarlo también como una estructura de datos y
entonces escribir un código “genérico” que tomara sus
acciones de la estructura de datos (ej. Tabla de transición)

Caracteres en el
alfabeto ∑ (c)
Estados representando
Estados transiciones T(s,c)
s
Implementación de autómatas finitos
en código
Tercera forma de implementación
El DFA para identificadores entonces se puede
representar como la tabla de transiciones, donde los espacios
en blanco representan transiciones que no se muestran en el
DFA (a estados de error u otros procesamientos)
Carácter de letra digito otro
Entrada
Estado
1 2
2 2 2 3
3
Implementación de autómatas finitos
en código
Tercera forma de implementación
Si a la tabla de transiciones, agregamos la información acerca de
cuales estados son aceptadores y cuales transiciones no
consumen sus entradas en esta misma estructura obtenemos:

Carácter de letra digito otro aceptación


Entrada
Estado
1 2 No
2 2 2 [3] No
3 Sí
Implementación de autómatas finitos
en código
Tercera forma de implementación
Ahora podemos escribir el código en una forma que implementara cualquier DFA,
dadas las entradas y estructuras de datos apropiadas, el siguiente ejemplo supone
que las transiciones se mantienen en un arreglo de transición T, indexado por
estados y caracteres de entrada, que aquellas que hacen avanzar la entrada (sin [ ])
están dadas por el arreglo booleano avanzar, indexado también por estados y
caracteres de entrada; y que los estados de aceptación están dados por el arreglo
booleano Aceptar indexado por estados:
Comentarios:
•Se denomina algoritmo
controlado por tabla.
estado:=1;
ch:= siguiente carácter de entrada;
•El tamaño del código se
while not Aceptar[estado] and not error(estado) do reduce.
nuevoestado:=T[estado,ch]; •Servirá el mismo código para
if Avanzar[estado,ch] then ch:= siguiente carácter de entrada; muchos DFA diferentes
estado := nuevoestado; •En DFA grandes tienden a
end while; ser poco eficientes.
If Aceptar[estado] then aceptar;
Expresiones Regulares
Todo esto nos ha traído hacia un tipo de expresiones que
proporcionan una manera simple, sencilla y precisa de un lenguaje
regular y las cuales son conocidas como expresiones regulares.

Tarea Casa: Buscar en internet información relacionada con las


expresiones regulares, su funcionamiento, principales usos, etc.

Mínimo leer articulo de wikipedia sobre el tema.

También podría gustarte