You are on page 1of 27

1

09:19
1
09:19
2
Temas
Funciones del Analizador Lxico
Manejo de buffers de entrada
Especificacin y reconocimiento de tokens
Generacin automtica de Analizadores Lxicos
Objetivos
Que el estudiante logre conocer, comprender y manejar conceptos y
tcnicas vinculados con el Analizador Lxico, para lo cual debe:

Conocer las funciones del analizador lxico.

Aprender a especificar formalmente analizadores lxicos.

Conocer las distintas estrategias de implementacin de
analizadores lxicos.
3
Analizador Sintctico
Programa fuente
Analizador Lxico
Analizador Semntico
Generador de Cdigo Intermedio
Optimizador
Programa Objeto
Generador de Cdigo
Administrador
de la Tabla de
Smbolos
Manejador de
errores
Flujo de tokens o componentes lxicos
rbol sintctico
rbol sintctico
Representacin intermedia
Representacin intermedia
4


Funcin Principal
Leer carcter por carcter de la entrada y elaborar como salida una
secuencia de componentes lxicos (tokens) que utiliza el analizador sintctico
para hacer el anlisis.
Funciones secundarias
Manejar el archivo fuente, es decir, abrirlo, leer sus caracteres y cerrarlo.
Eliminar comentarios y espacios en blanco (espacios, tabuladores y fin de lnea).
Relacionar los mensajes de error con las lneas del programa fuente.
Introducir los identificadores en la tabla de smbolos.
5
Razones para dividir en dos fases
Diseo ms sencillo: los smbolos que trata el analizador lxico se
describen con una gramtica ms simple (gramtica regular) que la del
analizador sintctico (gramtica libre de contexto).
Mejora la eficiencia: gran parte del tiempo de compilacin se consume
en la lectura y exploracin de caracteres. Con tcnicas especializadas de
manejo de buffers se puede mejorar significativamente el rendimiento
del compilador.
Mejora la portabilidad: se pueden tener varias versiones del analizador
lxico una para distintos cdigos (EBCDID, ASCII, ...), con el mismo
analizador sintctico.
6
Token (componente lxico): es un par que consiste en un nombre de token y
un valor de atributo opcional.


Patrn: el conjunto de cadenas de la entrada se describe mediante una regla
llamada patrn asociada al componente lxico.
Un patrn es una regla que describe el conjunto de lexemas. Para describir los
patrones se utiliza la notacin de expresiones regulares.
Lexema: secuencia de caracteres en el programa fuente con lo que concuerda
el patrn para un token. Los lexemas para el token que concuerdan con el
patrn representan cadenas de caracteres en el programa fuente que se pueden
tratar como unidad lxica.
Componentes lxicos comunes en los lenguajes de programacin
Identificadores, Palabras claves, Operadores, Constantes, Cadena de literales, Signos de
puntuacin (parntesis, coma, punto y coma, etc.)
7
Ejemplo: en la proposicin de PASCAL
Const pi = 3.1416;
Componente Lxico Lexema Patrn
Const Const Const
id pi letra (letra/dgito)*
Op-asig = =
const 3.1416 dig
+
(.dig
+
)? (E(+/-)?dig
+
)?
sig-punt ; ;
8
Cuando una secuencia de caracteres (por ejemplo, pi) aparece en el programa
fuente se devuelve al analizador sintctico un token que representa un
identificador.
Pero es necesario que el analizador lxico proporcione informacin adicional
sobre el lexema concreto. Esta informacin adicional se denomina Atributos.
Por ejemplo, el patrn numconcuerda con las cadenas 3.1416 y 0, pero es
indispensable que el generador de cdigo conozca que cadena fue realmente la
que se emparejo.
El analizador lxico recoge informacin sobre los tokens en sus atributos
asociados.
El nombre de un token influye en las decisiones del analizador sintctico, y el
valor del atributo, en la traduccin de los tokens despus del analizador
sintctico.
En la prctica los tokens suelen tener un solo atributo, un puntero a la tabla de
smbolos, donde se guarda informacin del token. El puntero se convierte en el
atributo.
No siempre se necesita un valor de atributo, el nombre del token es suficiente
para identificar al lexema.
9
El Analizador Lxico consumen mucho tiempo para realizar su tarea, por lo que se
introducen buffers para mejorar su rendimiento.
Funcionamiento
El buffer se divide en dos mitades de tamao N (N= un bloque del disco: 1024 o
4096).
E = M * C * * 2
eof
comienzo_lexema delentero
Se leen N caracteres de entrada en cada mitad del buffer con una orden de lectura del
sistema. El carcter eof marca el final del archivo fuente.
Dos punteros: comienzo_lexema y delantero.
Al principio los dos punteros apuntan al primer carcter del prximo lexema que hay que
encontrar.
El puntero delantero va avanzando hasta encontrar concordancia con patrn (un
componente lxico).
Una vez determinado el siguiente lexema, el puntero Delantero se coloca en su carcter
derecho.
Comienzo_lexema y delantero delimitan el lexema.
Despus de procesar el lexema (devolver componente lxico) se ubican comienzo_lexema
en delantero (primer carcter del siguiente)
Cuando termina una mitad, recarga la otra y continua hasta encontrar el siguiente
componente lxico.
10
if delantero est al final de la primera mitad then
begin
recargar la segunda mitad;
delantero: = delantero + 1
end
else
if delantero est al final de la segunda mitad then
begin
recargar la primera mitad;
pasar delantero al principio de la primera mitad
end
else
delantero := delantero + 1;
Algoritmo para avanzar puntero delantero:
11
Si se utiliza el esquema anterior cada vez que se mueva el
puntero delantero se debe comprobar si se ha salido de una
mitad del buffer, si as ocurriera se deber recargar la otra
mitad.
Excepto en los extremos de las mitades del buffer, el cdigo
anterior necesita dos pruebas para cada avance del puntero
delantero.
Se puede reducir estas dos pruebas a una si se ampla cada
mitad del buffer para admitir un carcter centinela al final.
Un centinela es un carcter especial (eof) que no existe en el
programa fuente y se ubica al final de cada mitad.
E = M *
eof
C * * 2
eof
comienzo_lexema delentero
12
delantero: = delantero + 1:
if delantero = eof then
begin
if delantero est al final de la primera mitad then begin
recargar la segunda mitad;
delantero: = delantero + 1
end
else if delantero est al final de la segunda mitad then
begin
recargar la primera mitad;
pasar delantero al principio de la primera mitad
end
else /* eof dentro de un buffer significa el final de la entrada */
terminar el anlisis lxico
end
Algoritmo de recarga de buffers con centinelas:
13
Dos cuestiones:
Cmo especificar los tokens?
Cmo reconocer los tokens?

