You are on page 1of 6

UNIDAD V

Anlisis lxico.

5.3 Creacin de Tabla de tokens

El analizador lxico, tambin conocido como scanner, lee los caracteres del
programa fuente, uno a uno, desde el chero de entrada y va formando grupos de
caracteres con alguna relacin entre s (tokens). Cada token es tratado como una
nica entidad, constituyendo la entrada de la siguiente fase del compilador.

Existen diferentes tipos de tokens y a cada uno se le puede asociar un tipo y, en
algunos casos, un valor. Los tokens se pueden agrupar en dos categoras:

Cadenas especicas, como las palabras reservadas (if, while, ...), signos de
puntuacin (., ,, =, ...), operadores aritmticos (+,*, ...) y lgicos (AND, OR, ...),
etc. Habitualmente, las cadenas especicas no tienen asociado ningn valor, slo
su tipo.

Cadenas no especicas, como los identicadores o las constantes numricas o
de texto. Las cadenas no especicas siempre tienen tipo y valor. Por ejemplo, si
dato es el nombre de una variable, el tipo del token ser identicador y su valor
ser dato.

A la tabla de Tokens tambin se la llama tabla de nombres o tabla de
identificadores y tiene dos funciones principales:
Efectuar chequeos semnticos.
Generacin de cdigo.
Permanece slo en tiempo de compilacin, no de ejecucin, excepto en aquellos
casos en que se compila con opciones de depuracin.
La tabla almacena la informacin que en cada momento se necesita sobre las
variables del programa, informacin tal como: nombre, tipo, direccin de
localizacin, tamao, etc. La gestin de la tabla de smbolos es muy importante, ya
que consume gran parte del tiempo de compilacin. De ah que su eficiencia sea
crtica. Aunque tambin sirve para guardar informacin referente a los tipos
creados por el usuario, tipos enumerados y, en general, a cualquier
identificador creado por el usuario, nos vamos a centrar principalmente en las
variables de usuario. Respecto a cada una de ellas podemos guardar:

Almacenamiento del nombre.
Se puede hacer con o sin lmite. Si lo hacemos con lmite, emplearemos una
longitud fija para cada variable, lo cual aumenta la velocidad de creacin, pero
limita la longitud en unos casos, y desperdicia espacio en la mayora. Otro
mtodo es habilitar la memoria que necesitemos en cada caso para guardar el
nombre. En C esto es fcil con los char *. Si hacemos el compilador en
MODULA-2, por ejemplo, habra que usar el tipo ADDRESS.

El tipo tambin se almacena en la tabla.

Direccin de memoria en que se guardar.
Esta direccin es necesaria, porque las instrucciones que referencian a una
variable deben saber dnde encontrar el valor de esa variable en tiempo de
ejecucin, tambin cuando se trata de variables globales. En lenguajes que no
permiten recursividad, las direcciones se van asignando secuencialmente a
medida que se hacen las declaraciones. En lenguajes con estructuras de
bloques, la direccin se da con respecto al comienzo del bloque de datos de
ese bloque, (funcin o procedimiento) en concreto.

El nmero de dimensiones de una variable array, o el de parmetros de
una funcin o procedimiento junto con el tipo de cada uno de ellos es til
para el chequeo semntico. Aunque esta informacin puede extraerse de la
estructura de tipos, para un control ms eficiente, se puede indicar
explcitamente.

Tambin podemos guardar informacin de los nmeros de lnea en los que
se ha usado un identificador, y de la lnea en que se declar.
Consideraciones sobre la Tabla de Smbolos.

La tabla de smbolos puede iniciarse con cierta informacin til, tal como:

Constantes: PI, E, etc.
Funciones de librera: EXP, LOG, etc.
Palabras reservadas. Esto facilita el trabajo al lexicogrfico, que tras
reconocer un identificador lo busca en la tabla de smbolos, y si es palabra
reservada devuelve un token asociado.

Conforme van apareciendo nuevas declaraciones de identificadores, el analizador
lxico, o el analizador sintctico segn la estrategia que sigamos, insertar
nuevas entradas en la tabla de smbolos, evitando siempre la existencia de
entradas repetidas.
El analizador semntico efecta las comprobaciones sensibles al contexto gracias
a la tabla de smbolos, y el generador de cdigo intermedio usa las direcciones
de memoria asociadas a cada identificador en la tabla de smbolos, al igual que el
generador de cdigo.
El optimizador de cdigo no necesita hacer uso de ella.


La tabla de smbolos contiene informacin til para poder compilar, por tanto
existe en tiempo de compilacin, y no de ejecucin.
Sin embargo, en un intrprete, dado que la compilacin y ejecucin se producen a
la vez, la tabla de smbolos permanece todo el tiempo.

Vamos a hacer un intrprete. Recordar que en un intrprete la entrada es un
programa y la salida es la ejecucin de ese programa.

Suponemos que queremos hacer las siguientes operaciones:

a = 7 * 3
b = 3 * a

En la segunda instruccin necesitamos saber cuanto vale a; es decir el valor de
a debe estar guardado en algn sitio. Para ello utilizaremos una lista de pares:


de forma que cuando nos encontremos con la instruccin a = 7 * 3, miremos en la
tabla, si no est a en la tabla, creamos un nodo para introducirla.


