Vous êtes sur la page 1sur 25

Ao de la Inversin para el Desarrollo Rural y la Seguridad Alimentaria

Curso: Teora de Lenguajes

INTEGRANTES: Mamani Sanchez Jessit DOCENTE: Miguel ngel Silva Zapata Lic. Rubn Almendrades Zarzosa

2012-2

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

A nuestros padres por apoyarnos cada da de nuestras vidas y a nuestros docentes por guiar nuestro camino cada da en la Universidad y fuera de ella.

EL EQUIPO.

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

1. Introduccin 2. Objetivos de la Tabla de Smbolos (TS) Las Tablas de Smbolos (en adelante TS) son estructuras de datos que almacenan toda la informacin de los identificadores del lenguaje fuente. Las misiones principales de la TS en el proceso de traduccin son: Colaborar con las comprobaciones semnticas. Facilitar ayuda a la generacin de cdigo. La informacin almacenada en la TS depende directamente del tipo de elementos del lenguaje especfico a procesar y de las caractersticas de dicho lenguaje. Habitualmente los elementos del lenguaje que requieren el uso de la TS son los distintos tipos de identificadores del lenguaje (nombres de variables, de objetos, de funciones, de etiquetas, de clases, de mtodos, etc.). La informacin relativa a un elemento del lenguaje se almacena en los denominados atributos de dicho elemento. Estos atributos tambin varan de un tipo de lenguaje a otro y de un elemento a otro. As ejemplos de atributos tales como nombre, tipo, direccin relativa en tiempo de ejecucin, dimensiones de los arrays, nmero y tipo de los parmetros de procedimientos, funciones y mtodos, tipos de acceso a los elementos de una clase (public, private, protected), etc. se recogen y se guardan en la TS. Los atributos se obtienen unas veces directamente del anlisis del programa fuente, es decir, estn en forma explcita (por ejemplo en la seccin de declaraciones del programa fuente) y otras veces los atributos se obtienen de forma implcita a travs del contexto en el que aparece el elemento en el programa fuente. 3. Compiladores de una y de varias pasadas

3.1

Compiladores de varias pasadas

En un compilador de varias pasadas, tal como el de la Figura 1-1, la TS se crea durante

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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 usadas 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 toquen 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-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. Las hojas del rbol contienen los ndices de la TS correspondientes a los identificadores detectados.

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

toda la 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. 3.2 Compiladores de una pasada

Una segunda aproximacin al manejo de las TS se presenta en la Figura 1-3, donde el anlisis lxico, sintctico, semntico y la generacin de cdigo se realizan en una pasada, es decir, se explora el texto fuente sentencia a sentencia (o bloques de sentencias) realizndose los tres anlisis y la generacin de cdigo.

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

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

En este compilador de una pasada la TS slo est conectada al anlisis sintctico y a travs suyo al resto de los mdulos. Una excepcin de lo anterior ocurre cuando el analizador sintctico requiere cierta informacin del analizador lxico durante el proceso de compilacin. Por ejemplo, en algunos lenguajes de programacin es conveniente reconocer por medio de una tabla en el analizador lxico el tipo de un identificador particular. Con esta informacin el analizador sintctico recibe un token con un significado adicional, tan como identificador real o identificador entero, que es mejor que pasar identificador. Esta estrategia tiene dos ventajas: 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. 4. Contenidos de la TS Una TS se puede definir como una estructura de datos organizada en funcin de los identificadores que aparecen en el programa fuente. Aunque su nombre parece indicar una estructuracin en una tabla no es necesariamente sta la nica estructura de datos utilizada, tambin se emplean rboles, pilas, etc. Lo que la estructura debe permitir es establecer un homomorfismo entre los mbitos de utilizacin de los smbolos en el programa fuente y el modo en que 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 (symbol-table record).

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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

Ing. Sistemas e Informtica Facultad de Ciencias


Nmero de la lnea del texto fuente en que la variable est declarada.

UNASAM

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

Figura 2-2. Descriptor de nombres de identificadores (strings) 4.2 Atributos de los identificadores

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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. 4.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. 4.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. 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. 4.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 [CUEV95c]. El nmero de parmetros en la llamada a un procedimiento o funcin debe 4.2.4 Valor mximo de las dimensiones o rangos de arrays

