You are on page 1of 42

Procesadores de lenguaje

Tema 2 Anlisis lxico


Salvador Snchez, Daniel Rodrguez
Departamento de Ciencias de la Computacin
Universidad de Alcal de Henares

Resumen del tema


Objetivo: comprender la estructura, organizacin y
funcionamiento general del analizador lxico.
Contenidos:
Formalismos de especificacin lxica:
Expresiones regulares
Autmatas finitos
Tratamiento de errores lxicos y palabras reservadas
Construccin de un analizador lxico
Generadores automticos de analizadores lxicos

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Descripcin de un analizador lxico


Un analizador lxico lee carcter a carcter del programa
fuente y genera una secuencia de componentes lxicos
(tokens) que corresponden a unos patrones a los que
asocia, si es necesario, unos atributos.
__________
__________
__________
__________
__________

Programa
fuente

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Tareas Analizador Lxico


Reconocer los componentes lxicos en la entrada.
Eliminar los espacios en blanco, los caracteres de
tabulacin, los saltos de lnea y de pgina y otros
caracteres propios del dispositivo de entrada.
Eliminar los comentarios de entrada.
Detectar errores lxicos.
En lenguajes de programacin, adems:
Reconocer los identificadores de variable, tipo, constantes, etc. y
guardarlos en la tabla de smbolos.
Relacionar los mensajes de error del compilador con el lugar en el que
aparecen en el programa fuente (lnea, columna, etc.).

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Necesidad de un analizador lxico


Al comparar las expresiones
a:=b*7+4;
a:=b*7+4;
La estructura de las dos expresiones es equivalente,
La posicin de los caracteres que las componen, aunque siguen el
mismo orden, son diferentes.

Si las distintas fases del compilador tuvieran que trabajar


con los caracteres directamente sera ms complicado
descubrir la estructura de un programa.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Independencia de lxico y sintctico


El analizador lxico suele convertirse en una subrutina
del analizador sintctico.
Varias razones para su independencia:
- Se simplifica el diseo del analizador sintctico.
- Se consigue un compilador ms eficiente
- Un sistema de entrada optimizado aumenta la velocidad de lectura.
- Aade portabilidad al compilador: independencia del alfabeto.

Se comunican mediante:
Buffer intermedio.
Llamada a subrutina.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Conceptos bsicos
Token (o componente lxico): Secuencia de caracteres
con significado sintctico propio.
Lexema: Secuencia de caracteres cuya estructura se
corresponde con el patrn de un token.
Patrn: Regla que describe los lexemas
correspondientes a un token.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Componentes lxicos
En la mayora de los lenguajes de programacin, se consideran
componentes lxicos (tokens):

palabras reservadas
operadores (de comparacin, asignacin, lgicos, aritmticos )
identificadores
constantes
signos de puntuacin (parntesis, punto y coma )
marcas de comienzo y fin de bloque

Los delimitadores no sern considerados, en general, tokens.


Cuando un patrn puede concordar con ms de un lexema es
necesario conocer informacin adicional:
Esta informacin se almacena como atributos del token.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Descripcin de un analizador lxico


El anlisis lxico es un anlisis de los caracteres
Parte de stos y por medio de patrones reconoce los lexemas
Enva al analizador sintctico el componente lxico y sus atributos
Puede hacer tareas adicionales: eliminar blancos, control lneas

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

El analizador lxico como interfaz


El analizador lxico y el sintctico forman un par
productor-consumidor.
En algunas situaciones, el analizador lxico tiene que leer
algunos caracteres por adelantado para decidir de qu
token se trata.
Lee carcter

Analizador
lxico

Entrada
Reinserta
carcter

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

token

Analizador
sintctico

Ejemplo
Para la sentencia en Pascal:
IF x < 10 THEN x := x + y

El analizador lexicogrfico dara como resultado inicialmente la


siguiente cadena de caracteres:
<79> <12> <28> <13> <80> <12> <65> <12> <34> <12>

O lo que es lo mismo:
if identificador op_menor literal_entero then identificador
asignacin identificador op_suma identificador
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Ejemplo
El resultado final sera:
<79,-> <12,32> <28,-> <13,10> <80,-> <12,32>
<65,-> <12,32> <34,-> <12,33>

