Está en la página 1de 9

Ing.

de Sistemas Autmatas y Compiladores

ANLISIS LXICO

El analizador lxico o scanner (en lengua inglesa) lee los caracteres del programa fuente para
agruparlos en palabras o lexemas y luego clasificarlos en componentes lxicos
denominados tokens que sern posteriormente utilizados por el analizador sintctico como
entradas.

Estos componentes lxicos representan:


palabras reservadas: if, while, do, break
identificadores: asociados a variables, nombres de funciones, tipos definidos por el
usuario, etiquetas,... Por ejemplo: velocidad, y11, elsex, _100
operadores: = * + - / ==
smbolos especiales: ; ( ) [ ]
constantes numricas: valores enteros, valores en coma flotante, etc, 982,0xF678,
-83.2E+2,... Universidad Nacional de Trujillo
constantes de caracteres: cadenas de caracteres, hola mundo,...
Comentarios: /** abcde **/

El analizador lxico opera a solicitud del analizador sintctico devolviendo un componente


lxico conforme el analizador sintctico lo va necesitando para obtener una representacin de
la estructura sintctica del programa fuente

componente lxico
programa Analizador Analizador
Lxico obtn siguiente
fuente Sintctico
componente lxico

Tabla de
smbolos

El Scanner suele implementarse como una subrutina del analizador sintctico.


Cuando recibe la orden obtn el siguiente componente lxico, el analizador lxico lee los
caracteres de entrada hasta identificar el siguiente componente lxico.
El scanner realiza tambin otras tareas, tales como:
Administrar el archivo de entrada del programa fuente: abrirlo, leer sus caracteres,
cerrarlo y gestionar posibles errores de lectura.

MSC Marcelino Torres Villanueva -1-


Ing. de Sistemas Autmatas y Compiladores

Eliminar comentarios, espacios en blanco, tabuladores y saltos de lnea (caracteres


no validos para formar un token).
Incluir archivos: # include ...
Expandir macros y funciones inline: # define ...
Contabilizar el nmero de lneas y columnas para emitir mensajes de error.
Reconocer las marcas de fin de archivo, de los archivos que contienen al
programa fuente.
Insertar los identificadores en la Tabla de Smbolos.
Reconocer errores lxicos que ocurren cuando se escribe mal una palabra o
cuando se encuentran caracteres que no pertenecen al alfabeto del lenguaje fuente.

1. DEFINICIONES BSICAS
1) TOKEN:
Categoras sintcticas ms simples del lenguaje fuente que permiten clasificar las palabras
que conforman el lxico del programa fuente.
2) PATRN:
Regla que especifica la secuencia de caracteres que puede representar a un determinado
componente lxico.
3) LEXEMA:
Cadena de caracteres que concuerda con un patrn que describe un componente lxico.
4) ATRIBUTOS:
Informacin adicional sobre los tokens, que es usada por los analizadores sintctico y
semntico. El nmero de atributos depende de cada token. En la prctica, los tokens tienen
un nico atributo: un registro que contiene toda la informacin propia de cada caso (lexema,
tipo de dato, valor, etc).
Ejemplo:

Componente lxico Lexema Patrn


identificador indice , a, temp Letra seguida de letras o dgitos
numero_entero 1492, 1, 2 Dgito seguido de ms dgitos
if if Letra i seguida de letra f
do do Carcter /
op_div
Universidad
/
Nacional de Trujillo
Carcter =
op_asig =

2. FUNCIONAMIENTO DEL ANALIZADOR LEXICO


Cada vez que el analizador sintctico llama al scanner ste debe leer caracteres desde donde
se qued en la anterior llamada hasta completar un nuevo lexema, para luego clasificarlo
segn una categora de token y devolver el par (token, lexema).
El analizador lxico almacena el lexema que se acaba de reconocer para ser usado
posteriormente en el anlisis semntico (completar la tabla de smbolos); y codifica los
componentes lxicos como enteros.
Cuando el scanner intenta reconocer tokens no especficos (identificadores, nmeros, etc.), el
analizador debe leer caracteres hasta que lea uno que no pertenece a la categora del token
que est leyendo; ese ltimo carcter no puede perderse, y debe devolverse al buffer de
entrada para ser ledo en primer lugar la prxima vez que se llame al analizador lxico.