10

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

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; 5. Organizacin de tablas de Simbolos 5.1 Tablas no ordenadas

Insercin: en el primer lugar vaco. Bsqueda: secuencial, elemento a elemento. Lm = (n+1)/2 LM = N La bsqueda es muy lenta cuando el nmero de elementos es mayor que 20. 5.2 Tablas ordenadas

Los elementos se ordenan con algn criterio (p.e. alfabticamente). Bsqueda binaria o logartmica. Algoritmo de bsqueda en el bloque (1,n):

Se mira el elemento (n+1)/2. Si es ese, encontrado. Si es menor, se busca en el bloque (1,(n-1)/2).

11

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

Si es mayor, se busca en el bloque ((n+3)/2,n).

Longitud de bsqueda: Lm = 1+log2 (n) mucho mejor que en tablas no ordenadas. Insercin:

Se usa la bsqueda binaria para encontrar el elemento j tal que K(E(j))<k<K(E(j+1))

Si la tabla es consecutiva, se corre toda la tabla un lugar desde E(j+1) hasta E(n) y se introduce el elemento nuevo en E(j+1).

Si la tabla es ligada, se inserta un elemento nuevo entre E(j) y E(j+1).

En tablas consecutivas, si se van a insertar muchos elementos a la vez, podra convenir ordenarlos al final para evitar tantos traslados. 5.3 Tablas en rbol binario

Usan rboles binarios. Se compara la clave k con la del elemento. Si es mayor, se va a la derecha, si es menor a la izquierda. El tiempo de bsqueda depende del orden de insercin de los elementos y slo es calculable si el rbol est equilibrado. Si no, se convierte en una lista ordenada, reordenando. Ej: G D M E A B F H. Secuencias aparentemente aleatorias pueden producir el mismo resultado. Implementacin: con dos punteros: izquierda, derecha; o con una tabla secuencial (2*i+1, 2*i+2). 5.4 Tablas de acceso directo

A cada clave se le asocia biunvocamente un elemento de la tabla mediante una funcin I(k) biyectiva.

12

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

Ejemplo: identificadores de una sola letra. La tabla tendr 26/52 elementos como mximo. I(k) = k-'A'; // (26 elementos) I(k) = (k<'a') ? k-'A' : 26+k-'a'; // (52 elementos) Bsqueda: dado k, se halla I(k) y se tiene el elemento. Li = Lm = LM = 1 Problema: si hay muchos identificadores, I no podr ser biyectiva. Llega un moment en que obtener I(k) lleva ms tiempo que la bsqueda. 5.5 Tablas Hash o de entrada calculada

Es el mtodo ms usado. Se trata de trasformar la clave en un ndice de entrada aplicndole una funcin Hash, I(k), que puede no ser biyectiva. Es equivalente a una tabla de acceso directo mientras no aparezcan dos claves tales que I(k1) = I(k2): colisin. Hay dos mtodos principales para resolver la colisin. 5.5.1 Tablas Hash abiertas (con rehash) Supongamos que los elementos de T son 0,1,...,N-1. Bsqueda de la clave k.

Se calcula h = I(k). Se compara k con T(h). Si es igual, encontrado. Si hay colisin (k!=T(h)&&T(h)!=NULL) se compara k con T(mod(h+p1,N)). Si hay nueva colisin se compara k con T(mod(h+p2,N)). ... Si hay nueva colisin se compara k con T(mod(h+pi,N)).

13

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

hasta que se encuentre la clave buscada, un lugar vaco o se vuelva a T(h). En el primer caso, se ha encontrado. En el segundo, no est en la tabla. En el tercero, tampoco est, y la tabla est llena para ese valor de la funcin Hash.

Este almacenamiento se llama espaciado, porque los elementos ocupados estn esparcidos por la tabla. Tipos de rehash: lineal, aleatorio, multiplicativo, cuadrtico. 5.5.1.1 pi = i Se comparan elementos sucesivos. Problema: apiamiento de elementos. La longitud de bsqueda es difcil de calcular (depende del grado de apiamiento, y ste del orden en que se definen los identificadores). Peterson realiz simulaciones. Schay y Spruth aplicaron la hiptesis de que en el apiamiento todos los elementos de la posicin i aparecen antes que los de la posicin i+1 y obtuvieron la frmula: Lm = (1- /2)/(1- ) Resultados: Peterson --0.1 0.2 0.3 0.4 0.5 -------1.053 1.137 1.230 1.366 1.541 Schay/Spruth -----------1.056 1.125 1.214 1.333 1.500 2.35 1.43 -----A.C.M. Rehash lineal

