Sei sulla pagina 1di 17

COMPONENTES LEXICOS, PATRONES Y LEXEMAS

Los lexemas son caracteres o conjuntos de caracteres (palabras) que pertenecen


al lxico del lenguaje.
En lo que lexema se refiere a:
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.
Los patrones son reglas que describen un conjunto de lexemas que pueden ser
representados por determinados componentes lxicos en el anlisis sintctico.
Los componentes lxicos son las unidades sintcticas o terminales para la
gramtica que define la estructura sintctica del lenguaje.
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.)
Los atributos son las informaciones adicionales para cada componente lxico que
sern utilizadas en el anlisis semntico o en la traduccin. Habitualmente los
atributos que se guardan en la tabla de smbolos son relativos a los
identificadores.
En la mayora de los lenguajes de programacin, se consideran componentes
lxicos las siguientes construcciones:

Las palabras reservadas

Los operadores (de comparacin, asignacin, booleanos, binarios,


aritmticos, etc.).

Los identificadores (de variables, funciones, constantes, etc.)

Las constantes o literales (enteros, reales, cadenas de caracteres,


caracteres, etc.)
1

Unidad 5: Anlisis Lxico|||SIC

Signos de puntuacin (parntesis, coma, punto y coma, etc.

Lexema
if
velocidad

Patrn
if
L ( L | D )*

Token
IF
IDENTIFICADOR

Atributo
Apuntador a la tabla de
smbolos

25
<=

D+
< =

NUMERO
OPRELACIONAL

Valor 25
Constante que indica
mayor o igual

<

<

OPRELACIONAL

Constante simblica que


indica menor

OPSUMARESTA

Constante simblica que


indica suma

OPSUMARESTA

Constante simblica que


indica resta

OPMULDIV

Constante simblica que


indica multiplicar

En ocasiones el atributo que se utiliza para


lexema o cadena de caracteres.

un token

es el propio

2
Unidad 5: Anlisis Lxico|||SIC

CREACION DE TABLA DE TOKENS


Necesidad de las Tablas de smbolos
La fase de anlisis semntico obtiene su nombre por requerir informacin relativa
al significado del lenguaje, que est fuera del alcance de la representatividad de
las gramticas libres de contexto y los principales algoritmos existentes de
anlisis; es por ello por lo que se dice que captura la parte de la fase de anlisis
considerada fuera del mbito de la sintaxis. Dentro de la clasificacin jerrquica
que Chomsky dio de los lenguajes [HOPCR02, CUEV03], la utilizacin de
gramticas

sensibles

al

contexto

(o

de

tipo

1)

permitiran

identificar

sintcticamente caractersticas como que la utilizacin de una variable en el


lenguaje Pascal ha de estar previamente declarada. Sin

embargo, la

implementacin de un analizador sintctico basado en una gramtica de estas


caractersticas sera computacionalmente ms compleja que un autmata de pila.
As, la mayora de los compiladores utilizan una gramtica libre de contexto para
describir la sintaxis del lenguaje y una fase de anlisis semntico posterior para
restringir las sentencias que semnticamente no pertenecen al lenguaje. En el
caso que mencionbamos del empleo de una variable en Pascal que
necesariamente haya tenido que ser declarada, el analizador sintctico se limita a
comprobar, mediante una gramtica libre de contexto, que un identificador forma
parte de una expresin. Una vez comprobado que la sentencia es sintcticamente
correcta, el analizador semntico deber verificar que el identificador empleado
como parte de una expresin haya sido declarado previamente. Para llevar a cabo
esta tarea, es tpica la utilizacin de una estructura de datos adicional denominada
tabla de smbolos. sta poseer una entrada por cada identificador declarado en
el contexto que se est analizando. Con este tipo de estructuras de datos
adicionales, los desarrolladores de compiladores acostumbran a suplir las
carencias de las gramticas libres de contexto.

3
Unidad 5: Anlisis Lxico|||SIC

Objetivos de la Tabla de Smbolos (TS)


Las Tablas de Smbolos (en adelante TS) son estructuras de datos que almacenan
toda la informacin de los identificadores del lenguaje fuente.
Las misiones principales de la TS en el proceso de traduccin son:

Colaborar con las comprobaciones semnticas.


Facilitar ayuda a la generacin de cdigo.

La informacin almacenada en la TS depende directamente del tipo de elementos


del lenguaje especfico a procesar y de las caractersticas de dicho lenguaje.
Habitualmente los elementos del lenguaje que requieren el uso de la TS son los
distintos tipos de identificadores del lenguaje (nombres de variables, de objetos,
de funciones, de etiquetas, de clases, de mtodos, etc.).
La informacin relativa a un elemento del lenguaje se almacena en los
denominados atributos de dicho elemento. Estos atributos tambin varan de un
tipo de lenguaje a otro y de un elemento a otro. As ejemplos de atributos tales
como nombre, tipo, direccin relativa en tiempo de ejecucin, dimensiones de los
arrays, nmero y tipo de los parmetros de procedimientos, funciones y mtodos,
tipos de acceso a los elementos de una clase (public, private, protected), etc. se
recogen y se guardan en la TS.
Los atributos se obtienen unas veces directamente del anlisis del programa
fuente, es decir, estn en forma explcita (por ejemplo en la seccin de
declaraciones del programa fuente) y otras veces los atributos se obtienen de
forma implcita a travs del contexto en el que aparece el elemento en el programa
fuente.
En el proceso de compilacin se accede a la TS en unos determinados puntos que
dependen inicialmente del nmero y la naturaleza de las pasadas del procesador
de lenguaje y del propio lenguaje fuente a procesar. En los traductores y
compiladores, las TS existen nicamente en tiempo de compilacin, aunque en

4
Unidad 5: Anlisis Lxico|||SIC

depuracin (debug) pueden estar almacenadas en disco y dar informacin en


tiempo de ejecucin para identificar los smbolos que se deseen inspeccionar.
En los intrpretes contienen informacin en tiempo de ejecucin.
Las palabras reservadas no estn en la TS.
Compiladores de varias pasadas
En un compilador de varias pasadas, tal como el de la Figura 1-1, la TS se crea
durante el anlisis lxico y sintctico (pasada 1). En los compiladores modernos la
TS se crea durante el primer recorrido del rbol AST, una vez creado ste
mediante al analizador sintctico (pasada 2). Cuando un compilador comienza a
traducir un programa fuente, la TS est vaca o contiene unas pocas entradas para
las

funciones

incorporadas

(las

palabras

reservadas

habitualmente

son

almacenadas en una tabla aparte y usada exclusivamente por el analizador


lxico). El analizador lxico separa el programa fuente en tokens que compara con
las palabras reservadas. Si el token comparado no es una palabra reservada se
asume que es un identificador y durante el sintctico (fase sintctica) se aade a
ella. Si el token comparado se encuentra en la TS, el analizador sintctico accede
directamente

al

ndice

que

identifica

dicho

identificador

reconocido

anteriormente, en caso contrario, el analizador sintctico introduce dicho smbolo


en la TS. Segn avanza la compilacin, slo se aade una entrada para cada
identificador nuevo, pero se explora la Tabla una vez por cada nueva aparicin de
un identificador.
Por ejemplo en la Figura 1-1, X e Y ocupan las posiciones 1 y 2 respectivamente
en la TS.
El analizador sintctico (fase sintctica de la pasada 1) recibe la cadena de
tokens, comprueba las especificaciones sintcticas del lenguaje y construye el
rbol sintctico (Abstract Sintax Tree AST), almacenando de alguna forma,
habitualmente en los lenguajes orientados a objetos se usa el patrn composite.
Este cdigo se comprueba por el analizador semntico y se usa en la fase de
5
Unidad 5: Anlisis Lxico|||SIC

generacin de cdigo para la implementacin de las instrucciones en cdigo


objeto. Las hojas del rbol contienen los ndices de la TS correspondientes a los
identificadores detectados.

Figura 1. Compilador de varias pasadas

Durante la fase de anlisis sintctico no se usan procedimientos que manejen la


TS, excepto que sean necesarias comprobaciones semnticas para resolver
ambigedades sintcticas.
No es hasta las fases de anlisis semntico y de generacin de cdigo cuando
vuelve a utilizarse la TS, pues en estas fases ocurre que alguno de los atributos
asociados a un identificador se les pueda asignar un valor en la TS.
Por ejemplo, en un lenguaje con declaraciones explcitas, el tipo de una variable
slo ser asignado a la TS cuando la variable se reconoce en su declaracin.

6
Unidad 5: Anlisis Lxico|||SIC

Se puede intentar la asignacin de atributos a la TS en otros puntos del proceso


de traduccin diferentes a la fase de anlisis lxico. Esto nos obligar a realizar
modificaciones en los analizadores sintctico y semntico que produciran un
compilador muy fragmentado en el sentido de poca optimizacin y estructuracin,
pues las funciones del analizador lxico, sintctico y semntico estaran
mezcladas en distintos mdulos del procesador de lenguaje.
Compiladores de una pasada
Una segunda aproximacin al manejo de las TS se presenta en la Figura 1-3,
donde el anlisis lxico, sintctico, semntico y la generacin de cdigo se
realizan en una pasada, es decir, se explora el texto fuente sentencia a sentencia
(o bloques de sentencias) realizndose los tres anlisis y la generacin de cdigo.

Figura 2. Compilador de una sola pasada

7
Unidad 5: Anlisis Lxico|||SIC

En este caso puede suceder que una declaracin de una variable sea procesada
por el generador de cdigo antes de que se acabe de explorar el texto fuente. Esto
puede ser de gran ayuda, puesto que toda variable detectada despus de su
declaracin permite que sean colocados sus atributos en la TS por el generador
de cdigo.
En este compilador de una pasada la TS slo est conectada al anlisis sintctico
y a travs suyo al resto de los mdulos. Una excepcin de lo anterior ocurre
cuando el analizador sintctico requiere cierta informacin del analizador lxico
durante el proceso de compilacin. Por ejemplo, en algunos lenguajes de
programacin es conveniente reconocer por medio de una tabla en el analizador
lxico el tipo de un identificador particular. Con esta informacin el analizador
sintctico recibe un token con un significado adicional, tan como identificador real
o identificador entero, que es mejor que pasar identificador.
Esta estrategia tiene dos ventajas:

Reduce la complejidad de la gramtica para anlisis sintctico (por ejemplo,


se pueden evitar ciertos problemas que se producen al utilizar una
construccin sintctica general tal como identificador).

Permite una mejor especificacin de los errores sintcticos por el


compilador gracias a la utilizacin de construcciones menos generales.

Contenidos de la TS
Una TS se puede definir como una estructura de datos organizada en funcin de
los identificadores que aparecen en el programa fuente. Aunque su nombre parece
indicar una estructuracin en una tabla no es necesariamente sta la nica
estructura de datos utilizada, tambin se emplean rboles, pilas, etc.
Lo que la estructura debe permitir es establecer un homomorfismo entre los
mbitos de utilizacin de los smbolos en el programa fuente y el modo en que
8
Unidad 5: Anlisis Lxico|||SIC

aparecen en las sucesivas bsquedas en la tabla. Para ello debe manejar


diferentes contextos de bsqueda que imiten los diferentes tipos de bloques del
lenguaje fuente que se compila. Los smbolos se guardan en la tabla con su
nombre y una serie de atributos opcionales que dependern del lenguaje y de los
objetivos del procesador. Este conjunto de atributos almacenados en la TS para un
smbolo determinado se define como registro de la tabla de smbolos (symboltable record).

Figura 3. Tabla de tokens

Una forma de organizacin simple es imaginar la TS como una tabla con una serie
de filas, cada fila contiene una lista de atributos que estn asociados a un
identificador, tal como se muestra en la Figura 2.
Las clases de atributos que aparecen en una TS dependen de la naturaleza del
lenguaje de programacin para el cual est escrito el compilador. Por ejemplo, un
lenguaje de programacin puede no tener tipos, entonces el atributo tipo no
necesita aparecer en la tabla. La organizacin de la TS variar segn las
limitaciones de memoria y tiempo de acceso donde se implemente el compilador.
La lista siguiente de atributos no es necesaria para todos los compiladores, sin
embargo cada uno de ellos se puede utilizar en la implementacin de un
compilador particular.

Nombre de identificador.
9

Unidad 5: Anlisis Lxico|||SIC

Direccin en tiempo de ejecucin a partir de la cual se almacenar el


identificador si es una variable. En el caso de funciones puede ser la

direccin a partir de la cual se colocar el cdigo de la funcin.


Tipo del identificador. Si es una funcin, es el tipo que devuelve la funcin.
Nmero de dimensiones del array, o nmero de miembros de una

estructura o clase, o nmero de parmetros si se trata de una funcin.


Tamao mximo o rango de cada una de las dimensiones de los arrays, si

tienen dimensin esttica.


Tipo y forma de acceso de cada uno de los miembros de las estructuras,
uniones o clases.

Tipo de cada uno de los parmetros de las funciones o procedimientos.

Valor del descriptor del fichero y tipo de los elementos del fichero en el caso

de lenguajes basados en ficheros homogneos.


Nmero de la lnea del texto fuente en que la variable est declarada.
Nmero de la lnea del texto fuente en que se hace referencia a la variable.
Campo puntero para construir una lista encadenada que permita listar las
variables en orden alfabtico en las fases de depuracin de cdigo.

10
Unidad 5: Anlisis Lxico|||SIC

ERRORES LXICOS
Los errores lxicos se detectan cuando el analizador lxico intenta reconocer
componentes lxicos y la cadena de caracteres de la entrada no encaja con
ningn patrn. Son situaciones en las que usa un carcter invalido (@, $,",>,...),
que no pertenece al vocabulario del lenguaje de programacin, al escribir mal un
identificador, palabra reservada u operador.
Errores lxicos tpicos son:
1) Nombre ilegales de identificadores: un nombre contiene caracteres
invlidos.
2) Nmeros incorrectos: un nmero contiene caracteres invlidos o no est
formado correctamente, por ejemplo 3,14 en vez de 3.14 o 0.3.14.
3) Errores de ortografia en palabras reservadas: caracteres omitidos,
adicionales o cambiados de sitio, por ejemplo la palabra hwile en vez de
while.
4) Fin de archivo: se detecta un fin de archivo a la mitad de un componente
lxico.

