Está en la página 1de 78

ADMINISTRADOR DE TABLA DE SMBOLOS

19/03/2009

Teora de Compiladores
Universidad Nacional del Santa Facultad de Ingeniera E.A.P. de Ingeniera de Sistemas e Informtica

Administrador de Tabla de Smbolos

CONTENIDO
1 INTRODUCCIN ............................................................................................................. 1.1 Necesidad de las Tablas de Smbolos ....................................................................................... 1.2 Objetivos de la Tabla de Smbolos ............................................................................................ 1.3 Compiladores de Una y Varias Pasadas................................................................................... 1.3.1 Compiladores de Varias Pasadas ......................................................................................... 1.3.2 Compiladores de Una Pasada ............................................................................................... 4 4 4 5 5 8

CONTENIDOS DE LA TABLA DE SMBOLOS.................................................................... 9 2.1 Nombre del Identificador.............................................................................................................. 10 2.2 Atributos de los Identificadores ................................................................................................... 11 2.2.1 Direccin en Memoria (Offset) ............................................................................................... 11 2.2.2 Tipo .............................................................................................................................................. 11 2.2.3 Nmero de Dimensiones, de Miembros o de Parmetros ................................................. 12 2.2.4 Valor Mximo de las Dimensiones o Rangos de Arrays ................................................... 12 2.2.5 Tipo y Forma de Acceso de los Miembros de Estructuras, Registros, Uniones y Clases 13 2.2.6 Tipo de los Parmetros de las Funciones, Funciones Libres, Procedimientos o Mtodos de las Clases ...................................................................................................................................................... 13 2.2.7 Descriptor de Ficheros .............................................................................................................. 14 2.2.8 Otros Atributos........................................................................................................................... 14 OPERACIONES CON LA TABLA DE SMBOLOS .............................................................. 3.1 Declaracin Explcita e Implcita .................................................................................................. 3.1.1 Lenguajes con Declaraciones Explcitas Obligatorias ........................................................ 3.1.2 Lenguajes con Declaraciones Implcitas de los Identificadores ........................................ 3.2 Operaciones con Lenguajes Estructurados en Bloques............................................................. 3.2.1 Operaciones de Activacin y Desactivacin de Tablas de Smbolos ............................. ORGANIZACIN DE LA TABLA DE SMBOLOS .............................................................. 4.1 Lenguajes No Estructurados en Bloques ...................................................................................... 4.1.1 Tablas de Smbolos No Ordenadas ...................................................................................... 4.1.2 Tablas de Smbolos Ordenadas............................................................................................. 4.1.3 Tablas de Smbolos con Estructura en rbol (AVL) ............................................................. 4.1.4 Tablas de Smbolos con Estructura de Tablas Hash ........................................................... 4.1.5 Conclusiones................................................................................................................................ 4.2 Lenguajes Estructurados en Bloques ............................................................................................ 4.2.1 Otros Conceptos Relacionados ............................................................................................... 4.2.2 Tablas de Smbolos en Pila ..................................................................................................... 4.2.3 Tablas de Smbolos con Estructura de rbol Implementados en Pilas ............................ 4.2.4 Tablas de Smbolos con Estructura Hash Implementadas en Pilas ................................... 4.3 Representacin OO de Smbolos y Tipos en Compiladores de Una Pasada ..................... 4.3.1 La Doble Jerarqua Smbolo Tipo ...................................................................................... 4.3.2 La Jerarqua de Smbolos........................................................................................................ 4.3.3 La Jerarqua de Tipos .............................................................................................................. 4.3.4 Esquema General de la Tabla de Smbolos ........................................................................ 4.3.5 Funcionamiento y Acceso a la Tabla de Smbolos .............................................................. 4.4 Tablas de Smbolos OO en Compiladores de Varias Pasadas ............................................ 4.4.1 Modelos de Descripcin Sobre el AST .................................................................................. 14 15 15 15 15 15 17 17 18 19 21 27 36 37 37 39 41 43 45 46 47 49 52 53 60 60

Pgina 1

Administrador de Tabla de Smbolos

4.4.2 4.4.3 5 6 7 8 9

Tipos de Usuario ........................................................................................................................ Declaraciones Forward ............................................................................................................

66 70 72 73

ANEXO 1. DIAGRAMA GENERAL DE CLASES ................................................................ ANEXO 2. TABLA DE SMBOLOS SIMPLIFICADA PARA EL EJEMPLO.............................

ANEXO 3. DESCRIPCIN DE LOS NODOS DEL AST (EJEMPLO PRIMERO DE VARIAS PASADAS) ....................................................................................................................................... 74 ANEXO 4. RBOL AST DEL EJEMPLO 2 DE VARIAS PASADAS ..................................... BIBLIOGRAFA, LINKOGRAFA Y REFERENCIAS ............................................................ 75 76

TABLA DE FIGURAS
Figura 1. Compilador de varias pasadas. .................................................................................................................6 Figura 2. Tabla de smbolos en un compilador de varias pasadas con generacin de AST...........................7 Figura 3. Compilador de una pasada. .......................................................................................................................8 Figura 4. Descriptor de nombres de identificadores (string). .............................................................................. 11 Figura 5. Subtablas de un programa estructurado en bloques. ......................................................................... 17 Figura 6. Longitud Media de Investigacin............................................................................................................. 19 Figura 7. Estructura de rbol binario. ...................................................................................................................... 22 Figura 8. Estado del rbol despus de introducir el identificador cuenta. ....................................................... 23 Figura 9. Etapas en el desarrollo del rbol binario. ............................................................................................ 24 Figura 10. rbol binario degenerado en una lista. .............................................................................................. 25 Figura 11. rbol binario equilibrado. ..................................................................................................................... 26 Figura 12. rboles equilibrados. .............................................................................................................................. 26 Figura 13. rboles desequilibrados. ........................................................................................................................ 27 Figura 14. Implementacin de TS propuesta por Severance. ............................................................................. 27 Figura 15. Tabla hash con colisiones. ....................................................................................................................... 32 Figura 16. Encadenamiento directo con Tabla de Desbordamiento. ................................................................ 35 Figura 17. Encadenamiento directo con lista enlazada dinmicamente. .......................................................... 35 Figura 18. Tabla de smbolos con array de punteros a registros. ..................................................................... 36 Figura 19. Tabla de smbolos en el momento de terminar la compilacin del bloque 2. ............................. 40 Figura 20. Tabla de smbolos en el momento de terminar la compilacin del bloque 4. ............................. 41 Figura 21. Tabla de smbolos con estructura de rbol implementada en pila despus de la compilacin del bloque 2.................................................................................................................................................................. 42 Figura 22. Tabla de smbolos con estructura de rbol implementada en pila despus de la compilacin del bloque 4.................................................................................................................................................................. 43 Figura 23. Tabla de smbolos con estructura hash implementada en pila despus de la compilacin del bloque 2. ........................................................................................................................................................................ 44 Figura 24. Tabla de smbolos con estructura hash implementada en pila despus de la compilacin del bloque 4. ........................................................................................................................................................................ 44 Figura 25. Esquema general de pilas de tablas hash abiertas.......................................................................... 45 Figura 26. Esquema del compilador (T) en que se muestra que el lenguaje fuente y el de implementacin son orientados a objetos. ............................................................................................................................................ 46 Figura 27. Clase que implementa la Tabla de Smbolos. .................................................................................... 47 Figura 28. Clase que implementa la Tabla de Tipos. .......................................................................................... 47 Figura 29. Jerarqua de smbolos. ............................................................................................................................ 48
Pgina 2

Administrador de Tabla de Smbolos

Figura 30. Versin simplificada de la jerarqua de smbolos. ............................................................................ 49 Figura 31. Jerarqua y tabla de tipos. .................................................................................................................... 50 Figura 32. La clase contiene mtodos y atributos. ................................................................................................ 51 Figura 33. Relacin cualificada y atribuida para determinar el componente de la clase y los atributos.52 Figura 34. Herencia. .................................................................................................................................................... 52 Figura 35. Esquema general de una tabla de smbolos con las dos jerarquas diferenciadas (Ver anexo 1). .................................................................................................................................................................................... 53 Figura 36. Tabla de smbolos simplificada para el ejemplo. (Ver anexo 2)................................................... 54 Figura 37. Situacin inicial de la tabla de smbolos. ............................................................................................ 55 Figura 38. Situacin complilando en la lnea 3...................................................................................................... 56 Figura 39. Situacin despus de compilar la lnea 7. .......................................................................................... 56 Figura 40. Situacin de la Tabla de Smbolos despus de compilada la lnea 9. ......................................... 57 Figura 41. Estado de la tabla de Smbolos despus de compilada la lnea 12. ........................................... 58 Figura 42. Estado de la Tabla de Smbolos despus de compilar la lnea 15. .............................................. 58 Figura 43. Estado de la Tabla de Smbolos al compilar la lnea 20. ............................................................... 59 Figura 44. Estado de la Tabla de Smbolos despus de compilada la lnea 25. .......................................... 60 Figura 45. AST del Cdigo de Ejemplo.................................................................................................................. 61 Figura 46. Estructura de Clases de la Tabla de Smbolos. .................................................................................. 61 Figura 47. Aspecto de bloques de la tabla de smbolos. .................................................................................... 62 Figura 48. Insertar una declaracin y referenciar un identificador................................................................... 63 Figura 49. Estructura AST-TS resultante una vez terminada la visita de identificacin. ................................ 64 Figura 50. Estructura simplificada AST-TS si se elimina el objeto Symbol y se introduce toda la informacin en el nodo Declaracin del rbol AST............................................................................................... 65 Figura 51. rbol AST decorado resultante de la primera pasada del visitor. ............................................... 66 Figura 52. Agregacin prevista entre los nodos del rbol AST. Vase la derivacin que Struct hace de Type. ............................................................................................................................................................................... 67 Figura 53. Insertar el tipo Struct. .............................................................................................................................. 68 Figura 54. Referencias de declaracin y tipo en el rbol AST para el tipo Struct. ....................................... 69 Figura 55. Declaracin de arrays. ........................................................................................................................... 70

Pgina 3

Administrador de Tabla de Smbolos

Administrador de Tabla de Smbolos


TERIA DE COMPILADORES

1 INTRODUCCIN
1.1 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 del la clasificacin jerrquica que Chomsky dio de los lenguajes, 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.

1.2 Objetivos de la Tabla de Smbolos


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

Pgina 4

Administrador de Tabla de Smbolos

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

1.3 Compiladores de Una y Varias Pasadas


1.3.1 Compiladores de Varias Pasadas En un compilador de varias pasadas, tal como el de la Figura 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 a 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, 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 generacin de cdigo para la implementacin de las instrucciones en cdigo objeto.

Pgina 5

Administrador de Tabla de Smbolos

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.

Pgina 6

Administrador de Tabla de Smbolos

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.

FIGURA 2. TABLA DE SMBOLOS EN UN COMPILADOR DE VARIAS PASADAS CON GENERACIN DE AST.

Cuando se utiliza una representacin interna de un AST, tanto las declaraciones como las instrucciones quedan representadas por nodos de dicho rbol. En este caso es posible una primera pasada de identificacin en la cual se crea una TS que slo se una para decorar el rbol. Una vez decorado el rbol con la informacin de los identificadores y tipos de usuario (mediante referencias cruzadas entre los nodos del AST) la TS ya no es necesaria, ya que toda la

Pgina 7

Administrador de Tabla de Smbolos

informacin necesaria (que estaba en el sintctico) ha sido ahora referenciada adecuadamente sealando desde los lugares dnde se usa a los contextos en los que se cre. 1.3.2 Compiladores de Una Pasada Una segunda aproximacin al manejo de las TS se presenta en la Figura 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 3. COMPILADOR DE UNA PASADA.

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

Pgina 8

Administrador de Tabla de Smbolos

un significado adicional, tan como identificador real o identificador entero, que es mejor que pasar identificador. Esta estrategia tiene dos ventajas: a. 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). b. Permite una mejor especificacin de los errores sintcticos por el compilador gracias a la utilizacin de construcciones menos generales.

2 CONTENIDOS DE LA TABLA DE SMBOLOS


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 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) IDENTIFICADOR companhia x3 forma1 b DIRECCIN STATIC+0 STATIC+10 STATIC+12 STATIC+13 TIPO C I B F DIMENSIN 10 0 0 3 OTROS ATRIBUTOS

TABLA 1. TABLA DE SMBOLOS SENCILLA.

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 Tabla 1. 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.

Pgina 9

Administrador de Tabla de Smbolos

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.

2.1 Nombre del Identificador


Los nombres de los identificadores deben estar siempre asociados1 en la TS, pues as son localizados por el analizador semntico y por el generador de cdigo. El primer problema en la organizacin de la TS es la variacin en la longitud de los nombres de los identificadores. En las primeras versiones de los lenguajes de los aos sesenta tales como el BASIC y el FORTRAN, los identificadores tenan como mximo seis caracteres significativos, el problema era mnimo y poda almacenarse el identificador completo en una longitud de campo con un tamao fijado de antemano. Sin embargo las normas ANSI e ISO de los lenguajes C, C++ y PASCAL permiten un mnimo de 31 caracteres. Si se reservase un espacio fijo de 31 caracteres, las TS que utilicen esta forma de almacenamiento gestionaran la memoria de una forma poco eficiente, aunque el acceso a las tablas es rpido. La poca eficiencia se debe a los huecos dejados por los identificadores con nombres cortos. La manera en que se implementar el nombre depender del lenguaje de programacin en que se implemente la propia TS. En los lenguajes como C y C++ se puede utilizar un campo del tipo puntero a carater (char*) y reservar la memoria dinmica necesaria en cada caso. Tambin en lenguajes como C++, Java, C#, etc. se puede utilizar directamente el tipo String (o equivalente) de la propia biblioteca del lenguaje. Otra solucin para almacenar los nombres de las variables es colocar un descriptor de cadenas de caracteres (strings) en el campo del nombre del identificador. El descriptor contiene la posicin y longitud de los subcampos del string donde se encuentra el nombre del identificador tal y como se muestra en la Figura 4, esta forma de acceso a los identificadores es ms lenta pero puede ahorrar bastante almacenamiento.
Asociados indica que pueden ser simplemente elementos clave de una estructura de diccionario o de tabla hash, no necesariamente un atributo de la estructura smbolo que se guarda.
1