Es decir:
<if,-> <identificador,32> <op_menor,->
<literal_entero,10> <then,-> <identificador,32>
<asignacin,-> <identificador,32> <op_suma,->
<identificador,33>

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Atributos

Los identificadores tienen asociados como atributos el lugar de la


tabla de smbolos donde se han guardado:
< identificador, 32 >

A veces el analizador sintctico es el nico que maneja la tabla de


smbolos, en ese caso llevan asociado el propio lexema:
< identificador, x >

Los literales tienen asociados como atributos el propio lexema:


< literal_entero, 10 >

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Errores lxicos
El analizador lxico rechaza texto con caracteres ilegales (no
recogidos en el alfabeto) o combinaciones ilegales. Ejemplos:

, (caracteres que no pertenecen al alfabeto del lenguaje)


:=, ::: (no coinciden con ningn patrn de los tokens posibles)

Se debe mostrar un mensaje de error claro y exacto.


En vez de
Error 124
Falta declaracin
Error en la lnea 85
Se ha producido un error
Sera mejor
int nmero = 1 ;
^
ERROR 124: lnea 85, columna 6, carcter no vlido
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Recuperacin de Errores lxicos


Posibles acciones del analizador lxico para detectar
errores, recuperarse y seguir trabajando:
Modo de pnico: Ignorar los caracteres no vlidos hasta un carcter en
el cual se considera que podra empezar un lexema correcto.
Distancia mnima de correccin de un error, i.e., recuperacin
inteligente con correcciones como:
Borrar los caracteres extraos.
Insertar un carcter que pudiera faltar.
Reemplazar un carcter incorrecto por uno correcto.
Conmutar las posiciones de dos caracteres adyacentes.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Especificacin de componentes lxicos


Alfabeto: Conjunto finito de smbolos.
Cadena sobre un alfabeto: secuencia finita de smbolos
de ese alfabeto.
Cadena vaca:
Operaciones con cadenas: concatenacin y exponenciacin

Lenguaje: conjunto de cadenas sobre un alfabeto.


Operaciones con lenguajes: Unin, Concatenacin, Cerradura de
Kleene (Cierre *) y Cerradura positiva (Cierre +)

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Expresiones regulares

Notacin que facilita la especificacin de lenguajes.


: cadena vaca
a: cadena a si a alfabeto.
Si r y s son cadenas que pertenecen respectivamente a los lenguajes
L(r) y L(s), son expresiones regulares:
r|s L(r) U L(s)
rs L(r)L(s)
r* (L(r))*

Abreviaturas:

0 ms a*
1 ms aa* a+
0 1 | a a?
clases de caracteres a | b | c [abc] . Tambin: a | b | c | ... | z [a-z]
Los parntesis agrupan subexpresiones: (a|b|c)*

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Ejemplos
0(0|1)0*: 010, 000, 010000, 01, etc.
a(ab)+b*: aab, aababb, aabbbbb, aababababbb, etc.
[1-9]?0 : 0, 10, 20, 30,..., 90
[a-zA-Z]
[0-9]+
[a-zA-Z]([a-zA-Z]|[0-9])*
[0-9]+(.[0-9]+)?
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Definiciones regulares
Nombre que se da a una expresin regular por
conveniencia, definindola como si fuera un
smbolo:
Letra  [a-zA-Z]
Dgito  0|1|2|3|4|5|6|7|8|9
Identificador  Letra(Letra|Digito)*
NmeroReal  Digito+(.Digito+)?

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Definiciones regulares

Dgito [0-9]
Dgitos Digito+
Fraccin (.Dgitos)?
Exponente (E(+|-)?Dgitos)?
NmeroReal Dgitos Fraccin Exponente
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Diagramas de transiciones
Compuestos por estados y transiciones entre stos
Crculos: estados
Arcos etiquetados: transiciones

Sirven para representar lo que sucede a medida que se


toman caracteres de la entrada
Cada crculo = un estado
Cada arista = un carcter en la entrada
Doble crculo = aceptacin de un elemento lxico
Asterisco = el ltimo carcter se debe devolver a la entrada (retroceso)
Otro = cualquier carcter no asignado a otra flecha

No tiene estados de error (sin transicin = error)


Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Autmatas finitos deterministas (AFD)