Ejemplos:

Obtener los pares token-lexema que devolvera un analizador de lxico ante las
expresiones:
Expresin:
654 b * 30/5.07
(TKN_ENTERO, 654)
(TKN_OPRES, -)
(TKN_ID, b)

MSC Marcelino Torres Villanueva -2-


Ing. de Sistemas Autmatas y Compiladores

(TKN_OPMUL, *)
(TKN_ENTERO, 30)
(TKN_OPDIV, /)
(TKN_REAL, 5.07)

Expresin:
printf(Resultado: %d\n, 25);
(TKN_PRINTF, printf)
(TKN_PARI, ()
(TKN_STR, Resultado: %d\n)
(TKN_NUM, 25)
(TKN_COMA, ,)
(TKN_PARD, ))
(TKN_PYC, ;)

3. CONSTRUCCIN DE UN ANALIZADOR DE LXICO


3.1. PROBLEMAS
No saber que tipo de componente lxico debemos reconocer despus de leer el
primer carcter.
o Si el componente lxico comienza con b es un identificador?
o Si el componente lxico comienza con 2 es una constante entera?
o Es difcil escribir correctamente el reconocedor de componentes lxicos, ms
difcil que darle mantenimiento.
o Se requiere un enfoque muy bien sustentado: un analizador lxico que
entregue eficiente y automticamente los componentes lxicos.
3.2. ANALIZADORES LEXICOS Vs. AUTOMATAS FINITOS
La tcnica inicial para construir un analizador lxico consiste en disear un AFD que
reconozca las ERs asociadas a los componentes lxicos del lenguaje, de forma que en cada
estado final se devuelva el componente lxico reconocido.
Los analizadores lxicos usan el mismo mecanismo que los autmatas finitos, pero:
Contienen las descripciones para mltiples componentes lxicos (tokens).
Tienen un flujo de caracteres de entrada.
Devuelven una secuencia Universidad Nacional
de tokens (o dedeTrujillo
mensajes error) a la salida.
Siempre devuelve el token ms largo coincidente.
Si existen varios tokens coincidentes, usa reglas de prioridad.
3.3. FASES EN EL DISEO DEL ANALIZADOR LEXICO
1) Identificar los tokens
Determinar las categoras de tokens.
Determinar el patrn asociado a cada token, especificndolo mediante expresiones
regulares.
2) Construir el AFD que reconoce las ER asociada a cada token.
3) Combinar los AFDs de todas las ERs en un nico AFD mnimo equivalente cuyo DT tiene
las siguientes diferencias:
El DT debe leer caracteres hasta completar un token, para luego retornar (en los
estados de aceptacin) el token que ha reconocido y dejar el buffer de entrada
preparado para la siguiente llamada.
El DT no puede tener estados de absorcin (para cadenas incorrectas en
AFDs) ni de error (se considerar que las entradas para las que no hay una transicin desde
cada estado son error).
De los estados de aceptacin de un DT no deben salir transiciones.
En el caso de las cadenas no especficas, necesitamos otro estado al que ir cuando se lea un
carcter que no pueda formar parte del patrn. En este ltimo estado se debe devolver al
buffer de entrada el carcter ledo (que puede ser parte del siguiente token), lo cual se indica
marcando el estado con un asterisco, y se debe retornar el token correspondiente a ese
estado de aceptacin. Por ejemplo, para reconocer nmeros enteros, con un AFD
necesitamos solamente dos estados; con un DT necesitamos otro estado al que ir cuando se
lea un carcter que no forma parte del nmero.

MSC Marcelino Torres Villanueva -3-


Ing. de Sistemas Autmatas y Compiladores