Pgina 10

Administrador de Tabla de Smbolos

FIGURA 4. DESCRIPTOR DE NOMBRES DE IDENTIFICADORES (STRING).

2.2 Atributos de los Identificadores


Los identificadores se describen por medio de los atributos que dependern del lenguaje que se est compilando. Algunos de estos atributos se describen en los siguientes prrafos. 2.2.1 Direccin en Memoria (Offset) Los lenguajes de alto nivel tienen identificadores, sin embargo en cdigo mquina no existen identificadores, tan solo hay las direcciones donde estn colocados. Si el cdigo objeto que genera el compilador es de muy bajo nivel se tiene que asociar en todo momento a cada identificador su direccin de comienzo. En algunos casos puede que el cdigo objeto sea a nivel de ensamblador, en dicho caso pueden no hacer falta direcciones dado que en el ensamblador se pueden utilizar identificadores. La TS ayuda al generador de cdigo a generar el cdigo objeto, sustituyendo los identificadores por sus direcciones. Las direcciones suelen ser relativas, es decir desplazamientos (offsets) desde una direccin base. As en la Tabla 1 se han colocado STATIC+X, sealando STATIC a la direccin de comienzo de los identificadores del segmento esttico (habitualmente constantes y variables globales). El montador de enlaces (linker) es el encargado de pasar direcciones relativas a absolutas2. 2.2.2 Tipo El atributo tipo se almacena en la TS cuando los lenguajes a compilar tienen distintos tipos de datos definidos explcita o implcitamente.

Sobre la organizacin de la memoria en tiempo de ejecucin consultar el captulo de Gestin de Memoria. Pgina 11

Administrador de Tabla de Smbolos

Por supuesto, los lenguajes sin tipos no tienen este atributo. Un ejemplo de tipos definidos implcitamente se da en el lenguaje FORTRAN, pues si no se asignan o se declaran previamente, todas las variables cuyo nombre comienza con I, J, K, L M son variables enteras. Todas las dems son reales. El tipo de la variable se utiliza en las comprobaciones semnticas de las sentencias. El tipo tambin se usa como indicacin de la cantidad de memoria que debe ser reservada en tiempo de ejecucin. Por ejemplo, si el tipo es integer, suele ocupar la mitad de un float. Generalmente, el tipo de una variable se almacena en forma de cdigo, as el tipo de float se puede codificar como F, integer como I, carcter como C, etc. El tamao de los tipos de datos depender de cada implementacin del lenguaje, aunque el constructor del compilador suele aprovechar al mximo las caractersticas de mximo rendimiento de la mquina objeto. 2.2.3 Nmero de Dimensiones, de Miembros o de Parmetros Los atributos nmero de dimensiones, nmero de miembros y nmero de parmetros son importantes para la verificacin semntica. El nmero que indica la dimensin de un array tambin se utiliza como parmetro en la frmula general de clculo de la direccin de un elemento particular del array. El nmero de parmetros en la llamada a un procedimiento o funcin debe coincidir con el nmero que aparece en la declaracin del procedimiento o funcin. Dependiendo del lenguaje en que se implemente la TS, puede ser conveniente combinar los dos atributos anteriores en uno, ya que la verificacin semntica de ambos es similar. En la Tabla 1 se ha considerado que la dimensin de los identificadores simples es 0, de los arrays unidimensionales 1, de los arrays bidimensionales 2, etc 2.2.4 Valor Mximo de las Dimensiones o Rangos de Arrays En la TS debe almacenarse el valor mximo que puede alcanzar un array, as cuando se declara una array en C o en C++, el rango de valores comienza en cero, pero debe almacenarse el nmero de elementos del array:
int vector [10], matriz[20][30];

el valor 10 (nmero de elementos del array) o 9 (ltimo subndice permitido) debe almacenarse como atributo del vector, dado que es necesario para calcular la posicin de los elementos vector[i] en la generacin de cdigo. Lo mismo se puede decir de los valores 20 y 30 del array bidimensional matriz. En lenguajes como PASCAL se permite definir un rango de valores entre los cuales varan los subndices de los arrays, as por ejemplo:
VAR vector : ARRAY [10..20] OF INTEGER; matriz : ARRAY [-10..10, -25..100] OF INTEGER;

En estos casos es necesario almacenar el valor inferior y superior del rango. Si el lenguaje de programacin no tiene un valor mximo de dimensiones de los arrays, es necesario definir una lista dinmica con los valores mximos o rangos de cada dimensin del array.

Pgina 12

Administrador de Tabla de Smbolos

Una solucin ms rpida, pero mucho ms limitada, es definir un tamao mximo de dimensiones de los arrays y dejar un campo de tamao fijo para almacenarlos. Esto ltimo era clsico en los compiladores de FORTRAN77, dado que en dicho lenguaje slo se permitan arrays pentadimensionales. 2.2.5 Tipo y Forma de Acceso de los Miembros de Estructuras, Registros, Uniones y Clases El tipo de cada uno de los miembros de una estructura, unin o clase, debe ser almacenado en la TS. En el caso de clases tambin debe almacenarse la forma de acceso, as por ejemplo C++ permite las formas de acceso public, private y protected. En el caso de la declaracin de funciones amigas (friend), tambin el nombre de estas debe ir ligado a la clase. En el caso de los tipos simples, en la TS, los tipos se representan habitualmente por las constantes indicadas en el apartado 2.2.2. Sin embargo una estructura puede tener anidada otra estructura. En el caso de aparecer otras estructuras definidas previamente, se utilizar el identificador que representa a dicha estructura. Tambin puede ocurrir que tengan varias variables de un tipo estructura al cual no se le ha dado un nombre, en ese caso puede optarse por un puntero que seale donde est definida la estructura o por repetir la estructura para cada identificador. La representacin de las uniones es similar a la de las estructura, excepto en el tamao que ocupan, las uniones tan solo utilizan el tamao del miembro mayor en bytes. Las clases tienen datos y mtodos. La parte de datos se representa como las estructuras, pero los mtodos se almacenan de forma parecida a las funciones, indicando el nombre, tipo de resultado que devuelven, as como el nmero y tipo de parmetros. Por otro lado, tambin tiene que asociarse los accesos (private, public, protected), se sealan las funciones amigas (friend) y se deben almacenar los constructores, destructores y mtodos virtuales. El tamao de una clase, adems, tambin debe reservar espacio para un puntero a la tabla de mtodos virtuales3. Dado que los lenguajes de programacin no colocan un lmite al nmero de miembros de las estructuras, uniones y clases, ser necesario implementar una lista dinmica para almacenarlos. En algunas implementaciones sencillas se deja un campo de longitud fija, restringiendo el valor mximo del nmero de miembros 2.2.6 Tipo de los Parmetros de las Funciones, Funciones Libres, Procedimientos o Mtodos de las Clases El tipo que devuelve una funcin suele ir asociado al tipo base del identificador (ver apartado 2.2.2), sin embargo los tipos de sus parmetros deben de ser almacenados en la TS para realizar las comprobaciones semnticas. Los tipos de los parmetros se obtienen en lenguajes como C y C++ de la declaracin de las funciones prototipo.

Esto permitir implementar el polimorfismo por herencia. Pgina 13

Administrador de Tabla de Smbolos

Dado que los lenguajes de programacin no colocan un lmite al nmero de parmetros de las funciones y procedimientos, ser necesario implementar una lista dinmica para almacenarlos. En algunas implementaciones sencillas se deja un campo de longitud fija restringiendo el valor mximo de nmeros de parmetros. 2.2.7 Descriptor de Ficheros En la TS se puede almacenar el descriptor del fichero o handle de bajo nivel que est asociado al identificador del fichero y que se utilizar en la generacin de cdigo. En el caso de lenguajes como PASCAL, en los cuales la declaracin del fichero incluye la definicin del tipo de sus elementos, tambin es necesario almacenar dicho tipo. 2.2.8 Otros Atributos Los depuradores de cdigo (debuggers) y los analizadores de rendimiento (profilers) utilizan informacin de la TS en tiempo de ejecucin, por lo que las distintas implementaciones de los compiladores incorporan informacin adicional en la TS para estas herramientas que acompaan a los compiladores. Las listas de referencias cruzadas son otros tipos de atributos que proporcionan una ayuda importante cuando se est en fase de depuracin. Estas listas contienen algunos de los atributos vistos anteriormente, tambin contienen el nmero de lnea del texto fuente donde la variable se declar (si est declarada explcitamente) o donde se le hace referencia por primera vez (si su declaracin es implcita). Adems contienen los nmeros de las lneas donde se hace referencia a la variable. IDENTIFICADOR anhio b companhia forma1 m TIPO int real int char proc DIMENSIN 0 0 1 2 0 DECLARADA EN 5 5 2 4 6 REFERENCIAS 11, 23, 25 10, 11, 13, 23 9, 14, 25 36, 37, 38 17, 21

TABLA 2. TABLA DE SMBOLOS CON REFERENCIAS CRUZADAS COMO ATRIBUTO DE LOS SMBOLOS.

La Tabla 2 nos muestra una lista de referencias cruzadas. Se pueden tener problemas cuando se representan todas las referencias a una variable, pues el nmero de lneas en que aparece puede ser grande y ocupar mucho espacio en la tabla. Generalmente se utiliza una lista. Por ltimo tambin existe la posibilidad de tener un atributo que sea un puntero cuya inclusin facilitar la construccin de la lista de nombres de las variables ordenados alfabticamente.

3 OPERACIONES CON LA TABLA DE SMBOLOS


Las dos operaciones que se llevan a cabo generalmente en las TS son las insercin y la bsqueda. La forma en que se realizan estas dos operaciones difiere levemente segn que las declaraciones del lenguaje a compilar sean explcitas o implcitas. Otras operaciones son activar (set) y desactivar (reset) las tablas de los identificadores locales o automticos.
Pgina 14

Administrador de Tabla de Smbolos

3.1 Declaracin Explcita e Implcita


3.1.1 Lenguajes con Declaraciones Explcitas Obligatorias Las dos operaciones se realizan en puntos concretos del compilador. Es obvio que la operacin de insercin se realiza cuando se procesa una declaracin, ya que una declaracin es un descriptor inicial de los atributos de un identificador del programa fuente. Si la TS est ordenada, es decir los nombres de las variables estn por orden alfabtico, entonces la operacin de insercin llama a un procedimiento de bsqueda para encontrar el lugar donde colocar los atributos del identificador a insertar. En tales casos la insercin lleva tanto tiempo como la bsqueda. Si la TS no est ordenada, la operacin de insercin se simplifica mucho, aunque tambin se necesita un procedimiento de colocacin. Sin embargo la operacin de bsqueda se complica ya que debe examinar toda la tabla. La operacin de bsqueda se lleva a cabo en todas las referencias de los identificadores, excepto en su declaracin. La informacin que se busca (por ejemplo: tipo, direccin en tiempo de ejecucin, etc.) se usa en la verificacin semntica y en la generacin de cdigo. En las operaciones de bsqueda se detectan los identificadores que no han sido declarados previamente emitindose el mensaje de error correspondiente. En las operaciones de insercin se detectan los identificadores que ya han sido previamente declarados, emitindose, a su vez, el correspondiente mensaje de error. 3.1.2 Lenguajes con Declaraciones Implcitas de los Identificadores Las operaciones insercin y bsqueda estn estrechamente unidas. Cualquier identificador que aparezca en el texto fuente deber ser tratado como una referencia inicial, ya que no hay manera de saber a priori si los atributos del identificador ya han sido almacenados en la TS. As, cualquier identificador que aparezca en el texto fuente llama al procedimiento de bsqueda, que a su vez, llamar al procedimiento de insercin si el nombre del identificador no se encuentra en la TS. Todos los atributos asociados con un identificador declarado implcitamente se deducen del papel desempeado por el identificador en el programa.

3.2 Operaciones con Lenguajes Estructurados en Bloques


Definiremos en este apartado como lenguajes estructurados en bloques a todos los que tiene algn tipo de bloque que defina mbitos de utilizacin y visin de identificadores, por tanto estn incluidos en este apartado tambin los lenguajes orientados a objetos y no slo los lenguajes estructurados. 3.2.1 Operaciones de Activacin y Desactivacin de Tablas de Smbolos Los lenguajes estructurados en bloques tienen dos operaciones adicionales llamadas set y reset. La operacin de set se utiliza cuando el compilador detecta el comienzo de un bloque o mdulo en el cual se pueden declarar identificadores locales o automticos. La operacin complementaria reset, se utiliza cuando se detecta el final del bloque o mdulo. La naturaleza y necesidad de estas operaciones se muestra en el siguiente fragmento de programa:

Pgina 15

Administrador de Tabla de Smbolos

En el fragmento del programa anterior, la variable X se declara en ms de un bloque y en cada uno de estos bloques X tiene distintos atributos. En un lenguaje anidado es necesario asegurarse, en cada caso, que el nombre de la variable se asocia con un conjunto nico de atributos o de huecos en la TS. La solucin de este problema son las operaciones set y reset. Con la entrada de un bloque, la operacin set crea una nueva subtabla (dentro de la TS) en la cual los atributos de las variables declaradas en el nuevo bloque se almacenan. La forma de crear esta subtabla depende de la organizacin de la TS. En los apartados 4.2 y 4.3 se vern varias tcnicas para la creacin de las subtablas. Mediante el uso de subtablas se soluciona la ambigedad provocada por la bsqueda de identificadores del mismo nombre en distintos bloques. Por ejemplo, supongamos que se realiza una operacin de bsqueda de la variable X en el programa anterior y que las subtablas activas en este momento estn ordenadas de manera que la inspeccin comience por la ltima creada y siga por las anteriores hasta llegar a la primera (como se muestra en la Figura 5).

Pgina 16

Administrador de Tabla de Smbolos

FIGURA 5. SUBTABLAS DE UN PROGRAMA ESTRUCTURADO EN BLOQUES.

