Académique Documents
Professionnel Documents
Culture Documents
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:
Analizador Lxico
Flujo de tokens o componentes lxicos
Analizador Sintctico
rbol sintctico
Optimizador
Representacin intermedia
Generador de Cdigo
Programa Objeto
3
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.
4
Razones para dividir en dos fases
5
Token (componente lxico): es un par que consiste en un nombre de token y
un valor de atributo opcional.
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.)
Un patrn es una regla que describe el conjunto de lexemas. Para describir los
patrones se utiliza la notacin de expresiones regulares.
6
Ejemplo: en la proposicin de PASCAL
Const pi = 3.1416;
7
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 num concuerda 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.
8
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. 9
Algoritmo para avanzar puntero delantero:
10
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
11
Algoritmo de recarga de buffers con centinelas:
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
12
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.
13
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
= oprel IGU
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.
15
ER= < / <= / > / >= / = / <>
inicio < =
0 1 2 Devuelve (oprel,MEI)
getchar getchar
>
3 Devuelve (oprel,DIF)
otro
4 * Devuelve (oprel,MEN)
>
=
5 6 Devuelve (oprel,MAI)
= getchar
otro
8 7 * Devuelve (oprel,MAY)
Devuelve (oprel,IGU)
16
ER= letra (letra/dig)*
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.
17
ER=dig+ (.dig+)? (E(+/-)?dig+)?
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.
18
delim= blanco/tab/nueva lnea
eb = delim+
delim
getchar getchar
19
1-Tabla de Transiciones: el Analizador Lxico recorre la
tabla con un bucle ejecutando la sentencia:
TablaTransicin
20
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. letra/dig
letra otro
0 1 2
21
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.
22
Existen muchas herramientas para la generacin automtica de AL.
Las ms conocidas:
Lex
Flex
23
Esquema de un archivo LEX:
(zona de declaraciones) [cdigo C o macros]
%%
(zona de reglas y acciones)
%%
(zona de rutinas de usuario)
24
Zona de reglas y acciones
P1 {accin1}
P2 {accin2}
...
Pn {accinn}
Donde pi es una expresin regular y cada accin es un fragmento del
programa que describe cual ser la accin del Analizador Lxico cuando el
patrn pi 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.
25
Gramticas G = (VN, VT, P , S)
Regulares
Autmatas Expresiones
Finitos Regulares
26
Alfred Aho, Mnica Lam, Ravi Sethi, Jeffrey Ullman.
Compiladores. Principios, tcnicas y herramientas.
Pearson. Addison Wesley. 2da. Edicin (2008).
27