Analisis Lexico
Analisis Lexico
Analisis Lexico
Análisis Léxico
Análisis léxico
• El Análisis Léxico
• Funciones del analizador léxico y ventajas
• Definiciones básicas
• ¿Cómo funciona el analizador léxico?
• Diseño de un analizador léxico
• Reconocimiento de identificadores
• Errores léxicos
• Léxico.
1. m. Diccionario de una lengua.
2. m. Vocabulario, conjunto de las palabras de un idioma, o de las
que pertenecen al uso de una región, a una actividad
determinada, a un campo semántico dado, etc.
Diccionario de la RAE
Componente léxico
Programa Analizador Analizador
Léxico Obtén otro Sintáctico
Fuente
componente léxico
Si reconoce un identificador lo
almacena en la tabla de
Tabla de
símbolos, y posteriormente si
Símbolos
el analizador sintáctico
reconoce que ese identificador
lleva asociada información tipo Sistema de gestión de errores: Se encarga
(entero, real, etc.) también de detectar símbolos que no pertenezcan a
añade información a la la gramática porque no encajen con ningún
mencionada tabla patrón, bien porque haya caracteres
inválidos (Ej. @), o bien porque se escriban
mal las palabras reservadas del lenguaje,
los identificadores o los números (5.25 en
lugar de 5,25)
Funciones del Análizador Léxico
VENTAJAS:
If If “if”
Mas + “+”
Identificador velocidad, pi Letra seguida de letras y dígitos
Número 10, 2000, 34 Secuencia de dígitos
Procesadores de Lenguaje
Definiciones básicas
Procesadores de Lenguaje
Definiciones básicas
Ejemplo: Lenguaje JAVA
PROG LISTA_CLASES
| λ
LISTA_CLASES CLASE ; LISTA_CLASES
| CLASE ;
CLASE MODIFICADOR class IDENT { CUERPO_CLASE }
MODIFICADOR public
| private
CUERPO_CLASE LISTA_VAR_FUNC
| λ
LISTA_VAR_FUNC DECL_VAR ; LISTA_VAR_FUNC
| DECL_FUNC ; LISTA_VAR_FUNC
| DECL_VAR
| DECL_FUNC
Procesadores de Lenguaje
Definiciones básicas
Procesadores de Lenguaje
Definiciones básicas
Procesadores de Lenguaje
Definiciones básicas
ALFANUM LETRA
| DIGITO
LETRA a | b | ... | z | A | B | ... | Z
DIGITO 0 | 1 | ... | 9
VALOR IDENT
| NUMERO
Procesadores de Lenguaje
Definiciones básicas
Procesadores de Lenguaje
Diseño de un Analizador Léxico
• Tabla de transiciones:
– En las filas colocamos los estados (q) que pertenecen al
conjunto de estados Q
– En las columnas estarán los símbolos de la entrada (e) y que
pertenecen al alfabeto ∑
– El estado inicial llevará el siguiente símbolo
– Los estados finales llevarán el siguiente símbolo *
– En la posición (fila, columna) tendremos el estado que
determina la función f(q, e)
f a b
q1 q1
q0
*q1 q0 q1
Diseño de un Analizador Léxico
• Diagrama de transiciones:
– El estado inicial llevará el símbolo
– En los nodos se mostrarán los estados
– Los arcos unirán los estados con el símbolo de la entrada
– Los estados finales tendrán un doble círculo (equivalente al * en
la tabla)
a b
q0 q1
a
Reconocimiento de Identificadores
• La forma de representar mediante expresiones regulares cualquier
letra mayúscula o minúscula es: [a-z][A-Z] y le denominamos letra.
La forma de representar un número cualquiera es [0-9] y le
denominamos número. Para finalizar se define como [otro]
cualquier otro símbolo, indicando que ya ha terminado de definirse
el identificador. Esto lo representamos mediante un diagrama de
transiciones de la siguiente manera
letra
letra otro
q0 q1 q2
número
Expresiones Regulares
Procesadores de Lenguaje
Especificación de los componentes léxicos:
Definiciones regulares
Ejemplo. Identificadores en C.
DIGITO 0 | 1 | ... | 9
Procesadores de Lenguaje
Especificación de los componentes léxicos:
Definiciones regulares
– Ejemplo. Números reales sin signo en C (X.XE±X).
DIGITO 0 | 1 | ... | 9
FRACCION_OPTATIVA . {DIGITOS} | λ
EXPONENTE_OPTATIVO E (+ | - | λ) {DIGITOS} | λ
Procesadores de Lenguaje
Especificación de los componentes léxicos:
Abreviaturas en la notación
• + Uno o más casos (cierre positivo).
– r* = r+ | λ r+ = r r*
• ? Cero o un caso.
– r? = r | λ
FRACCION_OPTATIVA (.DIGITOS)?
• Clases de caracteres.
– [abc] = a | b | c
– [a-z] = a | b | ... | z
IDENTIFICADOR [A-Za-z][A-Za-z0-9]*
Procesadores de Lenguaje
Especificación de los componentes léxicos:
Expresiones regulares
• Ejemplos:
– Números binarios múltiplos de dos:
(0 | 1)*·0
Procesadores de Lenguaje
Especificación de los componentes léxicos:
Definiciones regulares
DIGITO [0-9]
NATURAL {DIGITO}+
Procesadores de Lenguaje
Reconocimiento de componentes léxicos
Procesadores de Lenguaje
Reconocimiento de componentes léxicos
Autómatas Finitos
• Un autómata finito se suele representar con un grafo dirigido, y
está formado por:
– Un conjunto de estados S.
– Un conjunto de símbolos de entrada (alfabeto o vocabulario) V.
– Un conjunto de transiciones (o movimientos) de un estado a
otro, etiquetados con caracteres en V.
– Un estado inicial s0.
– Un conjunto de estados finales (o de aceptación) F.
Procesadores de Lenguaje
Reconocimiento de componentes léxicos
Autómatas Finitos
• Tipos:
– Autómata Finito Determinista (AFD). No puede tener varias
transiciones salientes con el mismo símbolo.
– Autómata Finito No determinista (AFND). Puede tener una o
ninguna transiciones salientes con el mismo símbolo.
Procesadores de Lenguaje
Reconocimiento de componentes léxicos
Autómatas Finitos
• Ejemplo: (a|b)*abb.
– S = {0, 1, 2, 3}
– V = {a, b}
– so = 0
– F = {3}
Inicio a b b
0 1 2 3
Procesadores de Lenguaje
Reconocimiento de componentes léxicos
Autómatas Finitos
• La implementación más sencilla para el AF es una tabla de
transiciones.
– Una fila para cada estado.
– Una columna por cada símbolo de entrada y λ si es necesario.
– La entrada para la fila i y el símbolo a es el conjunto de
estados que puede ser alcanzado por una transición del estado
i con la entrada a.
• Ejemplo: (a|b)*abb.
Procesadores de Lenguaje
Autómatas Finitos No deterministas
Procesadores de Lenguaje
Conceptos de AFND
• Lenguaje asociado a un AFND: Es el conjunto de palabras que le
hacen transitar desde el estado inicial a algún estado final,
utilizando para ello la función f.
• Equivalencia entre AFD y AFND: Para cada AFD existe un AFND
equivalente y viceversa. De hecho los AFD son un caso particular
de los AFND. En la práctica el AFD tiene casi el mismo número de
estados que el AFND, aunque normalmente tiene mas transiciones
• Transformación de AFND en AFD: De todo AFND se puede
obtener un AFD, de tal forma que el lenguaje que reconozca el AFD
sea equivalente al lenguaje reconocido por el AFND. Este concepto
es importante puesto que es la base del siguiente tema, donde se
convertirá el AFND obtenido a partir de una expresión regular en el
AFD equivalente.
Conceptos de AFND
a
ER = a q0 q1
a
ER = λ q0 q1
ER = a* a
(cero o mas
q0
repeticiones
de a)
Conceptos de AFND
ER = a+ = aa* a
(una o mas
q0 a q1
repeticiones de a)
a q1 λ
ER = a|b q0 q3
(Alternativa) b λ
q2
ER = a? = a|λ q1
a λ
(cero o una
q0 q2
instancia de a) λ
ER = ab
a b
(Concatenación) q0 q1 q2
Diagramas de Thomson
r
q0 ……. qn
r λ s
r.s q0 ……. qn qx ……. qy
s
qx ……. qy
r
r λ q0 ……. qn λ
q0 ……. qn
r|s qa qz
s
s
λ qx ……. qy λ
qx ……. qy
r
r
……. qa q0 ……. qn qz
q0 qn r*
λ
Conversión de una ER en un AFN
• Ejemplo: Construir el AFN para la cadena (a|b+)b?
• Paso 1: Hacemos la construcción de Thomson para a.
λ a λ
0 1
• Paso 2: Obtenemos hacemos la construcción de Thomson de b+
(recordemos que es igual que bb*).
λ
b b λ
0 1 1 q2
2 a 3
λ
λ λ
0 1
λ
λ
b b λ λ
4 5 6 7 8
λ
Conversión de una ER en un AFN
• Paso 4: Realizamos b?, que indica cero o una instancia de b
λ 9 b 10
λ
8
2 a 3
λ
λ λ
0 1
λ
λ
b b λ λ λ b
4 5 6 7 8 9 10
λ
λ
Autómatas Finitos Deterministas
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
– No existen λ-transiciones.
No hay que probar varias posibilidades en cada estado.
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
• Ejemplo AFN para (a|b)* abb.
– En lugar de adivinar qué λ-transición debemos tomar, diremos
que el AFN puede tomar cualquiera, y formamos un estado
conjunto: {0, 5, 1} (cierre-λ({1})).
– Ahora tomamos la transición para el carácter a. Desde el
estado 1, podemos alcanzar el 2; y desde el estado 5,
podemos alcanzar el 6. Así, tenemos el estado {2, 6}.
– Si computamos el cierre-λ({2,6}), obtenemos {1, 2, 4, 5, 6}.
2
a λ
λ a b b
0 1 4 5 6 7 8
b
3 λ λ
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
• Definición formal de cierre-λ.
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
• Cálculo de cierre-λ(S).
meter todos los elementos de S en una pila
inicializar cierre-λ(S) a S
mientras la pila no esté vacía hacer
sacar s, el elemento tope de la pila
para cada estado t alcanzable desde s mediante λ hacer
si t no está en cierre-λ(S) entonces
añadir t a cierre-λ(S)
meter t en la pila
fin
fin
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
• Algoritmo para convertir un AFN en AFD.
– Entrada: AFN N.
– Salida: AFD D.
– Método: Se construye una tabla de transiciones tranD para D,
de manera que tranD simula “en paralelo” todos los posibles
movimientos que se pueden dar en N ante una determinada
cadena de entrada.
– Además del cierre-λ, se utiliza la operación mueve(T, a), que
dará como resultado un conjunto de estados del AFN hacia los
cuales existe una transición con el símbolo a desde algún
estado s T.
– Tomamos 0 como el estado inicial del AFN.
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
– Pseudocódigo:
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
2
a λ
λ a b b
0 1 4 5 6 7 8
b
3 λ λ
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Conversión de un AFN en un AFD
• Ejemplo AFN para (a|b)* abb.
– Estado de inicio del AFD es A = cierre-λ({0}) = {0, 1, 5}
b
Símbolo de Entrada
Estado
a b C
b
A B C a b
a b b
B B D A B D E
C B C a
a
D B E a
E B C
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
– Algoritmo.
1. Se construye una partición inicial P del conjunto de
estados con dos grupos: Estados de aceptación F y
estados de no-aceptación S-F.
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
• Minimización de estados de un AFD.
– Algoritmo (cont.).
2. Aplicar el siguiente procedimiento para construir una
nueva partición Pnueva.
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
• Minimización de estados de un AFD.
– Algoritmo (cont.).
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
• Ejemplo de mimimización de AFD para (a|b)* abb.
– Inicialmente, P = (ABCD) (E).
b
Símbolo de Entrada
Estado
a b C
b
A B C a b
a b b
B B D A B D E
C B C a
a
D B E a
E B C
Procesadores de Lenguaje
Autómatas Finitos Deterministas
Minimización de un AFD
• Ejemplo de mimimización de AFD para (a|b)* abb.
– Inicialmente, P = (ABCD) (E).
Símbolo de Entrada b
Estado
b
a b
a b b
A B A
A B D E
a
B B D a
a
D B E
E B A
Procesadores de Lenguaje
Reconocedores y Analizadores Léxicos
• La especificación de un analizador léxico está formada por el
conjunto de patrones que tiene que reconocer y la acción asociada
a cada patrón.
• Concordancia de patrones (AFN).
– AFN para cada pi con nuevo estado s0 y transiciones λ
– Cada pi puede ser un AFN.
λ N(p1)
λ N(p2)
0
···
λ
N(pn)
Procesadores de Lenguaje
Reconocedores y Analizadores Léxicos
– Simulación AFN.
S := cierre-λ(0);
λ N(p1)
a := siguiente_carácter();
mientras a eof hacer 0
λ N(p2)
S := cierre-λ(mueve(S,a));
···
a := siguiente_carácter(); λ
si s S / s F entonces N(pn)
devolver “sí”;
si no devolver “no”;
Procesadores de Lenguaje
Reconocedores y Analizadores Léxicos
Procesadores de Lenguaje