14

Ing. Sistemas e Informtica Facultad de Ciencias


0.6 0.7 0.8 0.9 1.823 2.260 3.223 5.526 1.750 2.167 3.000 5.500 5.22 3.24

UNASAM

Es mucho mejor que la bsqueda binaria. No depende del nmero de elementos, sino del grado de ocupacin. 5.5.1.2 Rehash aleatorio

pi = pseudoaleatorio. Se elimina el apiamiento. Lm = -loge(1Resultados:

--0.1 0.5 0.9 5.5.1.3

-------1.05 1.39 2.56 Rehash multiplicativo

pi = ih, donde h es el ndice original. Se prueban los elementos h, 2h, 3h, ... (mod N) Funciona bien si N es primo (cubre toda la tabla). h nunca puede valer 0. La tabla ir de 1 a N-1.

15

Ing. Sistemas e Informtica Facultad de Ciencias


5.5.1.4 Rehash cuadrtico

UNASAM

pi = a.i*2+b.i+c Hay que procurar que cubra lo ms posible la tabla. Si N = 2*p no cubre casi. Si N es primo, cualquier combinacin de a,b,c cubre media tabla. Es peor que el aleatorio, pero Lm y el tiempo de clculo de pi son mejores. Ejemplo: sea c=0, para incluir p0 (h=h+p0 => p0=0 => c=0). -p(i) = 2.a.i+a+b Hacemos a=-1/2 para que el coeficiente de i sea -1. una variable con el valor del incremento e ir disminuyendo una unidad cada vez. -i+b-1/2 Se puede usar esa variable para parar. Por ejemplo, si la tabla tiene 787 elementos, tendremos que pararnos tras 393 intentos. Si hacemos -1. Entonces b=392+1/2. Y la frmula queda: pi = -i*2/2+(392+1/2)i pi = p(i-1) + p0 = 0 p0 = 392 pi = p(i-1) - 1 p(i-1)

5.5.2 Tablas Hash con encadenamiento Puede ser interno o con "overflow"

16

Ing. Sistemas e Informtica Facultad de Ciencias


5.5.3 Tabla Hash con encadenamiento interno

UNASAM

Vector Hash VH: contiene punteros a la tabla para el primer elemento que corresponde a cada valor de la funcin Hash.

Tabla propiamente dicha: contiene tradas (clave, valor, encadenamiento). Inserciones secuenciales. Hay un puntero a la ltima posicin ocupada o la primera libre.

Proceso de bsqueda: 1. Se calcula H(k). 2. Se indexa VH(H(k))=t. 3. Si t es NULL no est el elemento. Se sale. 4. Se compara k con K(t). Si son iguales, encontrado. Se sale. 5. Se hace t=E(t) y volvemos al paso 3. Proceso de insercin. Sea L el puntero a la primera posicin libre de la tabla: 1. Se calcula H(k). 2. Se indexa VH(H(k))=t. 3. Si t es NULL no est el elemento. Si la tabla no est llena, se hace *L=(k,v,NULL); H(k)=L; L++ y se sale. 4. Se compara k con K(t). Si son iguales, error. Se sale. 5. Se hace t=E(t). 6. Si t no es NULL se vuelve al paso 4. 7. Si la tabla no est llena, se hace *L=(k,v,NULL); E(t)=L; L++ y se sale. Si la tabla se llena, se puede alargar mediante la memoria dinmica. Tambin se puede emplear una tabla ligada, en vez de secuencial. El vector Hash debe estar inicializado a NULL. Lm = 1 + (n-1) / (2N) -1)/(2N) < 1.5

17

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

