Vous êtes sur la page 1sur 27

09:19 1

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.
2
Programa fuente

Analizador Lxico
Flujo de tokens o componentes lxicos

Analizador Sintctico
rbol sintctico

Administrador Analizador Semntico Manejador de


de la Tabla de rbol sintctico errores
Smbolos
Generador de Cdigo Intermedio
Representacin intermedia

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

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.

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.)

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.

6
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 ; ;

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:

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;

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

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


14
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.

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

inicio letra otro


0 9 Devuelve (obten-Token,
10
instala-id)
getchar getchar

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

inicio dig otro * Devuelve (num, instala-num)


0 11 12
dig
getchar getchar
. dig otro * Devuelve (num,
13 14 15 instala-num)
getchar getchar
E dig
E
+/- dig otro * Devuelve (num, instala-
16 17 18 19 num)
getchar getchar dig getchar

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

inicio delim otro


0 20 21 *

getchar getchar

Cuando el Analizador Lxico llega al estado de aceptacin 21 no devuelve


un nombre de token ni un atributo al Analizador Sintctico.

19
1-Tabla de Transiciones: el Analizador Lxico recorre la
tabla con un bucle ejecutando la sentencia:

Estado := TablaTransiciones [ Estado , Entrada ];


s

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.

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.

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

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:

Especificaciones LEX yylex


lxicas

23
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)

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

while (a > b) do Lenguajes


a:= a + 1; Regulares

Autmatas Expresiones
Finitos Regulares

A =(Q, , , q0, F) Se puede definir un


lenguaje comenzando con
Analizador Leer carcter por carcter de la entrada y
un nmero finito de
palabras y aplicando
Lxico elaborar como salida una secuencia de tokens operaciones regulares sobre
que utiliza el analizador sintctico para hacer ellas. Este mtodo se
el anlisis. conoce como expresiones
regulares.
Obtn siguiente token
token
Herramientas para la construccin automtica de
analizadores lxicos como [Lex] [Flex] [JFlex]. Se
basan en la definicin de una coleccin de reglas
patrn-accin.

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

Kenneth C. Louden. Construccin de compiladores:


principios y prctica. International Thomson Editores
(2004).

27

Vous aimerez peut-être aussi