Son diagramas de transiciones generalizados.
Un reconocedor de un lenguaje es un programa que dice
si una cadena pertenece o no a un lenguaje.
Toda expresin regular puede reconocerse mediante un
autmata finito determinista (AFD)
Se emplean autmatas por la sencillez de programar
cdigo que simule su funcionamiento.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Diagramas de transiciones

NmeroEntero Digito+

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Diagramas de transiciones

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Diagramas de transiciones
Identificador  Letra(Letra|Digito)*

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Diagramas de transiciones
Not-Nul-New (Pascal)
t|T
o|O
u|U

n|N
0

e|E

l|L

otro
7

w|W

otro

otro

10

4 Reconocer not
7 Reconocer nul
10 Reconocer new
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

*
*

Prioridad de los tokens


Se da prioridad al token con el lexema ms largo:
Si se lee >= y > se reconoce el primero.

Si el mismo lexema se puede asociar a dos tokens, estos


patrones estarn definidos en un orden determinado.
Ejemplo:
while palabra reservada while
letra (letra | digito)* identificador
Si en la entrada aparece while, se elegir la palabra reservada por
estar primero.
Si estas especificaciones iniciales aparecieran en orden inverso, se
reconocera un token identificador
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Tratamiento de palabras reservadas


Son aquellas que los lenguajes de programacin
reservan para usos particulares.
Cmo diferenciarlas de los identificadores?
Resolucin implcita: reconocerlas todas como identificadores,
utilizando una tabla adicional con las palabras reservadas que
se consulta para ver si el lexema reconocido es un identificador
o una palabra reservada.
Resolucin explcita: se indican todas las expresiones regulares
de todas las palabras reservadas y se integran los diagramas de
transiciones resultantes de sus especificaciones lxicas en la
mquina reconocedora.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Tratamiento de palabras reservadas


Resolucin explcita:
[fF][oO][rR] return (TOKEN_FOR)
[wW][hH][iI][lL][eE] return (TOKEN_WHILE)
...
[a-zA-Z]([a-zA-Z0-9])* return (TOKEN_IDENTIFIER);
Inconvenientes:
Se alarga mucho el cdigo.
Se hace ms difcil de leer.
El autmata generado tiene muchos ms estados.
La ejecucin es ms lenta.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Tratamiento de palabras reservadas


Resolucin implcita (1): se crea una tabla de palabras clave que se
consulta cada vez que se encuentra un identificador para ver si es
una palabra clave o no.
[azAZ]([azAZ09])

if is_keyword(yytext, kw) then


return(kw)
else
return(TK_IDENTIFIER);

Las palabras clave se tratan como un caso particular del patrn de


los identificadores. Cuando se detecta un identificador:
Se comprueba si es una palabra clave.
Si no lo es, se trata de un identificador, y hay que comprobar si ya est
introducido en la tabla de smbolos.
Si no est en la tabla de smbolos, hay que darle de alta y retornar un testigo
identificador.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Tratamiento de palabras reservadas


Resolucin implcita (2): Se inicializan las primeras posiciones de la tabla de
smbolos con las palabras clave.
Cuando se encuentra un identificador, se consulta la tabla de smbolos:
Si se encuentra en la zona inicial reservada, es una palabra clave y se retornar su token.
Si se encuentra en la parte final de la tabla, se trata de un identificador que ya se haba
encontrado anteriormente.
Si no se encuentra, hay que aadirla como nuevo identificador.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Construccin de un analizador lxico


Los analizadores lxicos pueden construirse:
Usando generadores de analizadores lxicos: Es la forma ms sencilla
pero el cdigo generado por el analizador lxico es ms difcil de
mantener y puede resultar menos eficiente.
Escribiendo el analizador lxico en un lenguaje de alto nivel: permite
obtener analizadores lxicos con ms esfuerzo que con el mtodo
anterior pero ms eficientes y sencillos de mantener.
Escribiendo el analizador lxico en un lenguaje ensamblador: Slo se
utiliza en casos especficos debido a su alto coste y baja portabilidad.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Implementacin en leng. de alto nivel


Consiste en implementar el diagrama de transiciones
mediante la construccin de su tabla de transiciones.
filas: estados del diagrama de transiciones
columnas: posibles entradas

Se puede tambin implementar directamente, utilizando