Con esta inspeccin en orden inverso de creacin se garantiza que la primera X que aparezca ser la del bloque ms cercano al uso de dicha variable que es lo que semnticamente pretende el compilador. Ntese que no est permitido usar dos variables con el mismo nombre en mismo bloque, de esta forma queda resuelto el problema de la ambigedad de los nombres de las variables. Con la salida del bloque, la operacin reset suprime las entradas a la subtabla del bloque que se acaba de cerrar. Esta supresin de las entradas significa que las variables del bloque recin acabado no tienen validez en el resto del programa. Las tcnicas para el cierre de las subtablas se vern tambin en los apartados 4.2 y 4.3.

4 ORGANIZACIN DE LA TABLA DE SMBOLOS


Para estudiar la organizacin de las tablas de smbolos se estudiar en primer lugar el caso ms sencillo en el que no existen identificadores locales y por tanto tampoco subtablas, es el caso de los lenguajes no estructurados en bloques. En segundo lugar se estudiarn los lenguajes estructurados en bloques y por ltimo los lenguajes orientados a objetos.

4.1 Lenguajes No Estructurados en Bloques


Se entiende por lenguaje no estructurado en bloques al lenguaje en el cual cada unidad compilada separadamente es un mdulo simple que no tiene submdulos. Todas las variables declaradas en un mdulo se conocen en todo el mdulo. Las organizaciones de la TS que se presentan en este apartado son conceptualmente las ms simples. En ellas se estudiar la eficiencia de los accesos a las tablas para hacer comparativas entre las diferentes implementaciones. Interesa determinar numricamente la eficiencia de las distintas organizaciones de la TS. El primer estimador que se usar para medir la complejidad de una operacin en la TS es la Longitud Media de Investigacin (average length of search), en adelante LMI. Se define la LMI como el nmero medio de comparaciones que se necesitan para encontrar un registro de la tabla de smbolos en una organizacin dada.

Pgina 17

Administrador de Tabla de Smbolos

Como se ha definido anteriormente, el conjunto de atributos almacenados en la TS para un smbolo determinado se define como registro de la tabla de smbolos (symbol-table record). 4.1.1 Tablas de Smbolos No Ordenadas El mtodo ms simple de organizar una TS es colocar los registros en la tabla segn el orden en que las variables se declaran. En el caso de que los identificadores estn declarados implcitamente, los atributos se colocan segn el orden en que las variables aparecen en el texto fuente. Se examinan ahora las operaciones de insercin y bsqueda en los lenguajes con declaraciones explcitas. En una operacin de insercin no se necesitan comparaciones (a excepcin de la comprobacin de que la tabla no est llena), ya que los atributos de cada nuevo identificador se aaden en la tabla a continuacin del identificador ledo anteriormente. Este procedimiento es un poco idealista, pues ignora el problema de la duplicacin del nombre de las variables en las declaraciones. Para detectar este tipo de error se deber investigar toda la tabla antes de realizar operaciones de insercin. Esta comprobacin siempre tiene una LMI que se calcular posteriormente en este mismo apartado. En cualquier caso, se debe tener en cuenta que al no estar ordenados los smbolos es necesario en cada caso investigar la tabla completa para garantizar la no existencia del smbolo, diferente de cuando el objetivo es encontrarlo en la tabla. La LMI requerida para la operacin de bsqueda en una TS no ordenados es: =
1

+ 1 . + 1 = 2. 2

siendo el nmero de registros de la TS. La deduccin de esta frmula es sencilla, pues para acceder al primer registro hemos de hacer una comparacin, para acceder al segundo dos, , al ensimo n. Entonces el nmero de comparaciones es:

=
1

+ 1 . 2

Dado que se ha definido la como el nmero de comparaciones partido por el nmero de registros, queda demostrada la primera expresin. La Figura 6 representa la frente al nmero de registros de la TS.

Pgina 18

Administrador de Tabla de Smbolos

FIGURA 6. LONGITUD MEDIA DE INVESTIGACIN.

Como se haba dicho antes, en los lenguajes con declaraciones implcitas, la operacin de insercin debe ir precedida por la operacin de bsqueda. Si la operacin de bsqueda no detecta el identificador ledo en el texto fuente, entonces dicho identificador se inserta en la TS a continuacin del ltimo identificador insertado. Se necesitan comparaciones y una insercin si el proceso requiere una operacin de bsqueda seguida por una insercin (en el caso de la primera aparicin del identificador). Si slo fuera necesaria la operacin de bsqueda (caso de que el identificador ya hubiera sido detectado), entonces se necesita una media de ( + 1)/2 comparaciones para localizar el conjunto de atributos de dicho identificador. Si denominamos al cociente entre el nmero de primeras apariciones de los identificadores y el nmero total de apariciones de los identificadores, entonces los procesos de insercin y bsqueda requieren una longitud media de investigacin de: = . + 1 ( + 1) 2

Una TS no ordenados slo se usa en el caso de que su tamao sea pequeo, pues el tiempo medio de bsqueda e insercin es directamente proporcional al tamao de la tabla. A continuacin se estudiarn otras organizaciones de la TS que reducirn el tiempo de investigacin sustancialmente. 4.1.2 Tablas de Smbolos Ordenadas En este apartado y en los siguientes se describirn organizaciones de la TS que se basan en el nombre del identificador. En tales circunstancias, la operacin de insercin debe ser acompaada de un procedimiento de bsqueda que determina en qu lugar de la TS debe ser colocado el identificador.

Pgina 19

Administrador de Tabla de Smbolos

La insercin en un momento dado de un nuevo registro puede obligar a que parte de los registros ya insertados en al TS se tenga que desplazar para lograr la insercin. IDENTIFICADOR anhio B companhia first forma1 m x3 TIPO 1 1 2 1 3 6 1 DIMENSIN 0 0 1 0 2 0 0 OTROS ATRIBUTOS

TABLA 3. TABLA DE SMBOLOS ORDENADA.

En la Tabla 3 se muestra una TS ordenada. Ntese que la tabla est ordenada por el orden alfabtico de los nombres de los identificadores. En una TS organizada de esta forma se pueden aplicar distintas tcnicas de bsqueda, veremos dos: la bsqueda lineal y la bsqueda binaria o dicotmica. En el apartado 4.1.1 se vio la bsqueda lineal en una TS no ordenados. En este apartado se plantea la determinacin de las ventajas que se encuentran al utilizar la bsqueda lineal en una TS ordenada. La operacin bsqueda an requiere una de ( + 1)/2 si el argumento a investigar est en la tabla. Valor idntico al de las TS no ordenadas. Sin embargo la operacin de insercin conlleva una complejidad adicional respecto a las TS no ordenadas, pues requiere ( ) comparaciones seguidas por c traslaciones. Siendo c el lugar del nuevo registro a insertar. En total son n operaciones elementales: + . Del anlisis anterior se deduce que es poco prctico utilizar la bsqueda lineal en TS ordenadas. Se puede demostrar que el camino ms eficiente para investigar un TS ordenada (usando slo comparaciones) es la bsqueda binaria. Una aproximacin al clculo de la : en el primer paso del algoritmo se compara un registro, en el segundo paso dos registros son candidatos posibles a comparar, en el tercer paso cuatro registros son los candidatos potenciales, y en general, en el paso los registros potenciales comparables son: 2 +1 Del anlisis anterior se puede deducir que la LMI, usando la bsqueda binaria, es: (log 2 ) + 1 para una tabla de tamao . Por ejemplo en la TS de la Tabla 3, = 7, luego la longitud mxima a investigar es: (log 2 7) + 1 = 3 La se calcula a continuacin:

Pgina 20

Administrador de Tabla de Smbolos


(log 2 )+1

1 1 + 2 2 + 4 3 + + 2 log 2

log 2 + 1

1 =

(21 )
=1

Cuando tiende a infinito (en nuestro caso a un nmero suficientemente grade), se demuestra que la serie anterior suma aproximadamente: (log 2 ) 1 Como conclusin prctica se puede decir que si el nmero medio de elementos de la TS por mdulo de programa es menor de 10, entonces puede considerarse una estrategia de bsqueda lineal. Sin embargo si el nmero de elementos es mayor de 25 se debe ir a bsqueda binaria. Para calcular log 2 se hace del modo siguiente: log 2 = = 2 log10 = log10 2 = = log10 log10 2

log10 0.301030

log 2 = 3.3219 log10 4.1.3 Tablas de Smbolos con Estructura en rbol (AVL) El tiempo que dura la operacin de insercin en una TS ordenada puede reducirse si se utiliza un almacenamiento organizado con una estructura de rbol. Se comenzar mostrando un ejemplo de TS con estructura de rbol binario como la que se puede ver en la Tabla 4. Ntese que se aaden dos nuevos campos a la estructura del registro. Su nombre es puntero.izquierdo y puntero.derecho. Se accede al rbol a travs del nodo raz (nodo ms alto). El proceso de bsqueda se realiza descendiendo desde el nodo raz hasta el nodo buscado o hasta un campo de tipo puntero nulo, que se denota por 0 en el ejemplo de la Tabla 4. En este ltimo caso la bsqueda es infructuosa. Se puede observar que al final y al principio de cada registro estn situados los campos de encadenamiento, que informan de las relaciones entre nodos y permiten un almacenamiento libre de la posicin en la TS. Cuando los punteros tienen un cero en su casillero, se est en el caso de encadenamiento nulo. En caso contrario contienen el nmero de la posicin del campo a sealar, bien sea por la izquierda o por la derecha. El nodo raz suele ser el primero de la TS.

Pgina 21

Administrador de Tabla de Smbolos

POSICIN 1 2 3 4 5 6 7

IDENTIFICADOR first b anhio companhia m forma1 x3

TIPO 1 1 1 2 6 3 1

DIMENSIN 0 0 0 1 0 2 0

OTROS ATRIBUTOS

PUNTERO IZQ DER 2 5 3 4 0 0 0 0 6 7 0 0 0 0

TABLA 4. TABLA DE SMBOLOS CON ESTRUCTURA DE RBOL.

Los nuevos registros se insertan como nodos hojas de la estructura del rbol binario, con ambos campos de encadenamiento nulos. La insercin se completa con el orden alfabtico de la tabla de registros que se dicta por la estructura de encadenamiento del rbol.
first 1 0 ...

...

...

anhio

...

companhia 2

...

forma1 3

...

x3 1

...

FIGURA 7. ESTRUCTURA DE RBOL BINARIO.

Para describir el orden alfabtico de un rbol se introducen los conceptos de subrbol izquierdo y subrbol derecho. Se llama subrbol izquierdo de un nodo a la parte del rbol que contiene todos los nodos accesibles desde dicho nodo por su rama izquierda. La definicin de subrbol derecho es idntica slo que por la parte derecha. Por ejemplo, el conjunto de nodos de las variables b, anhio y conpanhia estn encadenados estructuralmente formando parte del subrbol izquierdo de la variable first en la Figura 7. En un rbol binario, todo nodo situado en un subrbol izquierdo precede alfabticamente a la raz del subrbol. Todo nodo situado en un subrbol derecho sigue alfabticamente a la raz del subrbol. Por ejemplo, si se desea insertar un registro de la variable cuenta en el rbol del ejemplo anterior, se llega al rbol de la Figura 8. Se observa que se inserta como una hoja del rbol a la derecha de la variable companhia.

Pgina 22

Administrador de Tabla de Smbolos

first

...

...

...

anhio

...

companhia 2

...

forma1 3

...

x3 1

...

cuenta 2

...

FIGURA 8. ESTADO DEL RBOL DESPUS DE INTRODUCIR EL IDENTIFICADOR CUENTA.

Es importante sealar que la estructura del rbol depende del orden de insercin. Para ilustrar la afirmacin anterior, se va a examinar la estructura del rbol de la Figura 8. Esta estructura se cre con los registros introducidos por el orden: first, b, anhio, companhia, m, forma1 y x3

o tambin: first, b, m, anhio, companhia, forma1 y x3

Sin embargo si el orden de insercin es: forma1, b, companhia, anhio, m, x3, y first

Pgina 23

Administrador de Tabla de Smbolos

forma1 3

...

forma1 3

...

forma1 3

...

...

...

companhia 2

...

(a)

(b)

(c)

forma1 3

...

forma1 3

...

...

...

...

anhio

...

companhia 2

...

anhio

...

companhia 2

...

(d)

(e)

forma1 3

...

...

...

anhio

...

companhia 2

...

X3

...

(f)

forma1 3

...

...

...

anhio

...

companhia 2

...

X3

...

first

...

(g)
FIGURA 9. ETAPAS EN EL DESARROLLO DEL RBOL BINARIO.

el rbol que se crea es diferente. En la Figura 9 se muestran las distintas etapas en el desarrollo de este rbol. Dado que los registros se insertan conservando un orden particular, una operacin de insercin incluye siempre el mismo procedimiento de investigacin del rbol que necesita la operacin de bsqueda. En una posible implementacin de este algoritmo se tendra en cuenta la operacin concreta a realizar. Si la operacin es de insercin y se realiza bien, entonces se devuelve la localizacin del nuevo nodo del rbol. Si encuentra un registro con el mismo nombre, devuelve el correspondiente error. En las operaciones de bsqueda, una investigacin con xito devuelve la localizacin del registro con el nombre del campo que proporciona el argumento buscado. Si la investigacin es infructuosa (por ejemplo, la variable no fue previamente declarada), entonces se devuelve el error correspondiente.

Pgina 24

Administrador de Tabla de Smbolos

El problema principal de este algoritmo, est en el proceso de insercin, pues se pueden crear rboles no equilibrados. Por ejemplo, muchos programadores declaran variables por orden alfabtico en programas muy largos para facilitar su comprensin y localizacin en la cabecera del programa. Si esta prctica se hubiera realizado con las variables vistas en los ejemplos anteriores se creara el rbol de la Figura 10.
anhio 1 0 ...

...

companhia 2

...

first

...

forma1

...

...

x3

...

FIGURA 10. RBOL BINARIO DEGENERADO EN UNA LISTA.