[0-9] [0-9]
[0-9] [0-9] otro
0 1 0 1 2 *Entero
AFD DT

3.4. IMPLEMENTACIN DE ANALIZADORES LXICOS


Existen tres posibilidades para crear un analizador lxico:
1) Programa simulador del AFD y Tabla de Transiciones
Para disear un analizador lxico basndose en una tabla de transiciones, se debe inicializar
una variable al estado inicial y repetidamente actualizar esta variable con la informacin de la
tabla cada vez que se lee un smbolo de entrada, hasta que se alcance el final del lexema que
est siendo analizado.

Entradas
estado + - D token Retroceso
0 1 8 6 - -
1 3 2 2 - -
2 - - - SUMA 1
3 5 4 4 - -
4 - - - SUMA 2
5 - - - 2INCR 0
6 7 7 6 - -
7 - - - ENTERO 1
8 error error - - -

2) Programa simulador del Diagrama de Transiciones


Traduccin del diagrama de transiciones determinista a pseudo cdigo, donde el AFD se
desempea como un diagrama de flujo (los estados del AFD estn implcitos en el algoritmo).

Universidad Nacional de Trujillo


blancos digito
1
digito letra 1 Nmero entero
o digito 2 identificador de palabra reservada
0 letra 2 3 op relacional menor
( 4 op relacional menor igual
. + < = 4
) 5 op relacional diferente
- 3 6 op relacional mayor
12
, * > > 5 7 op relacional mayo igual
; / = 9 asignacin
= 10 operador aritmtico
6 11 signo de puntuacin
7
11 10 12 parntesis

8 = 9

3) Utilizacin de un constructor de analizadores de lxico


Se automatiza la implementacin del analizador lxico. Solo necesitamos especificar:
Las expresiones regulares para los tokens.
Reglas de prioridad para los casos en que varios tokens coincidan.
Acciones asociadas para cada expresin regular.
*Ventaja: comodidad y rapidez en el desarrollo.
*Inconveniente: ineficiencia del analizador resultante y complicado mantenimiento

MSC Marcelino Torres Villanueva -4-


Ing. de Sistemas Autmatas y Compiladores

del cdigo generado.

3.5. TRATAMIENTO DE LAS PALABRAS RESERVADAS


Definir cada palabra reservada como un token y representarlo en el DT.
Incluir todas las palabras reservadas en una tabla, y cuando el analizador lxico
reconozca un identificador, comprobar si se trata de una palabra reservada:
o Si lo es, pasar al analizador sintctico el cdigo asociado a la palabra
reservada como token, y atributo.
o Si no lo es, se trata de un identificador, procediendo a su insercin en la Tabla
de Smbolos en caso de que no est en ella, pasando al analizador sintctico
el token identificador y como atributo su direccin en la TS.
<letra>,<digito>

<letra> $
Inicio 0 1 2 return id_palreser(yytext)

DT
Otra opcin consiste en inicializar la tabla de smbolos con todas las palabras
reservadas (por orden alfabtico para
Universidad facilitar
Nacional de la posterior bsqueda y acceso).
Trujillo
Cuando encuentre un identificador se busca en la tabla de smbolos.
SI lo encuentra en la zona reservada para ellas ENTONCES es una palabra
reservada. SI NO, ser un identificador, que, como tal, ser aadido a la tabla de
smbolos.

3.6. PRIORIDAD DE TOKENS


Por otro lado, lo normal cuando se construye un analizador lxico es establecer criterios para
dar ms prioridad a unos tokens que a otros. Criterios:
Dar prioridad al token para el que encontramos el lexema ms largo. Por ejemplo: DO
/ DOT, el generador se quedara con el ms largo (DOT) como identificador (otro
ejemplo: > y >= se debe quedar con el segundo).
Si el lexema es el mismo que se puede asociar a dos tokens (patrones), estos
patrones estarn definidos en un orden, as se asociar al que est primero.

MSC Marcelino Torres Villanueva -5-