estructuras de seleccin mltiple (switch) para leer
caracteres hasta completar el token.
Modelo mixto:
seleccin mltiple para los elementos lxicos de estructura ms sencilla
diagrama de transiciones para el resto (cadenas no especficas, prefijos
comunes, etc.)
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Implementacin en leng. de alto nivel

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Generador automtico (LEX)


Recibe la especificacin de las expresiones regulares de
los patrones que representan a los tokens del lenguaje y
las acciones a tomar cuando los detecte.
Genera los diagramas de transicin de estados en cdigo
C , C++ o Java generalmente.
Ventaja: Comodidad de desarrollo.
Desventajas:
El mantenimiento del cdigo generado resulta complicado.
La eficiencia del cdigo generado depende del generador.
Procesadores de lenguaje Tema 2: Anlisis lxico
Salvador Snchez, Daniel Rodrguez

Generador automtico (LEX)


Parte de un conjunto de reglas lxicas (expresiones
regulares) y produce un programa que reconoce las
cadenas que cumplen dichas reglas
JLex produce un programa Java que tras compilarse da como resultado
la clase Yylex: implementacin del AFD

A cada regla se asocian un conjunto de acciones.


Cuando Yylex encuentra una cadena que cumple un regla ejecuta las
acciones asociadas a esa regla.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Seccin de reglas lxicas


La 3 seccin del fichero de especificacin contiene las
reglas que extraen tokens del fichero de entrada. Cada
regla consta de:
1.Lista opcional de estados
2.Expresin regular
3.Accin lxica
[Lista_de_Estados] [Expresin_Regular] [Accin_Lxica]

Ej:
[a-zA-Z][a-zA-Z_0-9]*

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

{System.out.println
("Identificador");)

Acciones Lxicas
Las acciones lxicas consiste en cdigo Java entre llaves:
{ Cdigo_Java }
Valores lxicos:
 yytext(): Funcin que nos retorna el lexema de entrada identificado.
 yychar: Entero que contiene la posicin, dentro el fichero de entrada,
del primer carcter del lexema actual.
 yyline: Entero con el nmero de lnea donde se encuentra
 Ej.: [a-zA-Z][a-zA-Z_0-9]*
{System.out.print ("Identificador:"+ yytext());}

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Estados
Es posible encontrar varios componentes con diferentes significados
en funcin del lugar donde aparezcan dentro del fichero de entrada.
Ej., en C: int var1; /* var1 */
[<ESTADO1 [,ESTADOn ...]]>] regla_con_estado { accin }

El comportamiento del analizador lxico ser el siguiente:


Si el analizador se encuentra en el ESTADO, la regla regla_con_estado estar
activada, i.e., se comparar su correspondencia con los lexemas de entrada.
Si el analizador no se encuentra en ninguno de los estados <ESTADOi>, la regla
regla_con_estado no estar activada, i.e., no se comparar su
correspondencia con los lexemas de entrada.
Si una regla no contiene ningn estado en su lista previa de estados, la regla
estar siempre activa.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Estados - Ejemplo

<YYINITIAL>"/*"
{ yybegin (CCOMMENT); }
<CCOMMENT>[^*]*"*/" { System.out.println ("Comentario: <" +
yytext().substring(0,yytext().length()2)+">");
yybegin (YYINITIAL); }
<YYINITIAL>[^/]*
{ }

Este analizador detecta comentarios del estilo /* */

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

El proceso de implementacin
Definir las expresiones regulares del analizador lxico
Identificar los tokens (cdigos y atributos)
Construir los diagramas de transiciones (AFD)
Completar los autmatas con acciones semnticas
Definir todos los posibles errores
Implementar el AFD y las acciones semnticas usando
switch o tablas de transiciones
Expresin
Regular

Autmata

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez

Diagrama de
transiciones

Programa

Bibliografa
Bsica:
Compiladores: principios, tcnicas y herramientas. A.V.
Aho, R. Sethi, J.D. Ullman. Addison-Wesley Iberoamerica.
1990.

Complementaria:
Construccin de compiladores: Principios y prctica. K. C.
Louden. Thomson-Paraninfo. 2004.

Procesadores de lenguaje Tema 2: Anlisis lxico


Salvador Snchez, Daniel Rodrguez