Supresin de entradas: o bien se pone marca de entrada suprimida o un doble encadenamiento. En el primer caso, la insercin no se hace en la primera posicin vaca, sino en la primera posicin suprimida por la que se pas, quitndole la marca. 5.5.4 Encadenamiento con "overflow" Es igual, slo que el vector Hash se ampla para incluir tambin (k,v) y se incorpora a la tabla. Se reduce ligeramente el tiempo de bsqueda. 5.5.5 Funcin Hash 1. Suma/O exclusivo de las letras del identificador, formando una palabra (un byte) W. 2. Se reduce W a un ndice para el vector Hash. 1. Si la tabla tiene N = 2*p entradas, se cogen los p bits medios de WxW. 2. O se usa una funcin lgica (ej. O exclusivo) con partes de W. 3. O se descompone W en secciones de p bits, se suman y nos quedamos con los p bits de la derecha. 4. O se usa el resto de W/N. En PL/I IBM se usa esta versin con 211 elementos en el vector Hash. 5. O se toman los p ltimos bits. Tablas de intrpretes APL. 5.5.6 Tablas de smbolos de estructura de bloques. Utiles para lenguajes de estructura de bloques: Algol, PL/I, Pascal, C. Ejemplo:

18

Ing. Sistemas e Informtica Facultad de Ciencias


{ // Bloque 1 int a, b, c, d; { int e, f; L1: } { int g, h; L2: { int a; } L3: } } // Bloque 4 // Bloque 3 // Bloque 2

UNASAM

Cualquier lnea de un programa est contenida en uno o ms bloques que definen mbitos de validez de nombres. El mbito definido por el bloque ms profundo que contiene la instruccin que estamos analizando, se llama mbito actual. Los mbitos que rodean a una lnea de un programa son abiertos respecto a esa lnea. Los que no la rodean son cerrados respecto a esa lnea. En el ejemplo anterior, si tomamos como referencia la lnea "int a;", los mbitos abiertos son los correspondientes a los bloques 1, 3 y 4. El bloque 2 es un mbito cerrado. El mbito actual es el bloque 4. Para saber qu nombres estn activos en un punto de un programa, se utilizan las siguientes reglas:

Slo son accesibles los nombres definidos en el mbito actual y en los mbitos abiertos que le rodean.

Si un nombre se declara en ms de un mbito abierto, slo es accesible el que est definido en el mbito ms profundo.

19

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

Son inaccesibles las variables definidas en un mbito cerrado. En el ejemplo anterior, los nombres e, f y L1: son inaccesibles desde los bloques 3 y 4. Desde el bloque 4 es accesible el "int a" definido en el propio bloque, pero no "int a", definido en el bloque 1. Los nombres de los argumentos de un programa son locales al programa. El nombre del programa es local al bloque donde se declar el programa y global al propio programa. Si no fuera as, el programa sera inaccesible. Hay dos modos de implantar las tablas de smbolos de bloques:

Una tabla por mbito Una tabla nica para todos los mbitos.

La tabla nica suele utilizarse en compiladores de un solo paso, en los que se puede descartar la informacin referente a un mbito en cuanto se cierra. Un compilador de mltiples pasos suele usar una tabla individual por mbito. 5.5.7 Una tabla por mbito Hay que asegurarse de que slo son accesibles los nombres que cumplen las reglas. Para ello se crea una lista de mbitos. Los mbitos abiertos se encuentran situados en la lista en orden de apertura, con el actual en primer lugar. El problema surge con el manejo de los mbitos cerrados. En este caso hay que tener en cuenta el tipo de compilador:

Si el compilador es de un solo paso, los mbitos cerrados se pueden descartar, y la lista se convierte en una pila. Para buscar un nombre se empieza por el mbito situado en lo alto de la pila y se va descendiendo hasta que se encuentra o hasta que se acaba la pila. En el ejemplo anterior, la pila de mbitos tendra la siguiente estructura a lo largo del anlisis:

20

Ing. Sistemas e Informtica Facultad de Ciencias


Bloque 2: e,f,L1: Bloque 1: a,b,c,d Bloque 3: i,h,L2:,L3: Bloque 1: a,b,c,d

UNASAM

Bloque 1: a,b,c,d

Bloque 4: a Bloque 3: i,h,L2:,L3: Bloque 3: i,h,L2:,L3: Bloque 1: a,b,c,d

Bloque 1: a,b,c,d

Bloque 1: a,b,c,d

Si el compilador tiene ms de un paso, har falta guardar la informacin relativa a los mbitos cerrados para utilizarla en pasos posteriores. En este caso, la lista de mbitos del ejemplo tendra la siguiente estructura a lo largo del anlisis:

Bloque 2: e,f,L1: *Bloque 2: e,f,L1: *Bloque 1: a,b,c,d *Bloque 3: i,h,L2:,L3: Bloque 1: a,b,c,d

Bloque 1: a,b,c,d

Bloque 2: e,f,L1: *Bloque 4: a

Bloque 2: e,f,L1: Bloque 4: a

Bloque 2: e,f,L1: Bloque 4: a

Bloque 3: i,h,L2:,L3:*Bloque 3: i,h,L2:,L3: Bloque 3: i,h,L2:,L3: Bloque 1: a,b,c,d Bloque 1: a,b,c,d *Bloque 1: a,b,c,d

donde son activos el bloque marcado con un asterisco y los situados por debajo del mismo. Los bloques nuevos se insertan en la tabla al analizar el smbolo {. Cuando aparece el smbolo }, el bloque queda cerrado y los nuevos bloques se insertan por debajo de l. La bsqueda se realiza slo en el bloque actual si se trata de una declaracin, o en l y sus antepasados en cualquier otro caso. Los problemas que presenta esta implantacin son:

Bsqueda en mltiples tablas de smbolos, con la consiguiente prdida de tiempo.

Fragmentacin del espacio de almacenamiento de las tablas

21

Ing. Sistemas e Informtica Facultad de Ciencias


5.5.8 Una sola tabla de smbolos

UNASAM

En este caso, todos los identificadores de todos los mbitos estn en la misma tabla. Cada identificador lleva informacin sobre el mbito al que pertenece. Un identificador puede aparecer varias veces, siempre que cada aparicin lleve un nmero de mbito diferente. En el ejemplo anterior: Bloque Bloque superior N elementos Puntero ------- --------------- ------------ ------1 2 3 4 0 1 1 3 4 3 4 1 4 1 3 2

Subtablas, guardadas por orden de aparicin de } 1: e, f, L1 2: a 3: g, h, L2, L3 4: a, b, c, d Procedimiento de creacin: El final de la tabla de smbolos se usa como una lista al revs. Cuando aparece { se aade un bloque y se pone el puntero al final de la lista. Cuando llega } se vaca la lista correspondiente al bloque que termin, copiando al principio de la tabla. Insercin: se aade a la lista del final de la tabla de smbolos, se corre el puntero y se aumenta en 1 el nmero de elementos de ese bloque. Bsqueda: se busca en el bloque presente slo (si es una declaracin) o en l y sus antepasados en otro caso.