Ing. de Sistemas Autmatas y Compiladores

Ejemplo:
Si en la especificacin lxica aparecen (entre otras) las expresiones regulares
while Palabra reservada
while letra(letra|digito)* Identificador
Si en la entrada aparece el lexema while, este puede ser generado por ambas expresiones
regulares, pero como est primero la de la palabra reservada, el analizador lxico debe
devolver dicho token, no el de identificador. Si estas especificaciones aparecieran en el orden
inverso:
letra(letra|digito)* Identificador
while Palabra reservada while
Entonces, el analizador lxico debera devolver siempre el token identificador y no devolver
nunca la palabra reservada while (lo cual no suele ser prctico).

4. TRATAMIENTO DE ERRORES LEXICOS


Son pocos los errores que se pueden detectar en esta fase debido a la visin restringida que
tiene el analizador de lxico del programa fuente.
Si aparece la palabra fi en el archivo fuente en lugar de la palabra if, el analizador lxico
ser incapaz de detectar dicha anomala, devolviendo que ha obtenido un identificador,
debiendo ser detectado el error en la fase de anlisis sintctico.
Los errores que tpicamente detecta el analizador lxico son:
Utilizar caracteres que no pertenecen al alfabeto del lenguaje.
Hallar una cadena que no coincide con ninguno de los patrones de los tokens.
Las posibles acciones ante una situacin de error son:
Rechazar los caracteres ledos (lexema) y volver al estado inicial o al estado final
previo si existe.
Modo Pnico: ignorar los caracteres siguientes hasta alcanzar uno que permita una
transicin desde el estado actual.
Acciones de recuperacin inteligente:
o Borrar un carcter extrao.
o Insertar un carcter que falta.
o Reemplazar un carcter incorrecto.
o Intercambiar dos Universidad Nacional de Trujillo
caracteres adyacentes.

MSC Marcelino Torres Villanueva -6-


Ing. de Sistemas Autmatas y Compiladores

EJERCICIOS

1. Construir un DT para el reconocimiento de nmeros enteros con signo negativo o sin


signo y los operadores suma (+) y doble incremento (+++).
Componentes lxicos:
Notacin: d = dgito; t = otro.
Entero -?d+
Suma +
Dobleincremento +++
NOTA: El estado de aceptacin del token doble incremento no lleva asterisco por ser
cadena especfica y no ser prefijo de ninguna otra, y por tanto no necesita leer el siguiente
carcter y retroceder. Los estados de aceptacin del token suma si llevan el asterisco a
pesar de ser especficas, por ser prefijos del doble incremento. Adems, uno de ellos
lleva dos asteriscos, indicando que si se llega a ese estado se debe retornar el token
suma y devolver dos caracteres al buffer de entrada.

2. Construir un DT para el reconocimiento de identificadores, nmeros enteros sin signo y


las palabras reservadas do y done.
Notacin: d = dgito; l = letra; t = otro; f = otro alfanumrico (dgito o letra); a n = ir al
estado Componentes lxicos:
Identificador l(l|d)*
Entero d+
Do do
Done done
NOTA: En este DT, todos los estados de aceptacin deben estar marcados con asterisco,
por lo que habr que devolver el ltimo carcter ledo al buffer de entrada. Esto es
debido,para este ejercicio, a que todos los tokens son unos prefijos de otros (do, done,
identificador) o son cadenas no especficas (entero e identificador).

3. Disear un DT para el reconocimiento de tokens involucrados en expresiones aritmticas