Los errores lxicos se deben a descuidos del programador. En general, la


recuperacin de errores lxicos es sencilla y siempre se traduce en la generacin
de un error de sintaxis que ser detectado ms tarde por el analizador sintctico
cuando el analizador lxico devuelve un componente lxico que el analizador
sintctico no espera en esa posicin. Los mtodos de recuperacin de errores
lxicos se basan bien en saltarse caracteres en la entrada hasta que un

patrn
11

Unidad 5: Anlisis Lxico|||SIC

se ha podido reconocer; o bien usar otros mtodos ms sofisticados que incluyen


la insercin, borrado, sustitucin de un carcter en la entrada o intercambio de dos
caracteres consecutivos. Una buena estrategia para la recuperacin de errores
lxicos:

Si en el momento de detectar el error ya hemos pasado por algn estado


final ejecutamos la accin correspondiente al ltimo estado final visitado
con el lexema formado hasta que salimos de l; el resto de caracteres
ledos se devuelven al flujo de entrada y se vuelve al estado inicial;

Si no hemos pasado por ningn estado final, advertimos que el carcter


encontrado no se esperaba, lo eliminamos y proseguimos con el anlisis.

Por ejemplo, ante la entrada 73: a:

Devolvemos el componente lxico entero con lexema 73;


Devolvemos al buffer de entrada los caracteres: a y
Volvemos al estado inicial.