22

Ing. Sistemas e Informtica Facultad de Ciencias


Ejemplo:

UNASAM

En L1: <---disponible---> L1,f,e,d,c,b,a 0 4 ----------------------------------|------| 1 3 ----------------------------------| En L2: L1,f,e<-disponible-> L2,h,g,d,c,b,a 0 4 ---------------|--------------------|------| 1 3 ---------------| |

1 3 ------------------------------------| En L3: L1,f,e,a<-disponible-> L3,L2,h,g,d,c,b,a 0 4 ---------------|------|---------------|---------| 1 3 ---------------| | |

1 4 ----------------------|---------------| 3 1 ----------------------|

Las ventajas de esta implantacin respecto a la de mltiples tablas son:


La bsqueda es ms rpida, ya que slo hay que buscar en una tabla. El espacio ocupado es menor, pero la diferencia queda compensada con el hecho de que en esta implantacin hay un campo ms (mbito).

El valor Puede depender del identificador (tamao variable). Si no, pueden ponerse varios tamaos estndar o poner un puntero al valor. Informacin requerida:

Clase de identificador: variable, funcin/procedimiento, etiqueta, tipo, valor de enumeracin, etc.

23

Ing. Sistemas e Informtica Facultad de Ciencias

UNASAM

Tipo: entero, real, lgico, complejo, carcter, cadena, estructura, tipo declarado, etc.; funcin con resultado, sin resultado, operador, cuntos argumentos, etc.

Precisin, escala Forma: escalar, "array", lista, etc. Dimensiones: nmero, valores si son constantes. Direccin asociada. Si se ha declarado. Si es un parmetro de una rutina, de un FOR, etc. Si se le ha asignado valor. Si tiene valor inicial. Si est en un COMMON, EQUIVALENCE, etc. Si es esttico, dinmico, automtico, externo, etc. Si es funcin recursiva. Lista de parmetros, variables locales, etc.

24

Vous aimerez peut-être aussi