(operadores: ?-, +, *?, /, ( y )) en las que intervienen nmeros enteros y reales sin
signo y variables expresadas mediante identificadores.
Universidad Nacional de Trujillo
Notacin: d = dgito; l = letra; a = alfanumrico (dgito | letra); t = otro.
Componentes lxicos:
Entero d+
Real d+.d+
Identificador l(l|d)*
Opsuma +
Opresta -
Opmul *
Opdiv /
Parder )
Parizq (
NOTA: El patrn de los enteros es un prefijo del patrn de los reales, por lo que se
construye para ambos una misma rama del autmata en la que aparecer un estado de
aceptacin que surge de un estado intermedio para los enteros y otro final para los reales.
En este caso, todos los estados de aceptacin llevan asociado el reconocimiento de un
token distinto. Aquellos que estarn marcados con * para que el reconocimiento de esos
tokens se produzca cuando se ha ledo uno o ms caracteres ms all del final del
lexema correspondiente a dicho patrn, por lo que llevan como accin asociada el
retroceso de la marca de anlisis sobre el buffer de entrada.
4. Sea un lenguaje de caractersticas similares al HTML para el que se ha definido los
siguientes componentes lxicos:

Patrn (ER) Token


<b> NEGRITA

MSC Marcelino Torres Villanueva -7-


Ing. de Sistemas Autmatas y Compiladores

</b> CIERRA_NEGRITA
<i> CURSIVA
</i> CIERRA_CURSIVA
<a> REFERENCIA
</a> CIERRA_REFERENCIA
ftp:// FTP
http:// HTTP
telnet:// TELNET
gopher:// GOPHER
letra+ IDENTIFICADOR

Construir el autmata finito que permita reconocer los tokens antes indicados.

5. Identificar los lexemas y los tokens que el analizador de lxico reconocera en el siguiente
programa de lenguaje Pascal.

function max (i,j: integer):integer;


{ Devuelve el valor mximo de dos enteros }
begin
if i>j then max:=i
else max := j
end;

6. Disear un diagrama de transiciones determinista para reconocer los siguientes


componentes lxicos:
letras cualquier secuencia de una o ms letras (maysculas y minsculas)
entero cualquier secuencia de uno o ms dgitos
explos1 la palabra reservada bang
explos2 la palabra reservada boom
true la secuencia :-)
false la secuencia :-(
asignar la secuencia :=
Universidad
TOKEN Nacional de Trujillo
E.R.
---------------------
Letras [a-zA-Z]+
Entero [0-9]+
Explos1 bang
Explos2 boom
Trae :-)
False :-(
Asignar :=
7. Dada la siguiente sentencia:

(defun suma-conjuntos (c1 c2 &aux (c3 c2) (cant (length c1)))


(do* ((i 0 (+ i 1)) (e (nth 0 c1) (nth i c1)))
((= i cant) c3)
(unless (member e c3)
(push e c3)
)
)
)
Se pide:
a) Determinar los tokens que debe reconocer el analizador lxico.
b) Definir los patrones lxicos (E.R.) de cada token.
c) Construir el autmata que reconoce el conjunto de tokens.

MSC Marcelino Torres Villanueva -8-


Ing. de Sistemas Autmatas y Compiladores

8. HTML es el lenguaje que se utiliza para especificar contenidos Web. Su funcionamiento


se basa en utilizar una serie de etiquetas que indican de qu forma se debe representar
dicho texto en pantalla. Especificar un analizador lxico que reconozca los elementos
lxicos que aparecen en el siguiente ejemplo:
<HTML>
<HEAD>
<TITLE> Ejemplo de compiladores </TITLE>
</HEAD>
<BODY>
<!-- Esto es un comentario -->
<HR>
<H1>Titulo1</H1>
<H2>Titulo2</H2>
<H3>Titulo3</H3>
<P>Esto es un prrafo</P>
<H4>Titulo4</H4>
<H5>Titulo5</H5>
<H6>Titulo6</H6>
<UL>
<LI> Uno </LI>
<LI> Dos </LI>
<LI> Tres </LI>
</UL>
</BODY>
</HTML>
a) Especificar el conjunto de tokens que debe reconocer el analizador, indicando (token,
lexema).
b) Especificar el patrn lxico (expresin regular) que define cada posible token del
lenguaje.
c) Construir el autmata que reconoce el lenguaje anterior.

Universidad Nacional de Trujillo

MSC Marcelino Torres Villanueva -9-

También podría gustarte