En la siguiente llamada al analizador lxico se producir un nuevo error, en este


caso descartamos el carcter ledo (el punto) y seguimos con el anlisis. En la
siguiente llamada detectamos el identificador a.
Si se sabe que el siguiente componente lxico es una palabra reservada (en la
gramtica esperamos una palabra reservada) es posible corregir la palabra mal
escrita. Por ejemplo, si se ha escrito hwile en vez de while o fi en vez de if,
intercambiando caracteres adyacentes.

12
Unidad 5: Anlisis Lxico|||SIC

GENERADORES DE ANALIZADORES LEXICOS


LEX
Una vez visto cmo las expresiones regulares pueden ser muy tiles a la hora de
reconocer patrones en un fichero de texto, y de utilizarlas para desencadenar
ciertas acciones en respuesta, vamos a estudiar una herramienta que permite
crear programas autnomos que analizan lxicamente la entrada y la procesan a
nuestro antojo: el generador de analizadores lxicos lex. Lex genera cdigo fuente
en C, a partir de una serie de especificaciones escritas en lenguaje Lex. El cdigo
C generado contiene una funcin llamada yylex(), que localiza cadenas en la
entrada (lexemas) que se ajusten a uno de los patrones lxicos especificados en
el cdigo fuente Lex, realizando entonces las acciones asociadas a dicho patrn.
yylex() puede llevar a cabo cualquier tipo de acciones ante un determinado patrn
y, en particular, puede comportarse como un analizador lxico.
Funcionamiento de lex
Al contrario que sed y awk, lex no es un analizador sino un generador de
analizadores. Esto permite incluir de manera cmoda un analizador a medida en
cualquier programa:

13
Unidad 5: Anlisis Lxico|||SIC

Figura3. Funcionamiento lex

Esquema genera
Un programa fuente de Lex tiene el siguiente aspecto:

<seccin de definiciones>
%%
<seccin de reglas>
%%
<seccin de rutinas>

De estas tres secciones, slo la segunda es obligatoria, y cualquiera de


ellas puede estar vaca. Esto quiere decir que el mnimo programa en lex
es:
%%

14
Unidad 5: Anlisis Lxico|||SIC

La seccin de declaraciones incluye declaraciones de variables, constantes


y definiciones regulares, que constituyen una manera cmoda de utilizar
expresiones regulares largas en la seccin de reglas; por ejemplo:
letra

[A-Za-z]

La seccin de reglas especifica los patrones a reconocer y las acciones


asociadas a stos, de forma similar a la que utiliza awk:
patrn {acciones en C}

La seccin de rutinas permite definir funciones auxiliares en C, incluida la


funcin main(). Por defecto, lex proporciona un main() que simplemente
llama a la funcin yylex().

El comportamiento del programa generado (por defecto a.out, si no se le indica


otra cosa al compilador de C) es el siguiente:

Imprimir en la salida estndar los lexemas que no se adapten a ningn

patrn.
Realizar la accin indicada para los lexemas que se ajustan a un patrn.