Es obvio que en el caso anterior la estructura del rbol binario ha degenerado en una lista con una de: + 1 2 Hibbard demostr que para rboles generados aleatoriamente, la ms probable es 1,4 log 2 . Los rboles ideales para su investigacin, son los que tienen todas las longitudes mximas de las trayectorias a investigar iguales o casi iguales. De esta forma se evitan casos como el mostrado en la Figura 10. Esta situacin es la que ocurre en los rboles binarios equilibrados ptimos. En tales estructuras las distancias (longitud de las trayectorias) de la raz a cualquiera de los nodos incompletos del rbol difiere como mximo en una unidad. Ntese que la definicin anterior implica la misma probabilidad de acceso a todos los nodos. Los rboles que se mostraron en la Figura 8 y en la Figura 9 son equilibrados ptimos. Desafortunadamente, el principal problema que se presenta en los rboles binarios equilibrados ptimos, se produce en la insercin de registros en la estructura. Por ejemplo, sea el rbol binario equilibrado de la Figura 11.

Pgina 25

Administrador de Tabla de Smbolos

forma1 3

...

companhia 2

...

x3

...

...

first

...

...

FIGURA 11. RBOL BINARIO EQUILIBRADO.

La insercin del registro de la variable anhio obliga a una completa reorganizacin, pues cambian todos los campos de encadenamiento de la estructura del rbol, el resultado es el rbol de la Tabla 2. Sin embargo, para lograr un rbol equilibrado ptimo se necesita examinar todos los nodos del rbol, lo cual requiere del orden de operaciones elementales. Para reducir los criterios de equilibrado ptimo, que algunos autores denominan equilibro perfecto, Adelson-Velskii y Landis propusieron otro criterio de equilibrio (no perfecto), que es capaz de buscar, insertar y borrar nodos del rbol con un nmero de operaciones del orden de log 2 .
4.1.3.1 RBOLES AVL Un rbol AVL (llamado as en honor de sus autores) es un rbol binario cuyos nodos estn en uno de los estados siguientes:

1. Un nodo es pesado a izquierda (left-heavy) si la longitud de sus trayectorias en el subrbol izquierdo tienen una unidad ms que las del subrbol derecho. Lo denotaremos por L. 2. Un nodo est equilibrado si la longitud de sus trayectorias en los dos subrboles son iguales. Lo denotaremos por B (balanced). 3. Un nodo es pesado a derecha (right-heavy) si la longitud de sus trayectorias en el subrbol derecho tiene una unidad ms que las del subrbol izquierdo. Lo denotaremos por R. Si cada nodo del rbol est en uno de estos tres estados, se dice que el rbol est equilibrado, en caso contrario est desequilibrado. Cada nodo tiene un indicador de equilibrio en un campo del registro, que indica el estado del nodo en cada instante. La Figura 12 muestra dos rboles equilibrados.

B B R B B L B L B B B B B L

B B B B

FIGURA 12. RBOLES EQUILIBRADOS.

La Figura 13 muestra dos rboles desequilibrados.

Pgina 26

Administrador de Tabla de Smbolos

R B B B B R

R R L B R B B B L

B R L B R B
FIGURA 13. RBOLES DESEQUILIBRADOS.

L B

En cada nueva insercin, es posible que el rbol se desequilibre, si esto ocurre es necesario ejecutar un algoritmo de equilibrado del rbol, de este modo se volver el rbol a su estado de equilibrio. Stone demostr que la longitud de camino mxima de un rbol AVL de n nodos es: 1,5 log 2 ( + 1) Knuth hace el mismo clculo con algunas suposiciones empricas y obtiene la siguiente expresin: log 2 + 1 + Para finalizar se puede mencionar que Severance sugiri una organizacin del tipo mostrado en la Figura 14. Esta estructura es casi un hbrido entre la estructura en rbol y una tabla hash, ya que hay un proceso previo de bsqueda a travs de la inicial del nombre del identificador. De este modo el rbol se abre en anchura, pero es ms corto en profundidad en la mayor parte de los casos mejorando el acceso a los smbolos.
A B C D Y Z

A1

...

CNT ...

...

Z1

...

...

ANS ...

COM ...

Z2

...

Z3

...

FIGURA 14. IMPLEMENTACIN DE TS PROPUESTA POR SEVERANCE.

4.1.4 Tablas de Smbolos con Estructura de Tablas Hash Los mtodos de organizacin de una tabla de smbolos vistos hasta ahora tienen una longitud media de investigacin del orden de log 2 n comparaciones. En este apartado se estudiaran mtodos de organizacin de la tabla de smbolos cuyo tiempo de investigacin es prcticamente del nmero de registros de la tabla.

Pgina 27

Administrador de Tabla de Smbolos

Comenzaremos introduciendo unos conceptos bsicos, que se definirn a continuacin.


4.1.4.1 CONCEPTOS BSICOS Espacio de nombres o zona de nombres (tambin llamado espacio de identificacin o espacio de claves y en ingls name space, indentifier space o key space). Es el conjunto K de los nombres de las variables que pueden aparecer en un programa.

Ejemplo: En FORTRAN el espacio de nombre es el conjunto de identificadores de una a seis caracteres, que comienzan con una letra y continan con letras o dgitos. El compilador TURBO PASCAL admite que un identificador tenga 127 caracteres, todos ellos significativos. Espacio de direcciones (address space) es el conjunto A de localizaciones de registros (1, 2, 3, , m) en una tabla. Una forma de cuantificar la utilizacin del espacio en una tabla es por medio del factor de carga (load factor) que es el cociente del nmero de lugares de la tabla que estn ocupados (n) dividido por el nmero de lugares totales (m). = Si la tabla est vaca, = 0. Funcin Hash (o transformacin de claves). Es una aplicacin H del conjunto K (de claves) en el conjunto A (de localizaciones de registros). : La funcin hash H toma el nombre de una variable o identificador y calcula la direccin de la tabla en que se almacenan los atributos de dicho identificador o variable. Esta funcin H realiza los clculos por medio de operaciones aritmticas o lgicas con el nombre de la variable o parte de dicho nombre. Antes de comenzar a describir las funciones hash se introducir el concepto de preacondicionamiento (preconditioning). Los elementos del conjunto K estn formados por caracteres alfanumricos y especiales que son muy adecuados para manejarse con operaciones aritmticas o lgicas. El proceso de transformacin del nombre en formas fcilmente manejables por funciones hash se denomi preacondicionamiento. Como ejemplo se puede ver el proceso de preacondicionamiento de la variable AD#. La primera alternativa para realizar dicho preacondicionamiento es codificar las letras, nmeros y caracteres especiales como sigue: Letra 0 1 9 A B Z # + Cdigo 1 2 10 11 12 36 37 38 39 Si se utiliza la tabla anterior para codificar la variable de nombre AD# llegamos a: AD# 111437

Pgina 28

Administrador de Tabla de Smbolos

El preacondicionamiento puede realizarse ms eficientemente utilizando la representacin interna del cdigo numrico (por ejemplo ASCII, EBCDIC o UNICODE) de cada carcter del nombre de la variable. Sobre una mquina concreta se puede codificar AD# como: 1000001 101 65 C1 11000001 etc 1000100 104 68 C4 11000100 0100011 043 35 7B 01111011 ASCII en binario ASCII en octal ASCII en decimal EBCDIC en hexadecimal EBCDIC en binario

Ntese que se pueden tener problemas con la longitud de los nmeros generados por los nombres de los identificadores. De hecho se describirn algunas funciones hash que efectan varios tipos de transformaciones para reducir el tamao del nmero generado. En general se utilizan dos funciones hash, una para preacondicionar el nombre del identificador transformndolo en un nmero y la segunda para transformar el nmero en una direccin que seala su localizacin en la TS. A continuacin se estudiarn varias funciones hash que se pueden aplicar para el manejo de TS. A partir de ahora se utilizar el trmino clave para identificar la representacin numrica preacondicionada del nombre de un identificador.
4.1.4.2 MTODOS DE ORGANIZACIN DE LAS TABLAS HASH Una de las funciones hash ms conocidas es el mtodo de la divisin que se define como:

= + 1 para un divisor m. Esta funcin tiene la propiedad de preservar la distribucin uniforme de las claves en el espacio de direcciones. Cuando las claves son alfabticas (es el caso habitual en las TS), debe evitarse que m sea una potencia de 2, pues en este caso la hiptesis de que todas las claves son igualmente probables es errnea. De hecho, es casi seguro que claves que difieran en slo unas pocas letras sean asignadas a la misma direccin, producindose una distribucin muy poco uniforme. De todo esto se deduce que lo mejor es que m sea un nmero primo. Por ejemplo, las claves 2000, 2001, 2002, , 2007 se asignan a las direcciones 82, 83,84, , 92 con un valor de m = 101. Cuando a varias direcciones diferentes se les asigna la misma direccin se dice que ha ocurrido una colisin. Al proceso de generar direcciones alternativas se le llama manejo de colisiones o resolucin de colisiones (collision resolution). Este es uno de los problemas principales de la transformacin de claves, pues el conjunto de claves posibles es mucho mayor que el conjunto de direcciones de la TS disponibles. Del ejemplo visto anteriormente se desprende que dos claves colisionan cuando son congruentes mdulo 101.

Pgina 29

Administrador de Tabla de Smbolos

La segunda funcin hash que se va a estudiar es el mtodo hash cuadrtico (midsquare hashing method). Este mtodo se basa en multiplicar la clave por s misma y extraer varios dgitos centrales que constituyen la direccin. Por ejemplo, sea la clave 113586. Al elevarla al cuadrado obtendremos 12901779396, si las direcciones que usamos son de cuatro dgitos podemos escoger 1779. Deben de elegirse estas posiciones para todas las claves. Este mtodo fue criticado por Buchholz, pero da buenos resultados cuando se aplica a algunos conjuntos de claves. La siguiente funcin hash se basa en el mtodo de reduccin (folding method). Consiste en partir la clave en grupos de dgitos con el mismo nmero de dgitos excepto el ltimo grupo que puede tener un nmero menor. Los distintos grupos de dgitos se suman excepto el ltimo, pudindose dar la vuelta al orden de los dgitos. Por ejemplo, sea la clave 18724965321, si se divide en grupos de tres dgitos, se tiene: 187 249 653 21

Si se cambia de orden a los situados en lugar impar y se eliminan los de menos de tres cifras se tendr: 781 249 Sumndolos se llega a 1356. Evidentemente se pueden hacer muchas variaciones del caso mostrado en el ejemplo. Si la clave est en binario se puede utilizar la operacin o exclusiva en vez de la suma. En general este mtodo se utiliza para comprimir claves de palabras muy largas, pudindose usar posteriormente otras funciones hash. Otra tcnica muy utilizada para la realizacin de funciones hash es el mtodo dependiente de la longitud (length-dependent method). Utiliza la longitud del nombre de la variable en conjunto con alguna parte del nombre para determinar una direccin de la tabla directamente. En otros casos se calcula una clave intermedia que puede usar, por ejemplo, el mtodo de la divisin para determinar la direccin de la tabla. Por ejemplo: sea la variable ID#1, se toma el cdigo decimal del primero y ltimo carcter, se suma y se aade el nmero de caracteres multiplicado por 16. A la variable ID#1 se le asigna el cdigo decimal (EBCDIC) 201 196 123 241 3 56

Se realiza la operacin: 201 + 241 + (4 * 16) = 506. Si ahora se aplica el mtodo de la divisin con m = 29 resulta la direccin 14.
4.1.4.3 MANEJO DE COLISIONES Anteriormente se ha definido colisin como el suceso que se produce cuando se asignan dos claves a la misma direccin.

Cuando ocurre esto se calcula una direccin alternativa para la segunda clave, llamndose a este proceso manejo de colisiones. Las dos tcnicas ms utilizadas para el manejo de colisiones son:

Pgina 30

Administrador de Tabla de Smbolos

Direccionamiento vaco o hash cerrado. Encadenamiento directo o hash abierto. 4.1.4.3.1 Direccionamiento vaco o hash cerrado Consiste en buscar en otros lugares de la tabla hasta que se encuentre la variable buscada (caso de operacin de bsqueda) o se llegue a un lugar vaco (en el caso de operacin de insercin significa que no existe y se puede insertar, en el caso de bsqueda se termina la operacin infructuosamente). La forma de buscar otros lugares de la tabla puede hacerse por medio de varios mtodos. El primer mtodo que se va a estudiar es el mtodo llamado inspeccin lineal (linear probing). Es el mtodo ms sencillo. Consiste en mirar el lugar siguiente de la tabla y as sucesivamente hasta encontrar la variable buscada o una posicin vaca. Cuando se llega al final de la tabla se pasa a mirar el primer lugar de la tabla y se contina buscando. Si se llega al lugar de partida sin encontrar la variable buscada entonces no est en la tabla. Si no se encuentra el hueco para introducirla es que la tabla est llena. Este mtodo tiene la desventaja de que los elementos tienden a agruparse alrededor de las claves primarias (claves que han sido insertadas sin colisionar). Por ejemplo, al insertar los siguientes identificadores y en este orden: NODE, STORAGE, AN, ADD, FUNCTION, B, BRAND y PARAMETER En la siguiente tabla se muestra la clave generada para cada uno de los identificadores. En ella se puede comprobar que hay varias colisiones: NOMBRE DEL IDENTIFICADOR NODE STORAGE AN ADD FUNCTION B BRAND PARAMETER DIRECCIN 1 2 3 3 9 9 9 9

Si se utiliza la inspeccin lineal para resolver las colisiones en una tabla con m = 11 se obtiene el resultado de la Figura 15.

Pgina 31

Administrador de Tabla de Smbolos

FIGURA 15. TABLA HASH CON COLISIONES.

La LMI es el nmero de variables dividido por el nmero de inspecciones. Knuth construy un modelo probabilstico para analizar las tcnicas de manejo de colisiones y desarroll frmulas que calculan la LMI esperada o probable en funcin del factor de carga = n /m. Para la inspeccin lineal son: = 1+ 1 1 2 1 1 2
2

1+ =