A continuacin nos encontramos con b = 3 * a. Qu es a? Busco en la tabla de
smbolos y vemos que el valor de a es 21.
b = 3 * a Ahora buscamos b en la tabla de smbolos y como no est lo creamos.


Si ejecutramos ahora la instruccin: a = a + b. Tendramos a a y b en la tabla
de smbolos con lo cual solo tendramos que modificar el valor de a.



Como hemos dicho una tabla de smbolos es una estructura que almacena
informacin relativa a los identificadores de usuario. Pero, qu informacin
exactamente?, segn el propsito que tengamos. En nuestro caso el propsito es
hacer un intrprete y nos interesa mantener informacin, entre otras cosas, del
valor de cada variable.

La tabla de smbolos consta de una estructura llamada smbolo. Las operaciones
que puede realizar son:

Crear: Crea una tabla vaca.
Insertar. Parte de una tabla de smbolo y de un nodo, lo que hace es
aadir ese nodo a la cabeza de la tabla dado un par clave-valor
Buscar: Busca el nodo que contiene el nombre que le paso por parmetro,
es decir, dada la clave de un elemento, encontrar su valor.
Imprimir: Devuelve una lista con los valores que tiene los identificadores de
usuario, es decir recorre la tabla de smbolos. Este procedimiento no es
necesario pero se aade por claridad, y a efectos de resumen y depuracin
Cambio de valor: Buscar el elemento y cambiar su valor.
Borrado: Eliminar un elemento de la tabla.
Longitud de bsqueda (o tiempo de acceso)
De una clave: Li = nmero de comparaciones con elementos de la tabla para
encontrar esa clave.

Mxima: LM = nmero mximo de comparaciones para encontrar cualquier clave.
Media (esperada): Lm = nmero medio de comparaciones para encontrar un valor.

Si la frecuencia de todas las claves es la misma:

Lm = (S Li)/N

Si la frecuencia de todas las claves no es la misma:

Lm = S pi.Li
Grado de ocupacin:
s = n/N donde n=nmero de elementos en la tabla y N=capacidad mxima de la
tabla.
Funcin de bsqueda: B:KE asocia a cada clave k un elemento B(k).
Valor asociado a una clave k: v(B(k)). Puede ser mltiple, en cuyo caso
normalmente se convierte en un puntero. Si est en la tabla puede almacenarse
consecutivamente o en subtablas paralelas. Tablas de smbolos (identificadores)
La clave es el identificador. El valor est formado por:
Atributos del identificador. Puntero a la posicin de memoria asignada. La clave
puede sustituirse por un puntero. Los identificadores pueden estar empaquetados.
La longitud del identificador puede especificarse en la tabla o delante del nombre,
o ser implcita.
Tablas consecutivas: Todos los elementos ocupan posiciones de memoria
adyacentes. Tablas ligadas: cada elemento apunta al siguiente. Tablas
doblemente ligadas: cada elemento apunta al siguiente y al anterior. Tablas no
ordenadas Insercin: en el primer lugar vaco.
Procedimiento de creacin:
El final de la tabla de smbolos se usa como una lista al revs. Cuando aparece
{se aade un bloque y se pone el puntero al final de la lista. Cuando llega} se
vaca la lista correspondiente al bloque que termin, copiando al principio de la
tabla.
Insercin: se aade a la lista del final de la tabla de smbolos, se corre el puntero
y se aumenta en 1 el nmero de elementos de ese bloque.
Bsqueda: se busca en el bloque presente slo (si es una declaracin) o en l y
sus antepasados en otro caso.
Ejemplo:
En L1:
<---disponible---> L1,f,e,d,c,b,a
0 4 ----------------------------------|------|
1 3 ----------------------------------|

En L2:
L1,f,e<-disponible-> L2,h,g,d,c,b,a
0 4 ---------------|--------------------|------|
1 3 ---------------| |
1 3 ------------------------------------|
En L3:
L1,f,e,a<-disponible-> L3,L2,h,g,d,c,b,a
0 4 ---------------|------|---------------|---------|
1 3 ---------------| | |
1 4 ----------------------|---------------|
3 1 ----------------------|
Las ventajas de esta implantacin respecto a la de mltiples tablas son:
La bsqueda es ms rpida, ya que slo hay que buscar en una tabla.
El espacio ocupado es menor, pero la diferencia queda compensada con el
hecho de que en esta implantacin hay un campo ms (mbito).
El valor
Puede depender del identificador (tamao variable). Si no, pueden ponerse varios
tamaos estndar o poner un puntero al valor.
Informacin requerida:
Clase de identificador: variable, funcin/procedimiento, etiqueta, tipo, valor
de enumeracin, etc.
Tipo: entero, real, lgico, complejo, carcter, cadena, estructura, tipo
declarado, etc.; funcin con resultado, sin resultado, operador, cuntos
argumentos, etc.
Precisin, escala
Forma: escalar, "array", lista, etc.
Dimensiones: nmero, valores si son constantes.
Direccin asociada.
Si se ha declarado.
Si es un parmetro de una rutina, de un FOR, etc.
Si se le ha asignado valor.
Si tiene valor inicial.
Si est en un COMMON, EQUIVALENCE, etc.
Si es esttico, dinmico, automtico, externo, etc.
Si es funcin recursiva.
Lista de parmetros, variables locales, etc.