Por lo tanto, si compilamos y ejecutamos el programa mnimo en lex, que consta


nicamente de una seccin de reglas vaca (%%), veremos que se limita a copiar
literalmente la entrada estndar en la salida estndar.
FLEX
Flex. Es un generador de analizadores lxicos, una herramienta creada para
generar escneres. Desarrollado por Vern Paxson a partir de la versin original
de Jef Poskanzer con la ayuda deVan Jacobson. En la actualidad est integrada a
la herramienta Bison para en conjunto ser utilizados en la construccin de
potentes compiladores.
Funcionamiento
Flex recibe un fichero de entrada o varios con extensin .l, con la descripcin del
escner que se desea generar.La descripcin se encuentra en forma de parejas
15
Unidad 5: Anlisis Lxico|||SIC

de expresiones regulares y cdigo en Lenguaje de Programacin C, denominadas


reglas.La salida de Flex es un fichero en Lenguaje de Programacin C cuyo
nombre por defecto es `lex.yy.c' en el que se define una rutina `yylex ()',el mismo
se compila y enlaza con la librera -lfl para producir un ejecutable, que al ser
ejecutado analizar la entrada en busca de casos de las expresiones regulares y
ejecutar el cdigo en Lenguaje de Programacin C correspondiente.
Formato de ficheros lex
El fichero de entrada de Flex, es un archivo de extensin .l, o .ll si se trabaja en C+
+, el mismo est compuesto por tres secciones, separadas por una lnea donde
aparece nicamente un smbolo%%' en esta:
Definiciones
%%
Reglas
%%
Cdigo de usuario
Seccin de definiciones
La seccin de definiciones contiene declaraciones de definiciones de nombres
sencillos para simplificar la especificacin del escner, y declaraciones de
condiciones de arranque. Las definiciones de nombre tienen la forma:
nombre definicin
El nombre ser una palabra que comience con una letra o un guion bajo y puede
contener letras y dgitos. La definicin comienza en el primer carcter que sigue
al nombre siempre que este no sea un espacio en blanco y contina a todo lo
largo de la lnea
JFLEX

16
Unidad 5: Anlisis Lxico|||SIC

Jflex es un generador de analizadores lxicos para java y escrito en java. Un


archivo JFlex est organizado en tres secciones, separado por directivas de
porcentaje (%%).
Una especificacin de JFlex apropiada tiene el siguiente formato:

Cdigo del usuario


%%
Directivas JFlex
%%

JFlex (cont.)
Las directivas "%%" distinguen las secciones del archivo y van al principio de la
lnea. El resto de la lnea contenida en "%%" pueden desecharse y no deben
usarse para alojar declaraciones adicionales o cdigo.
La seccin del cdigo del usuario es copiada directamente en el archivo
resultante. Esta rea de la especificacin provee espacio para la implementacin
de clases o tipos retornados.
La seccin de directivas JFlex es donde se dan las definiciones de los macros y se
declaran nombres de estado.
La tercera seccin contiene las reglas del analizador lxico, cada una consiste en
tres partes: una lista de estados optativa, una expresin regular y una accin. El
formato es el siguiente:[<states>] <expression> { <action> }
REFEENCIAS

17
Unidad 5: Anlisis Lxico|||SIC