En la siguiente tabla se representan los valores de las dos frmulas FACTOR DE CARGA 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 NMERO DE INSPECCIONES CON XITO INFRUCTUOSAS 1056 1118 1125 1281 1214 1520 1333 1889 1500 2500 1750 3625 2167 6060 3000 13000 5500 50500 10500 200500

Pgina 32

Administrador de Tabla de Smbolos

Se observa que el nmero de inspecciones esperadas es proporcional al factor de carga. Anteriormente se coment y se pudo observar en el ejemplo que uno de los problemas de inspeccin lineal es la agrupacin alrededor de las claves primarias de las claves colisionadas. Tal fenmeno se llama agrupacin primaria (primary clustering). El problema anterior se puede reducir utilizando distintos mtodos de inspeccin. Un mtodo que puede lograr esto es el que se llama inspeccin aleatoria (random probing). Esta tcnica consiste en generar posiciones aleatorias en vez de las posiciones ordenadas que se generaban en la inspeccin lineal. Se general m posiciones aleatorias entre 1 y m (siendo m el nmero de registros de la tabla). La tabla se considera completa cuando se repite el nmero generado. Ntese que la generacin es cclica. Por ejemplo: = + donde y es la direccin inicial generada por la funcin hash, c es una constante y m es el nmero de registros de la tabla. Supngase c = 7, m = 11 e y = 3 en un momento dado, la secuencia generada es la siguiente: 10 6 2 9 5 1 8 4 0 7 3

si se aade 1 a cada nmero generado, transformaremos la secuencia el nmeros del intervalo (1,11). Cuando se utilizan frmulas de esta forma se debe cumplir que c y m sean nmeros primos entre s. Aunque la inspeccin aleatoria mejora el problema de la agrupacin primaria, la agrupacin de direcciones puede todava aparecer. Esta situacin surge cuando dos claves se transforman en la misma direccin. En tales casos se genera la misma secuencia para ambas claves por el mtodo de inspeccin aleatoria. A este fenmeno se le llama agrupacin secundaria (secondary clustering). Este tipo de agrupamiento se puede atenuar por medio del doble hashing o rehashing. En este mtodo el valor del incremento c se calcula utilizando una segunda funcin hash H2 que es independiente de la funcin hash inicial H1 y que genera un valor que es primo del nmero de registros de la tabla. La funcin H2 se usa para calcular el valor de c que se introduce en la frmula de la inspeccin aleatoria ((y + c) mod m). Kntuh sugiere utilizar: 1 = 1 + 2 = 1 + ( 2 ) Siendo k la clave y m el nmero de registros de la tabla. As por ejemplo si: k = 125 m = 13 se tiene: H1(125) = 9

Pgina 33

Administrador de Tabla de Smbolos

H2(125) = 5 y la serie de valores generada es: 9 1 6 11 3 8 0 5 10 2 7 12 4 La LMI esperada para la tcnica de rehashing, cuando H1 y H2 son independientes se muestra a continuacin: = ln 1 1 1

Seguidamente se muestra la tabla representativa de las frmulas anteriores para la inspeccin aleatoria con doble hashing. Se puede observar cmo ha mejorado respecto a la inspeccin lineal. FACTOR DE CARGA 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 NMERO DE INSPECCIONES CON XITO INFRUCTUOSAS 1054 1111 1116 1250 1189 1429 1277 1667 1386 2000 1527 2500 1720 3333 2012 5000 2558 10000 3153 20000

Hay tres dificultades principales para la utilizacin del mtodo de direccionamiento vaco o hash cerrado: 1. Cuando se va a localizar un hueco para insertar un identificador se necesitan muchas inspecciones, pues suele haber muchos registros ocupados poridentificadores que se introdujeron por medio de otras inspecciones. 2. El tamao de la tabla es fijo y no puede ajustarse segn cambian las necesidades. Por tanto hay que establecer una buena estimacin del mismo a priori si quiere evitarse una mala utilizacin de la memoria o un rendimiento pobre (o incluso un desbordamiento de la tabla), an cuando se conoce exactamente el nmero de elementos (caso muy hipottico cuando se trata de un compilador). El problema del desbordamiento de la tabla no puede olvidarse en las tablas de smbolos de compiladores, ya que las necesidades de espacio en la tabla dependen directamente del tamao del programa fuente y en especial del nmero de identificadores. 3. El ltimo problema es la dificultad que se encuentra cuando se quieren borrar elementos de la tabla pues es un proceso lento y pesado. Una solucin es utilizar la tcnica del encadenamiento directo o hash abierto.

Pgina 34

Administrador de Tabla de Smbolos

4.1.4.3.2 Encadenamiento directo o hash abierto Este mtodo enlaza todos los identificadores que tienen el mismo ndice primario H(k) en forma de lista. Es decir, se resuelven las colisiones utilizando una lista encadenada que une todos los identificadores que tienen colisin. La implementacin de la lista puede ser en forma dinmica o por medio de otra tabla que se llama rea de desbordamiento (overflow area). A la tabla primaria tambin se le llama rea principal (prime area).Este mtodo es muy eficiente, aunque tiene la desventaja de manipular listas secundarias y, adems, tiene que almacenar un atributo adicional a cada variable para almacenar el puntero encadenamiento de la lista de identificadores colisionados. En las siguientes figuras se esquematiza el encadenamiento directo.

FIGURA 16. ENCADENAMIENTO DIRECTO CON TABLA DE DESBORDAMIENTO.

FIGURA 17. ENCADENAMIENTO DIRECTO CON LISTA ENLAZADA DINMICAMENTE.

Debe notarse que, en este caso, la insercin en la lista de registros colisionados se hace por orden alfabtico del nombre de lo identificadores. Est demostrado que esta tcnica reduce el tiempo de bsqueda en investigaciones infructuosas. Knuth demostr que la longitud media de investigacin esperada para el encadenamiento directo es la siguiente:

Pgina 35

Administrador de Tabla de Smbolos

. . = 1 +

. . = + A continuacin se muestra una tabla con los valores ms representativos de estas frmulas. FACTOR DE CARGA 0.10 0.20 0.30 0.40 0.50 0.60 0.70 0.80 0.90 0.95 NMERO DE INSPECCIONES CON XITO INFRUCTUOSAS 1050 1005 1100 1019 1150 1041 1200 1070 1250 1107 1300 1149 1350 1197 1400 1249 1450 1307 1475 1337

En estas tablas se observa que ha mejorado respecto al hash cerrado. Todava puede optimizarse ms la utilizacin de tablas de smbolos con direccionamiento hash. En la Figura 17 puede observarse que la Tabla Primaria tiene muchos huecos debido a los problemas de colisiones. Se puede optimizar an ms la tabla definiendo la Tabla Principal como un array de punteros a registros. De este modo los huecos libres son del tamao de un puntero y no del tamao de un registro. Se puede ver el esquema en la Figura 18.

FIGURA 18. TABLA DE SMBOLOS CON ARRAY DE PUNTEROS A REGISTROS.

4.1.5 Conclusiones Si se va a compilar programas con menos de 10 variables, se pueden usar tablas de smbolos no ordenadas. Si el nmero de variables no supera a 25 se pueden usar tablas de smbolos ordenadas, utilizando el algoritmo de bsqueda binaria.

Pgina 36

Administrador de Tabla de Smbolos

Las tablas de smbolos con estructura de rbol se pueden utilizar en ciertos lenguajes con unas caractersticas muy determinadas (por ejemplo BASIC y FORTRAN tienen limitados los nombres de los identificadores a unos pocos caracteres). El mejor mtodo cuando no se tienen problemas de memoria reducida es el direccionamiento hash abierto, su problema principal es la asignacin de memoria a priori para la tabla de smbolos. Esto se palia en parte utilizando en el compilador algn parmetro que nos d una idea a priori del tamao de la tabla de smbolos (por ejemplo el nmero de lneas del programa). Otro mtodo igualmente vlido son los rboles AVL. Como conclusin prctica, el mtodo hash abierto con arrays de punteros a registros es el que ofrece las mejores prestaciones, teniendo en cuenta su fcil y cmoda implementacin. El nico inconveniente est en tener que fijar a priori el tamao mximo del array de punteros a registros. Sin embargo el uso de listas dinmicas puede garantizarnos, si hay suficiente memoria, que no se colapsar el compilador si se alcanzan valores prximos al tamao mximo del array. Es muy importante elegir bien una funcin de preacondicionamiento para reducir las colisiones. La funcin hash ms utilizada y de ms fcil comprensin es la funcin mdulo, que adems asegura una distribucin uniforme a travs del array de punteros (para mejorar an ms este comportamiento se suele elegir un tamao del array que seanmero primo). En los modernos lenguajes de compilacin se poseen estructuras de contenedores con mejoras significativas de este comportamiento, es el caso de las tablas hash implementadas por hashtable de Java o map de C++. En estos casos, m es un valor dinmico que se va cambiando a medida que la tabla se llena, de manera que las colisiones se reducen o se eliminan completamente.

4.2 Lenguajes Estructurados en Bloques


En este apartado se estudiarn los problemas que se presentan en el manejo de tablas de Smbolos cuando se compilan lenguajes estructurados en bloques. (Aunque tambin sean lenguajes estructurados los lenguajes orientados a objetos se tratarn en otro apartado). Se entiende por lenguaje estructurado en bloques a todo lenguaje con estructura de bloques o mdulos que a su vez puede contener submdulos anidados y de manera que cada submdulo pueda contener un conjunto de identificadores con mbito local. Un identificador declarado dentro de un mdulo A es accesible dentro del mdulo a no ser que el mismo nombre del identificador se redefina dentro del submdulo A. La redefinicin de una variable es vlida exclusivamente dentro del mbito (scope) del Submdulo. Por ejemplo en FORTRAN el mbito de una variable es una subrutina. En general este concepto se aplicar ms a los lenguajes tipo ALGOL, PASCAL, C e incluso a los propios lenguajes orientados a objetos. 4.2.1 Otros Conceptos Relacionados Acabamos de definir lenguaje estructurado en bloques, pero este concepto necesita otras definiciones elementales para comprenderlo en toda su amplitud. En el apartado 3.2 se introdujeron las operaciones set y reset. En este apartado se estudiarn con ms detalle dichas operaciones. Para explicarlas se usar el mismo programa ejemplo que se vio entonces y que se reproduce a continuacin con nmeros que identifican los bloques.

Pgina 37

Administrador de Tabla de Smbolos

En el ejemplo anterior se denomina con BBLOCK los bloques que se ejecutan de forma secuencial y con PBLOCK los que son bloques de procedimientos y a los cuales se accede por medio de una llamada al procedimiento y una vez ejecutado ste se devuelve el control del programa al bloque principal. En tiempo de ejecucin estos dos tipos de bloque se comportan de forma diferente, pero durante la compilacin ambos tipos usan los mismos procedimientos en lo que respecta a las operaciones de set y reset. Cuando en la compilacin de un texto fuente el traductor se encuentra con un bloque, la operacin set crea una subtabla para todas las nuevas variables declaradas. El nacimiento de una nueva subtabla no implica obligatoriamente una necesidad suplementaria de espacio en la tabla de smbolos, pues los atributos de las nuevas variables se almacenan en la subtabla durante la compilacin del bloque y se borran4 despus de que se lee el END del bloque. La operacin de borrado se realiza por medio de reset. Esta operacin tambin debe volver a activar la parte de la tabla de smbolos que contiene las variables presentes en el programa antes de la entrada en el bloque.

Realmente no es necesario borrarlos, simplemente es necesario desafilarlos y dejar nuevo espacio disponible para apilar nuevos smbolos.
4

Pgina 38

Administrador de Tabla de Smbolos

En el ejemplo anterior, antes de que el bloque 2 sea analizado por el traductor e inmediatamente despus de ser analizado, solamente las variables X, Y, NAME y M1 estn activas en la tabla de smbolos. La tabla siguiente muestra las variables activas en la tabla de smbolos, as como las inactivas, en el instante anterior a la ejecucin de las sentencias set y reset para el ejemplo anterior. Operacin Set BLK1 Set BLK2 Reset BLK2 Set BLK3 Set BLK4 Reset BLK4 Reset BLK3 Reset BLK1 Contenidos de la Tabla de smbolos(solo nombre) Activas Inactivas M1, NAME, X, Y X , IND, M1, NAME, X, Y M2, M1, NAME, X, Y J, M2, M1, NAME, X, Y TEST1, F, J, M2, M1, NAME, X, Y J, M2, M1, NAME, X, Y

X, IND X, IND X, IND TEST1, F, X, IND J, M2, M1, NAME, X, Y, TEST1, F, X,IND

Inicialmente, tanto la parte activa como la inactiva de la tabla de smbolos estn vacas. Antes de comenzar el segundo bloque, las variables M1, NAME, X e Y estn localizadas en la zona activa de la tabla de smbolos. Los registros X e IND se aaden durante la compilacin del bloque 2. La operacin reset que se ejecuta en el END del bloque 2 coloca a X e IND en la zona inactiva de la tabla de smbolos. Este proceso se realiza para todos los bloques del texto fuente y, una vez finalizada la lectura de ste, todos los registros de la tabla de smbolos estn inactivos. En el ejemplo, las declaraciones de los procedimientos (denotados por PBLOCK) se realizan cuando el nombre del procedimiento se encuentra por primera vez. Por esta razn, el smbolo M2 (en este caso procedimiento) contina activo una vez que el bloque ha sido compilado. Ntese que la referencia hecha a M2 en el bloque 1 puede tener problemas al no estar declarada todava. Es el caso de la sentencia FORWARD del PASCAL o la compilacin en varias pasadas. Este problema se ignorar en el estudio de las tablas de smbolos y se estudia en la fase de anlisis semntico (ver [ORTIN04]), por tanto la declaracin de un procedimiento se manejar como cualquier otra declaracin. Si observamos detenidamente la tabla anterior, se ve que las variables se almacenan en la tabla como si sta fuera una pila LIFO (last input first output). Esto no es una coincidencia, pues es una consecuencia del uso de bloques anidados. Otra propiedad de los lenguajes estructurados en bloques que se debe considerar en el diseo de tablas de smbolos es la duplicidad de los nombres de las variables. Por ejemplo en el programa dentro del bloque 2, cualquier referencia a X indica una variable X entera, pues las operaciones de bsqueda en este tipo de lenguajes se realizan de tal forma que siempre localizan la ltima variable introducida. 4.2.2 Tablas de Smbolos en Pila La organizacin ms simple, desde el punto de vista conceptual, de una tabla de smbolos de un lenguaje estructurado en bloques es la pila. En este tipo de organizacin los registros que contienen los atributos de los identificadores se van colocando unos encima de otros segn se van encontrando las declaraciones de las variables del texto fuente. Una vez que se lee el fin del