Especificacin
Todos los elementos bsicos en un lenguaje deben ser
tokens, por lo tanto deben reconocerse.
Los tokens se especifican con Expresiones Regulares.
14
Ejemplo: considere el siguiente fragmento gramatical
prop if expr then prop / if expr then prop else prop /
expr expr oprel termino / termino
termino id / num
Expresin Regular Componente lxico Atributo
if if -----
then then -----
else else -----
letra (letra/dig)* id Puntero a la T.S.
dig
+
(.dig
+
)? (E(+/-)?dig
+
)? num Puntero a la T.S.
< oprel MEN
<= oprel MEI
> oprel MAY
>= oprel MAI
= oprel IGU
<> oprel DIF
delim
+
---- ----
delim = blanco/tab/nueva lnea
15
Como paso intermedio en la construccin de un Analizador Lxico
se produce un diagrama de transicin. Estos diagramas representan
acciones que el analizador lxico debe llevar a cabo para obtener el
siguiente token.

Acciones:
Getchar: leer el siguiente carcter de entrada.
Devuelve (nombre-token, atributo): luego de reconocer un token, el
A.L. devuelve al Analizador Sintctico el token y el atributo.
*: con asterisco se indica que se debe retroceder el puntero de entrada
un smbolo a la izquierda.
16
inicio
0
getchar
1
<
getchar
5
>
getchar
2
=
Devuelve (oprel,MEI)
3
>
Devuelve (oprel,DIF)
4
otro
* Devuelve (oprel,MEN)
6
=
Devuelve (oprel,MAI)
7
otro
* Devuelve (oprel,MAY) 8
=
Devuelve (oprel,IGU)
ER= < / <= / > / >= / = / <>
17
ER= letra (letra/dig)*
Como las palabras claves son secuencias de letras, en vez de realizar diagramas de
transicin para cada palabra clave, se las considera como identificadores. Para ello, se
almacenan, al comienzo, en la Tabla de Smbolos todas las palabras claves.
Cuando se las reconoce se convoca a dos rutinas especiales:
1- obten-Token: busca el lexema en la Tabla de Smbolos. Si el lexema es una palabra
clave devuelve el correspondiente nombre de token, sino, devuelve id.
2- instala-id: examina la Tabla de Smbolos y si encuentra el lexema marcado como una
palabra clave devuelve 0. Si se encuentra el lexema y es una variable del programa se
devuelve un puntero a la Tabla de Smbolos. Si el lexema no se encuentra en la Tabla de
Smbolos se instala como una variable y se devuelve un puntero a la entrada recientemente
creada.
10
Devuelve (obten-Token,
instala-id)
otro
letra/dig
9
letra
getchar
0
getchar
inicio
18
ER=dig
+
(.dig
+
)? (E(+/-)?dig
+
)?
15
* Devuelve (num,
instala-num)
otro
12
otro
* Devuelve (num, instala-num)
19
* Devuelve (num, instala-
num)
otro
E
13
.
getchar
16
E
getchar
17
+/-
getchar
dig
inicio
0
getchar
11
dig
getchar
dig
dig
14
getchar
dig
dig
18
getchar
dig
instala-num: cuando llega a cualquier estado de aceptacin devuelve el nombre del token nun y llama a
la rutina instala-id. Esta rutina introduce el lexema en una tabla de nmeros y devuelve un puntero a la
entrada creada.
19
delim= blanco/tab/nueva lnea
eb = delim
+
21
*
otro
delim
20
delim
getchar
0
getchar
inicio
Cuando el Analizador Lxico llega al estado de aceptacin 21 no devuelve
un nombre de token ni un atributo al Analizador Sintctico.
20
1-Tabla de Transiciones: el Analizador Lxico recorre la
tabla con un bucle ejecutando la sentencia:

Estado := TablaTransiciones [ Estado , Entrada ];
TablaTransicin
s
21
De acuerdo a esta estrategia de implementacin es necesario disponer de una variable de
estado para codificar el estado actual y una batera de casos que describen la lgica de
transicin del autmata finito determnista.
2
otro
letra/dig
1
letra
0
22
Hay pocos errores que el analizador lxico puede detectar ya que tiene
una visin muy restringida de un programa fuente.




Estrategias de recuperacin
Modo de pnico.
Eliminar un carcter del resto de la entrada.
Sustituir un carcter por otro.
Transponer dos caracteres adyacentes.

Los errores que se detectan en esta fase ocurren cuando el Analizador
Lxico no puede proceder, ya que ningn patrn para los tokens
coincide con algn prefijo del resto de la entrada.
23
Existen muchas herramientas para la generacin automtica de AL.
Las ms conocidas:
Lex
Flex

Lex: Generador de analizadores lxicos a partir de expresiones
regulares que definen el comportamiento del analizador.
Genera cdigo en distintos lenguajes de programacin, como C.
Esquema de funcionamiento de LEX:
LEX yylex
Especificaciones
lxicas
24
Esquema de un archivo LEX:
(zona de declaraciones) [cdigo C o macros]
%%
(zona de reglas y acciones)
%%
(zona de rutinas de usuario)

Zona de declaraciones: declaraciones necesarias como: declaracin de
variables, funciones, definiciones regulares.
Ejemplo: Zona de declaraciones
%{
#include <stdio.h>
int y;
%}
digito (0|1|2|3|4|5|6|7|8|9)
letraAB (a|b)
25
Zona de reglas y acciones
P
1
{accin
1
}
P
2
{accin
2
}
...
P
n
{accin
n
}
Donde p
i
es una expresin regular y cada accin es un fragmento del
programa que describe cual ser la accin del Analizador Lxico cuando el
patrn p
i
concuerde con un lexema. Ejemplo
%{
#include <stdio.h>
int cuenta=0;
%}
digito (0|1|2|3|4|5|6|7|8|9)
%%
{digito} {++cuenta}
%%
Zona de rutinas de usuario: contiene las rutinas auxiliares que pueden
necesitar las acciones.
26
Analizador
Lxico
while (a > b) do
a:= a + 1;
Gramticas
Regulares
Expresiones
Regulares
Autmatas
Finitos
Lenguajes
Regulares
G = (V
N
, V
T
, P , S)
A =(Q, , , q
0
, F)
Se puede definir un
lenguaje comenzando con
un nmero finito de
palabras y aplicando
operaciones regulares sobre
ellas. Este mtodo se
conoce como expresiones
regulares.
Leer carcter por carcter de la entrada y
elaborar como salida una secuencia de tokens
que utiliza el analizador sintctico para hacer
el anlisis.
Herramientas para la construccin automtica de
analizadores lxicos como [Lex] [Flex] [JFlex]. Se
basan en la definicin de una coleccin de reglas
patrn-accin.
Obtn siguiente
token
token
27

Alfred Aho, Mnica Lam, Ravi Sethi, Jeffrey Ullman.
Compiladores. Principios, tcnicas y herramientas.
Pearson. Addison Wesley. 2
da.
Edicin (2008).


Kenneth C. Louden. Construccin de compiladores:
principios y prctica. International Thomson Editores
(2004).

You might also like