Pgina 39

Administrador de Tabla de Smbolos

bloque, todos los registros de los identificadores declarados en el bloque se sacan de la pila, pues dichos identificadores no tienen validez fuera del bloque. En la Figura 19 se muestra una tabla de smbolos en pila para el programa anterior en el momento de finalizar la compilacin del bloque 2.

FIGURA 19. TABLA DE SMBOLOS EN EL MOMENTO DE TERMINAR LA COMPILACIN DEL BLOQUE 2.

En la Figura 20 se muestra la tabla de smbolos cuando se finaliza la compilacin del bloque 4. La operacin de insercin es muy simple en una tabla de smbolos en pila. Los nuevos registros se colocan en la cima (TOP) de la pila. Las declaraciones de variables con el mismo nombre dentro de un mismo bloque se detectan antes de la insercin por medio de una bsqueda lineal entre los registros existentes. La operacin de bsqueda requiere una investigacin lineal desde la cima (TOP) hasta la base (BOTTOM). La bsqueda se realiza por orden (desde la cima de la pila) para garantizar que la ltima aparicin de la variable con el nombre buscado sea la primera encontrada.

Pgina 40

Administrador de Tabla de Smbolos

FIGURA 20. TABLA DE SMBOLOS EN EL MOMENTO DE TERMINAR LA COMPILACIN DEL BLOQUE 4.

Por ejemplo en la Figura 19, la variable X (es decir la variable INTEGER: X) se encuentra la primera. Ntese que la longitud media de investigacin (LMI) de una tabla de smbolos en pila puede ser menor que la correspondiente a una tabla de smbolos no ordenada, pues la operacin reset deja solamente las variables del bloque en curso. La operacin set en una tabla de smbolos en pila genera un ndice del bloque (BLOCK INDEX) que representa el lugar donde est almacenado el primer registro de una variable del bloque y que en el momento de la operacin set corresponde a la cima (TOP) de la pila. La operacin reset saca de la pila todos los registros de las variables que se acaban de compilar en el bloque finalizado, para lo cual utiliza el ndice del bloque finalizado, determinando con l hasta qu registro ha de sacar desde la cima de la pila (TOP). Los registros sacados de la tabla de smbolos pueden guardarse en una tabla inactiva. La operacin reset tambin elimina el ndice del bloque finalizado de la pila auxiliar. El parecido entre una tabla de smbolos no ordenados y una tabla de smbolos en pila es obvio, pero desgraciadamente esta similitud tambin se observa en las malas caractersticas, por lo que slo se usan en casos muy especiales. 4.2.3 Tablas de Smbolos con Estructura de rbol Implementados en Pilas En este apartado se estudiar cmo las tablas con estructura de rbol se pueden utilizar en los lenguajes de bloques anidados. Las tablas de smbolos con estructura de rbol se pueden organizar de dos formas: a) La primera ya se estudi en el apartado 4.1.3 y la nica diferencia est en el borrado o eliminacin de los registros al finalizar cada bloque. Esto es un gran problema pues todos los registros estn mezclados en un mismo rbol y los pasos necesarios para borrar un registro son: Localizar la posicin del registro en la tabla.

Pgina 41

Administrador de Tabla de Smbolos

Sacar el registro y cambiar los punteros de las ramas del rbol necesarias. Reequilibrar el rbol. Tal como se vio anteriormente esto necesita del orden de log2n operaciones y hay que hacerlo para cada bloque que se termina. Es evidente que no es una buena organizacin para un lenguaje con estructura de bloques. b) La segunda, se podra llamar bosque, en ella cada bloque se organiza como una tabla estructurada en rbol y se elimina dicho rbol cuando se finaliza el bloque. A continuacin se muestran las figuras representativas de este tipo de organizacin para el ejemplo de programa de los apartados anteriores. Se muestra el estado de la tabla en el momento de finalizar la compilacin de los bloques 2 (Figura 21) y 4 (Figura 22).

FIGURA 21. TABLA DE SMBOLOS CON ESTRUCTURA DE RBOL IMPLEMENTADA EN PILA DESPUS DE LA COMPILACIN DEL BLOQUE 2.

En este tipo de organizacin, los elementos del campo de ndices de bloque (block index) sealan los nodos raz de cada uno de los rboles de la tabla. El puntero izquierdo (LPTR) y el puntero derecha (RPTR) indican los encadenamientos de los rboles AVL. Ntese que en el proceso de compilacin del bloque 3 se encuentra la declaracin del procedimiento M2 y adems M2 es accesible desde el bloque 1. La insercin de M2 en el rbol del bloque 1, obliga a reequilibrar dicho bloque utilizando la doble rotacin, mostrndose el resultado en la Figura 22. Se puede observar que la tabla de smbolos se maneja como una pila. Cuando se detecta una variable nueva en un bloque se almacena en la cima de la pila y el campo de los punteros izquierdo y derecho se ajusta a la estructura de rbol de su bloque. La operacin de bsqueda dentro de un bloque se realiza aprovechando la estructura de rbol y se garantiza la no confusin con las variables del mismo nombre al haber un rbol para cada bloque. La operacin set genera el nuevo rbol cuya raz se localiza con el ndice del bloque.

Pgina 42

Administrador de Tabla de Smbolos

La operacin reset saca el rbol en curso hacia un rea inactiva. Una alternativa a esto es dejar el rbol donde est, marcando esta zona como inactiva y modificando el puntero que indica la cima de bloque.

FIGURA 22. TABLA DE SMBOLOS CON ESTRUCTURA DE RBOL IMPLEMENTADA EN PILA DESPUS DE LA COMPILACIN DEL BLOQUE 4.

Este tipo de organizacin de la tabla de smbolos se utiliza cuando la memoria de que se dispone para realizarla es pequea. 4.2.4 Tablas de Smbolos con Estructura Hash Implementadas en Pilas A primera vista parece imposible utilizar transformaciones de claves para lenguajes estructurados en bloques, pues las variables de un bloque deben de estar agrupadas y las funciones hash no preservan ningn orden. En este apartado se utilizarn funciones hash que usan la tcnica de hash abierto para resolver los problemas de colisiones, por ser en general ms ventajoso tal como se estudi anteriormente. Utilizaremos el mismo ejemplo que en casos anteriores, suponiendo que la funcin hash realiza las siguientes transformaciones: Nombre del Identificador X M1 NAME IND J TEST1 F Y M2 Direccin 1 1 3 5 5 6 8 8 11

Se utiliza un array de punteros de tamao 11 como se puede ver en la Figura 23.

Pgina 43

Administrador de Tabla de Smbolos

FIGURA 23. TABLA DE SMBOLOS CON ESTRUCTURA HASH IMPLEMENTADA EN PILA DESPUS DE LA COMPILACIN DEL BLOQUE 2.

FIGURA 24. TABLA DE SMBOLOS CON ESTRUCTURA HASH IMPLEMENTADA EN PILA DESPUS DE LA COMPILACIN DEL BLOQUE 4.

La Figura 23 muestra la tabla de smbolos en el instante anterior a que se complete el anlisis del bloque 2. Otra vez los nuevos registros de las nuevas variables se colocan en la cima de la pila y el campo de ndices de bloques (BLOCK INDEX) seala el registro donde comienzan los bloques actualmente activos. En este ejemplo se puede observar que ocurre cuando se duplica el nombre de una variable en bloques diferentes. Es el caso de la variable X cuando sta aparece en el bloque 2. El registro del identificador M1 se encadena al registro de la variable X (declarada en el bloque 1) y la situacin de M1 est sealada por el puntero de la X recin introducida. La tabla hash seala a la ltima X introducida.
Pgina 44

Administrador de Tabla de Smbolos

Cuando se produce una colisin su resolucin de lleva a cabo de esta manera. La Figura 24 muestra la tabla de smbolos en el instante anterior a que se complete el anlisis del bloque 4. Las operaciones de insercin y bsqueda se realizan de forma similar a como se vieron en el apartado 4.1.4, excepto en las particularidades que se producen cuando un nombre de identificador se duplica. La operacin set se realiza como en los apartados precedentes. La operacin reset es la ms complicada, tiene bastantes problemas, pues al sacar un bloque se puede eliminar algn campo de encadenamiento utilizado para resolver alguna colisin. Es preferible, a veces, desactivar esa zona pero manteniendo los valores de los punteros de encadenamiento. Un esquema general de pilas de tablas hash abiertas se muestra en la Figura 25. Este tipo de esquema tiene una ocupacin de memoria mayor, pero es ms sencillo de implementar. Hoy da la mayor parte de los lenguajes orientados a objetos (Java, C++, etc.) poseen libreras de contenedores que, aunque ocupen ms memoria, facilitan la creacin de este tipo de estructuras enormemente, es el caso de los vectores, listas, tablas hash, rboles, etc., que con diferentes nombre se incluyen para las bibliotecas de contenedores de estos lenguajes (map, vector, list, HashMap, ArrayList, etc.).

FIGURA 25. ESQUEMA GENERAL DE PILAS DE TABLAS HASH ABIERTAS.

4.3 Representacin OO de Smbolos y Tipos en Compiladores de Una Pasada


En los sistemas orientados a objetos aparecen nuevos problemas a la hora de implementar la tabla de smbolos que se estudian en los siguientes apartados.

Pgina 45

Administrador de Tabla de Smbolos

En estos momentos hay dos lenguajes implicados que pueden ser orientados a objetos: el lenguaje a compilar y el lenguaje de implementacin del compilador, en este caso el lenguaje de implementacin de la propia tabla de smbolos (ver Figura 26). En los siguientes prrafos se considera que el lenguaje de implementacin es orientado a objetos, esto proporciona beneficios de implementacin de la TS. Todo lo estudiado en este apartado es aplicable para el caso de lenguajes fuente estructurados (tambin orientados a objetos). Queda fuera del alcance de este documento las TS de lenguajes OO implementados en lenguajes estructurados convencionales.

FIGURA 26. ESQUEMA DEL COMPILADOR (T) EN QUE SE MUESTRA QUE EL LENGUAJE FUENTE Y EL DE IMPLEMENTACIN SON ORIENTADOS A OBJETOS.

4.3.1 La Doble Jerarqua Smbolo Tipo Cuando estamos compilando un lenguaje orientado a objetos (OO), el esquema de tabla de smbolos debe representar en cierto modo el modelo del lenguaje fuente. En un esquema orientado a objetos tenemos una doble jerarqua: Smbolos, que son todos aquellos identificadores que representan variables locales, atributos, campos de un registro, parmetros de un mtodo, etc. Tipos, que son todos los identificadores que representan tipos del lenguaje, entendidos aqu los tipos en un sentido amplio, esto es comprendiendo clases cuando se habla de lenguajes OO. No es objetivo definir aqu lo que es un tipo y simplemente nos quedamos con el concepto de que en OO un tipo determina el tipo de mensajes que puede admitir un smbolo. Cuando dos smbolos son el mismo tipo se entiende que admite exactamente los mismos mensajes. As pues el esquema de la tabla de smbolos consta de dos tablas: Tabla de Smbolos, que sirve para guardar una referencia a todos los smbolos que pueden ser accedidos desde el entorno actual. Esta tabla tiene un comportamiento muy similar a todas las tablas vistas hasta ahora, de hecho alguna de aquellas implementaciones podra funcionar perfectamente (por ejemplo una tabla de acceso hash implementada en pila) Como se puede comprobar en la Figura 27, las operaciones de la clase SymbolTable son las mismas que en las otras implementaciones de tabla de smbolos vistas hasta ahora.

Pgina 46

Administrador de Tabla de Smbolos

FIGURA 27. CLASE QUE IMPLEMENTA LA TABLA DE SMBOLOS.

Tabla de Tipos, que es la que guarda la estructura de tipos definida en el programa fuente: las clases, las interfaces, los tipos bsicos, etc.

FIGURA 28. CLASE QUE IMPLEMENTA LA TABLA DE TIPOS.

NOTA: SE

PUEDE DISCUTIR AQU SI MERECE LA PENA O NO PONER UNA CLASE (FACADE ) QUE UNIFIQUE EL

MTODO DE ACCESO A LA TABLA DE SMBOLOS , LA PROPUESTA DE ESTE DOCUMENTO ES QUE NO ES NECESARIO Y SLO SIRVE PARA PROPONER UNA CLASE CON UN INTERFAZ DEMASIADO GRANDE Y CON

POR OTRO LADO , SE DEMUESTRA QUE EN LA COMPILACIN DE LENGUAJES OO CONVENCIONALES (JAVA , C++, ETC .) NUNCA HAY CONFUSIN EN LA BSQUEDA DE IDENTIFICADORES CUANDO SE TRATA DE UN TIPO Y DE UN SMBOLO .
MTODOS QUE ESTN POCO RELACIONADOS ENTE ELLOS

( MUY

BAJA COHESIN ).

4.3.2 La Jerarqua de Smbolos La jerarqua de smbolos describe todos los posibles smbolos que pueden aparecer en el cdigo fuente. A partir de la tabla de smbolos se accede a estos smbolos (representado aqu por una agregacin, pero que en general ser una acceso algo ms complejo). Cada smbolo tiene tipo y debe poderse acceder a dicho tipo a travs del smbolo. El mtodo de acceso puede ser representado como en este caso por una agregacin o tambin podra estar representado por una relacin cualificada por una cadena que identificara el nombre del smbolo. Este tipo de representacin puede ser implementada por medio de una tabla de acceso hash, de manera que, como en un diccionario, se localizase la entrada del smbolo por su nombre. Este tipo de implementacin est recogida en la mayor parte de las bibliotecas de contenedores de los lenguajes orientados a objetos, map, hashmap, hashtable, etc. Son algunos de los nombres habituales que recibe este tipo de contenedor dependiendo de los leguajes de implementacin.

Pgina 47

Administrador de Tabla de Smbolos

FIGURA 29. JERARQUA DE SMBOLOS.

Obsrvese que en la Figura 29 se ha hecho un esquema muy genrico de tabla de smbolos que prev que cada uno de los posibles smbolos tenga un comportamiento y unas responsabilidades diferentes.

Pgina 48

Administrador de Tabla de Smbolos

FIGURA 30. VERSIN SIMPLIFICADA DE LA JERARQUA DE SMBOLOS.

En general esto no es as, el comportamiento puede quedar perfectamente recogido en los tipos y los smbolos no tienen casi informacin particular, simplemente sirven para determinar la visibilidad desde un punto concreto del cdigo. En estos casos se puede hacer una simplificacin del esquema anterior como puede apreciarse en la Figura 30, por ejemplo se puede guardar en la direccin (que nicamente se usa para la generacin de cdigo) un string con la direccin a generar directamente y no un valor entero que indique un desplazamiento y que hay que convertir en string, en cualquier caso, al generar cdigo. 4.3.3 La Jerarqua de Tipos En paralelo a la jerarqua de smbolos tenemos una jerarqua de tipos donde pueden estar todos los tipos bsicos del lenguaje y los tipos definidos por el usuario (con typedef, clases, etc.). Un esquema bastante general se puede ver en la Figura 31. En este caso se tiene una tabla de tipos (TypeTable) que tiene guardados todos los tipos que aparecen durante la compilacin del cdigo fuente. Al comenzar dicha compilacin estarn nicamente los tipos bsicos del sistema (los BuiltinType). En el momento en que el cdigo comienza a describir clases, arrays, mtodos, interfaces, etc. Va creando los nuevos tipos y metindolos en la tabla. Hay que hacer notar que la clase BuiltinType representa a cada uno de los tipos bsicos del lenguaje, esto es, no existir nunca una clase BuiltinType pero si existirn las clases IntType, DoubleType, BooloeanType, VoidType, etc.

Pgina 49

Administrador de Tabla de Smbolos

FIGURA 31. JERARQUA Y TABLA DE TIPOS.

En esta tabla se guarda la estructura completa de las clases (sus atributos, sus propiedades, sus mtodos, etc.) con todas sus etiquetas de accedo (private, public y protected) o su pertenencia (static o pertenencia a la clase y pertenencia a los objetos).

Pgina 50

Administrador de Tabla de Smbolos

FIGURA 32. LA CLASE CONTIENE MTODOS Y ATRIBUTOS.

Cuando hay que guardar informacin adicional en el atributo o mtodo (static, private, etc.) se crea una asociacin atribuida con la informacin necesaria. Dependiendo de la cantidad de informacin y de la estructura compleja que el lenguaje permita a las clases, la clase TypeTable tendr ms o menos mtodos especializados de insercin y de bsqueda. Desde cada smbolo en la SymbolTable se apuntar a uno de los tipos de esta tabla (que definir su tipo). La definicin de tipos compuestos de otros tipos (por ejemplo una clase que contiene atributos y mtodos) se ha definido mediante una asociacin cualificada por el nombre del atributo, definiendo que su acceso se har a travs de una clave que ser el nombre del atributo. En el caso de la sobrecarga y siendo un mtodo, esta etiqueta no tiene por qu ser nica.

Pgina 51

Administrador de Tabla de Smbolos

FIGURA 33. RELACIN CUALIFICADA Y ATRIBUIDA PARA DETERMINAR EL COMPONENTE DE LA CLASE Y LOS ATRIBUTOS.

Cuando hay que guardar informacin adicional en el atributo o mtodo (static, private, etc.) se crea una asociacin atribuida con la informacin necesaria. Por otro lado cada funcin tiene una relacin de tipos que son sus parmetros y una relacin directa a su tipo de valor de retorno (que puede ser void).

FIGURA 34. HERENCIA.

La herencia se implementa mediante interfaces y clases de manera que las interfaces pueden heredar entre ellas y las clases pueden heredar de otras clases o implementar interfaces. Obsrvese, adems, que la cardinalidad de las relaciones permitira implementar herencia mltiple (Ver Figura 34). 4.3.4 Esquema General de la Tabla de Smbolos Juntado todos los esquemas anteriores obtenemos el Diagrama de Clases de la Figura 35 en el que puede verse el aspecto general de una tabla de smbolos. Se ha usado el esquema de tabla de smbolos ms general, ver prrafos anteriores. Este esquema puede utilizarse para obtener una simplificacin adecuada y adaptada a un compilador concreto.

Pgina 52

Administrador de Tabla de Smbolos

FIGURA 35. ESQUEMA GENERAL DE UNA TABLA DE SMBOLOS CON LAS DOS JERARQUAS DIFERENCIADAS (VER ANEXO 1).

Las dos relaciones de agregacin: SymbolTable a Symbol y TypeTable a Type, se pueden definir tambin como cualificadas a travs de una string que sera el nombre del identificador en el contendor correspondiente. 4.3.5 Funcionamiento y Acceso a la Tabla de Smbolos Sea un lenguaje que tiene los tipos bsicos void, int y double y una estructura en clases similar al Java sin interfaces y con herencia simple. Se trata de hacer un compilador de este tipo de cdigo y, en este caso, hacer la tabla de smbolos de dicho compilador y demostrar que es suficiente para todo el proceso de compilacin. A partir de un cdigo se ir siguiendo toda la formacin de la tabla de smbolos y se podr comprobar cmo funciona el modelo. En los siguientes prrafos se muestra el trozo de cdigo que se desea compilar para ver cmo funciona su tabla de smbolos.
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: forward class TabSimb { public int procesa(int k); public static void main(); } class TSdos { private static int r; public static void m(TabSimb ts, int g) { ts.procesa(g); } }

Pgina 53

Administrador de Tabla de Smbolos 13: 14: public class TabSimb { 15: double p; 16: 17: public int procesa(int k) { 18: int m; 19: double d = k * m; 20: p = 2 * d; 21: return d; 22: } 23: 24: public static void main() { 25: TabSimb t = new TabSimb(); 26: TSdos.m(ts,7); 27: } 28: }

El esquema que se necesita de tabla de smbolos est simplificado con respecto al general que se ha visto anteriormente.

FIGURA 36. TABLA DE SMBOLOS SIMPLIFICADA PARA EL EJEMPLO. (VER ANEXO 2).

Por ejemplo, se ha quitado el tipo BuiltinType y ha sido sustituido por los tipos IntType, DoubleType y VoidType que son los tipos bsicos del sistema. No hay interfaces y la herencia es simple, por tanto slo cabe una relacin de una clase a muchas, ya que una clase slo puede heredar como mximo de otra, pero cada clase puede ser heredada por mltiples clases. El nuevo esquema puede verse en la Figura 36.

Pgina 54

Administrador de Tabla de Smbolos

Antes de comenzar la compilacin se crean dos objetos: mySymbolTable:SymbolTable y myTypeTable:TypeTable. Inmediatamente despus se crean los tipos bsicos: IntType, DoubleType y VoidType y se insertan en la tabla de tipos, por tanto al principio de la compilacin el esquema es como se puede ver en la Figura 37.

FIGURA 37. SITUACIN INICIAL DE LA TABLA DE SMBOLOS.

Comienza la compilacin y se encuentra una definicin (forward) de la clase TabSimb que se implementar con posterioridad. Esta definicin completa dar de alta un nuevo tipo en la tabla de smbolos, como se puede ver en la Figura 38. Como se puede apreciar en dicha figura, se han dado de alta dos mtodos (en el forward slo se declaran los elementos pblicos) y se han creado los objetos de las relaciones atribuidas donde se han colocado los datos referentes a dichos mtodos. Los atributos de esta clase TabSimb, se crearn en la tabla de smbolos durante la compilacin de dicha clase.

Pgina 55

Administrador de Tabla de Smbolos

FIGURA 38. SITUACIN COMPLILANDO EN LA LNEA 3.

Al compilar la lnea 6 se identifica el token class y se ejecuta set en la tabla de smbolos, seguidamente el nombre de la clase TSdos y se crea un nuevo objeto de la clase ClassType para contener este tipo y se da de alta como tipo en la tabla de tipos. La ejecucin del comando set provoca que se cargue en la Pila de Bloques la direccin del puntero al tope de la Pila de Smbolos lo que marca que a partir de este momento los smbolos que aparezcan pertenecern a este mbito. La implementacin de la tabla de smbolos de la figura podra ser una tabla con direccionamiento hash implementada en pila.

FIGURA 39. SITUACIN DESPUS DE COMPILAR LA LNEA 7.

Seguidamente se identifica el private static int r (lnea 7) y se da de alta un nuevo smbolo en la tabla de smbolos, con su tipo apuntando hacia el tipo int de la tabla de tipos. En la Figura 39 se puede ver la situacin de la tabla de smbolos despus de la compilacin de la lnea 7.

Pgina 56

Administrador de Tabla de Smbolos

Al mismo tiempo se da de alta un atributo en la tabla de tipos, dentro del smbolo que identifica la clase TSdos. A continuacin se compila la lnea 9 y se encuentra un mtodo que debe ser dado de alta en la tabla de tipos como parte de la clase TSdos. Al mismo tiempo, en la tabla de smbolos se ejecuta un nuevo set, esta vez por ser el comienzo de un nuevo mtodo y se crean dentro los dos parmetros. Estos parmetros se dan de alta, adems, en la tabla de tipos como parte del mtodo TSdos.m. En la Figura 40 se puede ver la situacin de la tabla de smbolos despus de compilada la lnea 9. En la lnea 10 se encuentra ts. y al buscarlo en la tabla de smbolos se encuentra que es un objeto de la clase TabSimb. Despus, al encontrar la llamada al mtodo procesa (), se busca este a travs de la relacin tipo de: Symbol que apunta a la entrada TabSimb en la tabla de tipos. Al llegar la compilacin a la lnea 11 se ejecuta el reset y se desapila el ltimo bloque anidado que corresponde al mbito del mtodo m de la clase TSdos. Esto elimina los parmetros ts y g de la tabla de smbolos, pero el smbolo r y el nombre del mtodo m siguen estando activos.

FIGURA 40. SITUACIN DE LA TABLA DE SMBOLOS DESPUS DE COMPILADA LA LNEA 9.

Por ltimo, en la lnea 12 se cierra el mbito de la clase TSdos y se ejecuta de nuevo el reset, de manera que de nuevo se elimina un bloque y en este caso se eliminan el atributo r y el mtodo m, aunque siguen accesibles a travs de la clase en la tabla de tipos.

Pgina 57

Administrador de Tabla de Smbolos

FIGURA 41. ESTADO DE LA TABLA DE SMBOLOS DESPUS DE COMPILADA LA LNEA 12.

Ahora se comienza con la compilacin de la siguiente clase (TabSimb), esta clase haba sido introducida en la tabla de tipos previamente mediante una instruccin forward. Este hecho debera quedar marcado para no confundir cuando se ha hecho una declaracin de este tipo y cuando se intenta redeclarar la clase.

FIGURA 42. ESTADO DE LA TABLA DE SMBOLOS DESPUS DE COMPILAR LA LNEA 15.

Esto produce una nueva llamada a set y se crea un mbito para la clase. Adems se introducen en la tabla de smbolos los nombres de los mtodos ya declarados en el forward (procesa y main).

Pgina 58

Administrador de Tabla de Smbolos

En la lnea 15 se introduce un nuevo atributo, esta vez los parmetros no son explcitos y se deber decidir cules son los que queremos poner (por ejemplo private y no static). As pues se introduce este atributo en la tabla de smbolos y en la de tipos con estos modos de acceso.

FIGURA 43. ESTADO DE LA TABLA DE SMBOLOS AL COMPILAR LA LNEA 20.

En la lnea 17 se encuentra el mtodo procesa (ya dado de alta en el forward) y ahora se ejecuta el set para abrir un nuevo mbito. Dentro de este mbito, estarn sus parmetros (k en la lnea 17) y sus variables locales (m en la lnea 18 y d en la lnea 19). En la Figura 43 se puede ver el aspecto de la tabla de smbolos cuando se est compilando la lnea 20. Al llegar a la llave de la lnea 22 se ejecuta el reset y se eliminan el parmetro y las variables locales del mtodo procesa, aunque este nombre permanece en el mbito de la clase. En la lnea 24 comienza el mtodo main, se vuelve a ejecutar el set para crear un nuevo mbito en la tabla de smbolos. En este caso, en la lnea 25 se introduce el smbolo t. En la Figura 44 se puede ver el aspecto de la tabla de smbolos despus de haber sido compilada la lnea 25.

Pgina 59

Administrador de Tabla de Smbolos

FIGURA 44. ESTADO DE LA TABLA DE SMBOLOS DESPUS DE COMPILADA LA LNEA 25.

En la lnea 27 se cierra este mbito y desaparece la variable local t. Despus en la lnea 26 se cierra la llave de la clase y se cierran todos los mbitos. Por ltimo se termina el fichero y por tanto la compilacin. Toda la compilacin anterior se ha realizado usando como modelo un compilador de una pasada. Este tipo de compilacin obliga a la declaracin adelanta (forward) de la clase TabSimb. Se hubiera podido utilizar un modelo de varias pasadas, en este caso la primera pasada introducira en la tabla de smbolos el nivel 0 de cada clase, de manera que en las sucesivas pasadas ya estaran declaradas las clases y mtodos necesarios para la compilacin.

4.4 Tablas de Smbolos OO en Compiladores de Varias Pasadas


Cuando se utilizan compiladores de varias pasadas sobre un rbol AST, la TS puede ser utilizada slo en algunas pasadas (las primeras sobre el AST) y su utilizacin se reduce a la de guardar los contextos hasta que stos son resueltos directamente en el AST. Una vez el AST ha sido decorado con esta informacin (y quizs alguna referencia a algn objeto externo) la TS puede eliminarse y su informacin puede recuperarse desde el propio rbol generado y decorado. Las jerarquas de tipos y smbolos en este caso son similares a las del apartado 4.4 y las mismas que que estn referencias en los anexos:

Pgina 60

Administrador de Tabla de Smbolos

Anexo 1. Diagrama General de Clases y Anexo 2. Tabla de Smbolos Simplificada para el Ejemplo. 4.4.1 Modelos de Descripcin Sobre el AST La informacin de la tabla de smbolos es, fundamentalmente la de smbolos y tipos. Y esa informacin debe quedar reflejada en el AST correspondiente. Hay dos maneras de tratar al smbolo: manteniendo un objeto smbolo o integrando su informacin en propio nodo del AST. Sea el siguiente cdigo de ejemplo de un lenguaje sencillo que slo permite dos tipos bsicos (int y double) y un cdigo principal en que se pueden hacer lecturas, escrituras y expresiones:
1: 2: 3: 5: 6: 7: 8: 9: int i; float f; main () { int f; read f; i = f; write i + 2; }

Una vez generado el rbol AST (usando la descripcin de nodo que se puede encontrar en el Anexo 3. Descripcin de Los Nodos del AST (Ejemplo Primero de Varias Pasadas). Descripcin de los nodos del AST (Ejemplo primero de varias pasadas)) quedara:

FIGURA 45. AST DEL CDIGO DE EJEMPLO.

Pgina 61

Administrador de Tabla de Smbolos

FIGURA 46. ESTRUCTURA DE CLASES DE LA TABLA DE SMBOLOS.

Ahora se lanzara el objeto visitor Identificador que creara las referencias y objetos necesarios para poder obtener el contexto en posteriores pasadas (Segunda pasada si consideramos al anlisis sintctico como la primera pasada y primera pasada con un visitor). Para ello se creara una tabla de smbolos que contendra una tabla de tipos y una de smbolos (propiamente dicha). La tabla de smbolos tiene una estructura de clases formada por dos tablas de acceso hash en una de las cuales se guardan los smbolos del bloque actual y en la otra se guardan los tipos (ver Figura 46). De una forma esquemtica se puede entender la TS como en la siguiente ilustracin:

FIGURA 47. ASPECTO DE BLOQUES DE LA TABLA DE SMBOLOS.

Pgina 62

Administrador de Tabla de Smbolos

Como se puede ver por la ilustracin se han introducido los tipos bsicos en la tabla de tipos. Tambin existe la posibilidad de tratar los tipos bsicos como elementos aparte y usarlos siguiendo un patrn de diseo Singleton. En el diseo realizado la tabla de bloques crea una subtabla de smbolos de acceso hash cada vez que se entra en un bloque (ejecucin de set()). Al ejecutarse el reset() se elimina esa subtabla. Cuando se inserta un elemento (al visitar el nodo Declaracion del AST), se ejecuta la operacin insert() de la TS. Al insertar este nodo se hacen varias operaciones: 1. Se crea un nuevo objeto Symbol para guardar en l la informacin correspondiente al smbolo que se trata de insertar. En la mayor parte de los casos ser su offset. Cabe decir en este momento que este objeto puede ser eliminado totalmente si esta informacin se guarda en el propio nodo Declaracion del AST. 2. Desde este nodo Symbol se referencia al nodo Declaracion del AST y al tipo correspondiente en la tabla de tipos (previamente se har la bsqueda del tipo de su nombre). 3. Ahora se debe modificar el nodo Declaracion para aadirle una referencia al nodo Symbol recin creado. 4. Por ltimo se inserta el objeto Symbol en la HashMap actual de smbolos. Una vez terminada la insercin del smbolo, el AST quedara como se puede ver en la Figura 48. La doble referencia Declaracion<->Symbol para permitir la navegacin en ambos sentidos (segn el momento) hace pensar en una simplificacin si se introduce toda la informacin de Symbol en el propio nodo Declaracion. La modificacin del nodo Declaracion es posible porque este nodo deber tener sus atributos public para poder ser visitado, esto permitir aadirlo informacin. Debe recordarse (del Semntico) que los nodos del rbol AST son objetos de datos ms que objetos con un comportamiento complejo.

Pgina 63

Administrador de Tabla de Smbolos

FIGURA 48. INSERTAR UNA DECLARACIN Y REFERENCIAR UN IDENTIFICADOR.

El visitor Identificador seguir visitando el rbol y al llegar al nodo Identificador (donde se usa esta variable i) precisar hacer las siguientes operaciones: 1. Se busca el identificador i en la TS. 2. Se encuentra el nodo Symbol correspondiente y se retorna esta referencia. 3. El nodo Identificador aade esta referencia (lnea a trazos) para posteriores visitas. En este momento se debe comentar que la lgica de insercin y de bsqueda ha quedado oculta en los dos escenarios contemplados anteriormente, esto es, no se ha considera ni la doble declaracin de un identificador en el mismo mbito ni la utilizacin de un identificador sin su previa declaracin. La lgica en este caso se puede entender la habitual, esto es, si al insertar y smbolo ya existe otro con el mismo nombre en el mismo mbito, se debe producir un error. Del mismo modo, si al buscar un smbolo ste no aparece en el mbito actual, se buscara en todos los mbitos anteriores contenidos en la pila de bloques. Si al llegar al final de la pila todas las bsquedas resultan infructuosas se debe concluir que el smbolo no ha sido adecuadamente declarado y se debe producir el correspondiente error. Al terminar de visitar todo el rbol, en este caso, la TS no es necesaria para posteriores visitas, por lo que la informacin queda referenciada a travs de los objetos actualmente creados.

Pgina 64

Administrador de Tabla de Smbolos

Esta estructura resultante (simplificada para el caso del identificador i se puede ver en la Figura 49. Ahora, para posteriores visitas, desde la Declaracin es posible navegar hasta el Symbol y desde ste hasta el Tipo.

FIGURA 49. ESTRUCTURA AST-TS RESULTANTE UNA VEZ TERMINADA LA VISITA DE IDENTIFICACIN.

Del mismo modo, al llegar al Identificador es posible navegar al Symbol y desde ste al Tipo o al nodo Declaracion del AST. Como se ha comentado en varios sitios en este apartado es posible una simplificacin si se elimina el nodo Symbol y esta informacin se introduce en el propio nodo Declaracion del AST. Cuando se inserta la declaracin en la TS no se crear ningn nodo Symbol y se introducir en el HashMap de smbolos el propio nodo Declaracion con la informacin correspondiente. Una vez terminada la visita, la referencia bidireccional Declaracion<->Symbol no existe y el AST decorado queda bastante ms simplificado con respecto al caso anterior, como se puede ver en la Figura 50.

Pgina 65

Administrador de Tabla de Smbolos

FIGURA 50. ESTRUCTURA SIMPLIFICADA AST-TS SI SE ELIMINA EL OBJETO SYMBOL Y SE INTRODUCE TODA LA INFORMACIN EN EL NODO DECLARACIN DEL RBOL AST.

Una vez visitado el rbol completo, se puede ver en la Figura 51 el aspecto que tendra dicho rbol final (En este caso la clase Integer se ha nombrado como IntType). Las referencias quedan como se representan en dicha figura. Las lneas que unen los nodos Identificacion con los nodos Declaracion no pasan por los objetos Symbol, en este caso se ha asumido que toda la informacin del objeto Symbol se guarda en el propio nodo Declaracion. Los objetos SymbolTable y TypeTable estn en este esquema slo a modo informativo, aunque en realidad, al terminar la visita, no se tendra su referencia.

Pgina 66

Administrador de Tabla de Smbolos

FIGURA 51. RBOL AST DECORADO RESULTANTE DE LA PRIMERA PASADA DEL VISITOR.

4.4.2 Tipos de Usuario Se puede explorar el tipo de usuario struct como ejemplo del modo en que se trataran estos tipos. El primer paso a considerar es que el nodo del AST donde se declare la struct definir al mismo tiempo la estructura del tipo, por lo que se partir del hecho de que este nodo debe implementar ambas interfaces (o jerarquas de herencia): Type y NodoAST. Ahora hay tres niveles de insercin: 1. Insertar un tipo de usuario en la TS y que referencie al Nodo AST correspondiente.

Pgina 67

Administrador de Tabla de Smbolos

2. Declarar un smbolo con el tipo de usuario definido. 3. Usar dicho tipo en algn lugar y referenciar su nodo Identificador adecuadamente. Para los casos segundo y tercero el procedimiento es similar al visto en los casos anteriores, slo que en este caso el objeto Type correspondiente no ser un tipo bsico sino uno que se ha creado previamente. Para insertar el tipo se ha previsto que el propio nodo Struct implemente la interfaz de tipo, como puede verse en la Figura 52. Struct, adems de ser un NodoAST es tambin un tipo ( Struct) y eso le va a permitir formar parte del rbol y del HashMap de tipos.

FIGURA 52. AGREGACIN PREVISTA ENTRE LOS NODOS DEL RBOL AST. VASE LA DERIVACIN QUE STRUCT HACE DE TYPE.

Sea el siguiente cdigo:


1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: struct Concepto { int cantidad; String descrip; float precio; }; main() { int i; i = 2; Concepto con; con.cantidad = 1; con.descrip = "telfono"; con.precio = 240.00; int a[5]; a[i] = 7; }

Al pasar el analizador sintctico generar el rbol AST del apartado 8: Anexo 4. rbol AST del Ejemplo 2 de Varias Pasadas.

Pgina 68

Administrador de Tabla de Smbolos

Observando este rbol se puede ver que toda la estructura del nuevo tipo (Struct) est representada en el propio rbol como nodos AST. Al visitar el visitor Identificador el nodo Struct se genera una llamada a la TS para insertar ste en la tabla de tipos.

FIGURA 53. INSERTAR EL TIPO STRUCT.

Una vez insertado, al navegar por el nodo Declaracion de la Struct con, se produce el mismo cdigo de pasos anteriores, slo que ahora el tipo estar en el propio rbol y por tanto la referencia al tipo ser un nueva referencia a otro nodo del AST (En los casos anteriores los tipos eran los bsicos del lenguaje y se creaban al crear la TS). Por ltimo en el lugar en que se utiliza el Identificador con, se har una referencia al nodo Declaracin correspondiente. El rbol resultante puede verse en la Figura 54. Comprese esta figura con la Figura 50 y se podr ver la similitud de estas declaraciones y estos identificadores con los representados en esta figura con los representados en la otra.

Pgina 69

Administrador de Tabla de Smbolos

FIGURA 54. REFERENCIAS DE DECLARACIN Y TIPO EN EL RBOL AST PARA EL TIPO STRUCT.

4.4.2.1 DECLARACIN DE ARRAYS Los arrays no son nuevos tipos sino que se pueden considerar variantes de los tipos que ya existen, por tanto no definirn nuevos nodos en el rbol que implementen la interfaz Type.

Pgina 70

Administrador de Tabla de Smbolos

FIGURA 55. DECLARACIN DE ARRAYS.

Ntese que el tipo del Identificador es Array en la tabla de tipos y el subtipo de este tipo es Integer. Por otro lado el tipo resultante de aplicar el operador corchete es Integer. 4.4.3 Declaraciones Forward Hay dos maneras de hacer una declaracin forward en un lenguaje a compilar en varias pasadas: 1. Declaracin de prototipos. 2. Pasada previa para reconocer prototipos.
4.4.3.1 DECLARACIN DE PROTOTIPOS El primer caso no tiene ninguna diferencia con la solucin aportada para el caso de una sola pasada. El prototipo debe estar antes de la utilizacin del identificador de manera que se pueda insertar en la TS y cuando se utilice se le har referencia a lo definido en el prototipo.

Cuando se defina el tipo realmente, se comprobar que ha sido definido previamente como un prototipo y que la definicin de tipo definitiva no contradice lo que estuviera ya definido en el prototipo y contenido en la TS.
4.4.3.2 PASADA PREVIA PARA RECONOCER PROTOTIPOS El segundo caso provoca que la visita para reconocer los identificadores se parta en dos:

1. El visitor primero recorre el rbol buscando elementos que puedan definirse como prototipos, por ejemplo estructuras, clases, funciones, mtodos, etc. y los inserta en la TS.
Pgina 71

Administrador de Tabla de Smbolos

2. El segundo Vuelve a recorrer el rbol introduciendo el resto de los elementos en la TS. Ahora ya no hay problemas puesto que todos los tipos de usuraos y las funciones/mtodos existirn en la TS. En este segundo caso se deben tener en cuenta una serie de restricciones sobre la TS: 1. La TS debe ser compartida por dos visitor diferentes, por tanto debe ser declarada en un mbito global a ambos (Tambin podra ser un singleton). 2. No se pueden eliminar los mbitos en la primera pasada, puesto que pueden ser necesarios en la segunda y por tanto hay que reestructurar el comportamiento de la TS para que el reset() no elimine informacin.

Pgina 72

Administrador de Tabla de Smbolos

5 ANEXO 1. DIAGRAMA GENERAL DE CLASES

Pgina 73

Administrador de Tabla de Smbolos

6 ANEXO 2. TABLA DE SMBOLOS SIMPLIFICADA PARA EL EJEMPLO

Pgina 74

Administrador de Tabla de Smbolos

7 ANEXO 3. DESCRIPCIN DE LOS NODOS DEL AST (EJEMPLO PRIMERO DE VARIAS PASADAS)

Pgina 75

Administrador de Tabla de Smbolos

8 ANEXO 4. RBOL AST DEL EJEMPLO 2 DE VARIAS PASADAS

Pgina 76

Administrador de Tabla de Smbolos

9 BIBLIOGRAFA, LINKOGRAFA Y REFERENCIAS


Bibliografa
Louden, K. C. (2005). Construccin de Compiladores: Principios y Prctica. Mxico: Editorial Thomson.

Linkografa
http://es.wikipedia.org/wiki/Tabla_de_s%C3%ADmbolos_(compilador) http://www.monografias.com/trabajos11/compil/compil.shtml?monosearch http://pdf.rincondelvago.com/compiladores_automatas-finitos.html http://www.di.uniovi.es/procesadores/Apuntes/TablasSimbolos/TablasDeSimbolos.pdf

Pgina 77

También podría gustarte