de
Smbolos
de
Procesadores
de
Lenguaje
Cuaderno N 41
Cuaderno Didctico N 41
Tablas de Smbolos de Procesadores de Lenguaje
Autores:
Aquilino Adolfo Juan Fuente
Juan Manuel Cueva Lovelle
Francisco Ortn Soler
Ral Izquierdo Castanedo
M Cndida Luengo Dez
Jose Emilio Labra Gayo
Universidad de Oviedo - Espaa
Editorial:
SERVITEC
ISBN: 84-688-7631-3
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
INDICE DE MATERIAS
1
Introduccin.............................................................................................................. 4
1.1
1.2
1.3
1.3.1
1.3.2
Contenidos de la TS.................................................................................................. 9
2.1
2.2
2.2.1
2.2.2
Tipo......................................................................................................... 12
2.2.3
2.2.4
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........................................................................................... 14
2.2.7
Descriptor de ficheros............................................................................. 14
2.2.8
3.1.1
3.1.2
3.2
3.2.1
4
Organizacin de la TS ............................................................................................ 17
4.1
4.1.1
TS no ordenadas ..................................................................................... 18
4.1.2
TS ordenadas .......................................................................................... 20
4.1.3
1.1.1.1.
4.1.4
4.1.4.1
4.1.4.2
4.1.4.3
Pgina 2 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.1.4.3.1
4.1.4.3.2
4.1.5
4.2
Conclusiones........................................................................................... 37
Lenguajes estructurados en bloques ............................................................... 37
4.2.1
4.2.2
4.2.3
4.2.4
4.3
4.3.1
4.3.2
4.3.3
4.3.4
4.3.5
4.4
4.4.1
4.4.2
4.4.2.1
4.4.3
4.4.3.1
Declaracin de prototipos................................................................... 69
4.4.3.2
Anexo 3. Descripcin de los nodos del AST (Ejemplo primero de varias pasadas)
72
Pgina 3 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 [HOPCR02, CUEV03], la utilizacin de gramticas sensibles al contexto (o
de tipo 1) permitiran identificar sintcticamente caractersticas como que la utilizacin
de una variable en el lenguaje Pascal ha de estar previamente declarada. Sin embargo, la
implementacin de un analizador sintctico basado en una gramtica de estas
caractersticas sera computacionalmente ms compleja que un autmata de pila
[LOUDE97].
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.
Pgina 4 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
Pgina 5 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 6 de 75
TABLAS DE SMBOLOS
PROCESADORES 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 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.
Pgina 7 de 75
TABLAS DE SMBOLOS
1.3.2
PROCESADORES DE LENGUAJE
En este caso puede suceder que una declaracin de una variable sea procesada por el
generador de cdigo antes de que se acabe de explorar el texto fuente. Esto puede ser de
gran ayuda, puesto que toda variable detectada despus de su declaracin permite que
sean colocados sus atributos en la TS por el generador de cdigo.
En este compilador de una pasada la TS slo est conectada al anlisis sintctico y a
travs suyo al resto de los mdulos.
Una excepcin de lo anterior ocurre cuando el analizador sintctico requiere cierta
informacin del analizador lxico durante el proceso de compilacin. Por ejemplo, en
algunos lenguajes de programacin es conveniente reconocer por medio de una tabla en
el analizador lxico el tipo de un identificador particular. Con esta informacin el
analizador sintctico recibe un token con un significado adicional, tan como
identificador real o identificador entero, que es mejor que pasar identificador.
Esta estrategia tiene dos ventajas:
Pgina 8 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
2 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).
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.
Pgina 9 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
Campo puntero para construir una lista encadenada que permita listar las
variables en orden alfabtico en las fases de depuracin de cdigo.
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.
Pgina 10 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
2.2.1
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 Figura 2-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 [CUEVA95c].
Pgina 11 de 75
TABLAS DE SMBOLOS
2.2.2
PROCESADORES DE LENGUAJE
Tipo
2.2.3
2.2.4
Pgina 12 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
2.2.5
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.
Pgina 13 de 75
TABLAS DE SMBOLOS
2.2.6
PROCESADORES DE LENGUAJE
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.
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
Figura 2-3. Tabla de Smbolos con referencias cruzadas como atributo de los smbolos.
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 TS
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.
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
Pgina 15 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
3.2.1
Pgina 16 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 3-1).
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 TS
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.
Pgina 17 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.1.1
TS no ordenadas
i (n + 1) n n + 1
LMI =
=
=
i =1
2n
Pgina 18 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
(n + 1) n
i =1
i =
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 n 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 (n + 1)/2
comparaciones para localizar el conjunto de atributos de dicho identificador. Si
denominamos r 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:
LMI = r n +
(1 r )(n + 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.
Pgina 19 de 75
TABLAS DE SMBOLOS
4.1.2
PROCESADORES DE LENGUAJE
TS ordenadas
En la Figura 4-2 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 LMI de (n + 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 (n c) comparaciones seguida por c traslaciones. Siendo c el lugar del nuevo
registro a insertar. En total son n operaciones elementales: n c + c.
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. Vase [KNUTH73].
Una aproximacin al clculo de la LMI: 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 n los
registros potenciales comparables son:
2 n +1
Pgina 20 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Del anlisis anterior se puede deducir que la LMI, usando la bsqueda binaria, es:
(log 2 n ) + 1
para una tabla de tamao n.
Por ejemplo en la TS de la Figura 4-2, n=7, luego la longitud mxima a investigar es:
(log 2 7 ) + 1 = 3
La LMI se calcula a continuacin:
1
1
(log n )
1 1 + 2 2 + 4 3 + ... + 2 2 ((log 2 n ) + 1) =
n
n
(log 2 n )+1
(2
i 1
i =1
(log 2 n ) 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 log2 n se hace del modo siguiente:
log 2 n = x
n = 2x
log10 n = x log10 2
x=
log10 n
log10 2
log10 n
0,301030
log 2 n = 3,3219 log10 n
x=
4.1.3
Pgina 21 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
Pgina 22 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-5.
Esta estructura se cre con los registros introducidos por el orden:
o tambin:
Pgina 23 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
el rbol que se crea es diferente. En la Figura 4-6 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.
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 4-7.
Es obvio que en el caso anterior la estructura del rbol binario ha degenerado en una
lista con una LMI de:
n +1
2
Hibbard [HIBB62] demostr que para rboles generados aleatoriamente, la LMI ms
probable es 1,4 log 2 n .
Pgina 24 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-7.
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 4-5 y en la Figura 4-6 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 4-8.
La insercin del registro de la variable anho obliga a una completa reorganizacin, pues
cambian todos los campos de encadenamiento de la estructura del rbol, el resultado es
el rbol de la Figura 2-3.
Sin embargo, para lograr un rbol equilibrado ptimo se necesita examinar todos los
nodos del rbol, lo cual requiere del orden de n operaciones elementales.
Para reducir los criterios de equilibrado ptimo, que algunos autores denominan
equilibro perfecto, Adelson-Velskii y Landis [AVL62] 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 log2 n.
1.1.1.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.
Pgina 25 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Cada nodo tiene un indicador de equilibrio en un campo del registro, que indica el
estado del nodo en cada instante.
La Figura 4-9 muestra dos rboles equilibrados.
Para finalizar se puede mencionar que Severance [SEVE74] sugiri una organizacin
del tipo mostrado en la Figura 4-11. 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.
Pgina 26 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.1.4
Los mtodos de organizacin de una tabla de smbolos vistos hasta ahora tienen una
longitud media de investigacin del orden de
log 2 n
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).
n
m
Pgina 27 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 denomina 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
Cdigo
10
11
12
36
37
38
39
1000100
0100011
ASCII en binario
101
104
043
ASCII en octal
65
68
35
ASCII en decimal
C1
C4
7B
EBCDIC en hexadecimal
Pgina 28 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
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 [BUCH63], pero da buenos resultados cuando
se aplica a algunos conjuntos de claves (Lum et al. (LUM71]).
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
356
Pgina 29 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
196
123
241
Pgina 30 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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
DIRECCIN
NODE
STORAGE
AN
ADD
FUNCTION
BRAND
PARAMETER
Si se utiliza la inspeccin lineal para resolver las colisiones en una tabla con m = 11 se
obtiene el resultado de la Figura 4-12.
Pgina 31 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
E (LMI ) =
2
1
1+
2
(
1 )
E (LMI ) =
2
NMERO DE INSPECCIONES
CON XITO
INFRUCTUOSAS
0,10
1,056
1,118
0,20
1,125
1,281
0,30
1,214
1,520
0,40
1,333
1,889
0,50
1,500
2,500
0,60
1,750
3,625
0,70
2,167
6,060
0,80
3,000
13,000
0,90
5,500
50,500
0,95
10,500
200,500
Pgina 32 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
H 2 (k ) = 1 + (k mod(m 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
H2(125) = 5
y la serie de valores generada es:
9
11
10
12
ln (1 )
1
1
Pgina 33 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
FACTOR DE CARGA
NMERO DE INSPECCIONES
CON XITO
INFRUCTUOSAS
0,10
1,054
1,111
0,20
1,116
1,250
0,30
1,189
1,429
0,40
1,277
1,667
0,50
1,386
2,000
0,60
1,527
2,500
0,70
1,720
3,333
0,80
2,012
5,000
0,90
2,558
10,000
0,95
3,153
20,000
Pgina 34 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
Debe notarse que, en este caso, la insercin en la lista de registros colisionados se hacen
por orden alfabtico del nombre de los identificadores. Est demostrado que esta tcnica
reduce el tiempo de bsqueda en investigaciones infructuosas. Knuth [KNUTH73]
demostr que la longitud media de investigacin esperada para el encadenamiento
directo es la siguiente:
E (l.m.de i ) = 1 +
2
E (l.m.de i ) = + e
Pgina 35 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
NMERO DE INSPECCIONES
CON XITO
INFRUCTUOSAS
0,10
1,050
1,005
0,20
1,100
1,019
0,30
1,150
1,041
0,40
1,200
1,070
0,50
1,250
1,107
0,60
1,300
1,149
0,70
1,350
1,197
0,80
1,400
1,249
0,90
1,450
1,307
0,95
1,475
1,337
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 4-14 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 4-15.
Pgina 36 de 75
TABLAS DE SMBOLOS
4.1.5
PROCESADORES DE LENGUAJE
Conclusiones
Pgina 37 de 75
TABLAS DE SMBOLOS
4.2.1
PROCESADORES DE LENGUAJE
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 lo bloques.
BBLOCK
REAL X, Y;
STRI NG NAME;
.
.
.
M1: PBLOCK ( I NTEGER I ND) ;
I NTEGER X;
.
.
.
CALL M2( I ND+1) ;
.
.
.
END M1;
M2: PBLOCK( I NTEGER J) ;
.
.
BBLOCK;
ARRAY I NTEGER F( J) ;
.
.
.
END;
END M2;
.
.
.
CALL M( X/ Y) ;
.
.
.
END;
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 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
Pgina 38 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Inactivas
Set BLK1
Set BLK2
M1, NAME, X, Y
Reset BLK2
Set BLK3
X, IND
Set BLK4
X, IND
Reset BLK4
X, IND
Reset BLK3
TEST1, F, X, IND
J, M2, M1, NAME, X, Y, TEST1, F, X,
IND
Reset BLK1
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 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.
Pgina 39 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.2.2
Pgina 40 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.2.3
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:
o Localizar la posicin del registro en la tabla.
Pgina 41 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
o Sacar el registro y cambiar los punteros de las ramas del rbol necesarias.
o 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 4-18) y 4 (Figura 4-19).
Figura 4-18. 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 4-19.
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 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-19. Tabla de smbolos con estructura de rbol implementada en pila despus de la
compilacin del bloque 4
4.2.4
Direccin
M1
NAME
IND
TEST1
M2
11
Pgina 43 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Figura 4-20. Tabla de smbolos con estructura hash implementada en pila despus de la
compilacin del bloque 2
Figura 4-21. Tabla de smbolos con estructura hash implementada en pila en el momento anterior a
la terminacin de la compilacin del bloque 4
Pgina 44 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 45 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-23).
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 4-23. Esquema del compilador (T) en que se muestra que el lenguaje fuente y el de
implementacin son orientados a objetos
4.3.1
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. (Ver [ORTIN04])
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).
Pgina 46 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 mtodos que estn poco relacionados ente ellos (muy baja cohesin). 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.
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 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
SymbolTable
+
+
+
+
insert() : void
search() : Symbol
set() : void
reset() : void
name
Symbol
-
name: string
address: string
+ getType() : Type
+ getName() : string
+ getAddress() : string
Type
+has
type
LocalVar
Field
Atribute
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
Parameter
Property
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
insert() : void
search() : Symbol
set() : void
reset() : void
name
GenericSymbol
-
name: string
address: string
+has
Type
type
+ getName() : string
+ getType() : Type
+ getAddress() : string
Pgina 48 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
4.3.3
La jerarqua de tipos
SymbolTable
+ insert() : void
+ search() : Type
name
name
+has
Symbol
Type
type
+field
+atribute
+implements
BuiltInType
ArrayType
ClassType
InterfaeType
+extends *
+extends *
*
+type
name name
+contains
+contains
name
FunctionType
RecordType
PointerType
*
name
position
+type
+method
+contains
+contains
+method
+return value
Atributes
Atributes
-
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
Pgina 49 de 75
+contains
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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).
Type
+atribute
+contains
name
ClassType
+extends *
*
name
+contains
+method FunctionType
+return value
position
+contains
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 50 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Type
+atribute
Atributes
-
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
+contains
name
ClassType
+extends *
*
Figura 4-30. 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).
+implements
ClassType
*
InterfaeType
+extends *
*
+extends *
*
4.3.4
Pgina 51 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
TypeTable
SymbolTable
+
+
+
+
+ insert() : void
+ search() : Type
name
insert() : void
search() : Symbol
set() : void
reset() : void
name
type
Type
+field
Atributes
-
+atribute
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
+implements
+has
BuiltInType
ArrayType
ClassType
+extends *
Symbol
-
InterfaeType
name: string
address: string
*
name name
+type
+ getType() : Type
+ getName() : string
+ getAddress() : string
name
+contains +contains
+contains
FunctionType
RecordType
PointerType
+extends *
*
position
name
+method
+method
+type
+contains
+return value
+contains
LocalVar
Property
Parameter
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
Field
Atribute
+ getType() : Type
+ getName() : string
+ getAddress() : string
+ getType() : Type
+ getName() : string
+ getAddress() : string
Atributes
-
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
Figura 4-32. Es quema general de una tabla de smbolos con las dos jerarquas diferenciadas. (Ver
Anexo 1)
4.3.5
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
como funciona su tabla de smbolos.
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Pgina 52 de 75
TABLAS DE SMBOLOS
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
PROCESADORES DE LENGUAJE
ts.procesa(g);
}
SymbolTable
+
+
+
+
insert() : void
search() : Symbol
set() : void
reset() : void
name
name
type
Type
+atribute
+has
IntType
Symbol
-
DoubleType
VoidType
FunctionType
ClassType
+extends *
name: string
address: string
*
name name
+ getType() : Type
+ getName() : string
+ getAddress() : string
position
+contains
+contains
+method
+return value
+contains
AtributeData
-
access: int
static: boolean
FunctionData
-
+ getAccess() : int
+ getStatic() : boolean
access: int
static: boolean
+ getAccess() : int
+ getStatic() : boolean
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.
Pgina 53 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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
4-33.
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 4-34.
mySymbolTable : SymbolTable
12
myTypeTable : TypeTable
11
10
9
: IntType
8
7
6
: DoubleType
5
4
3
: VoidType
2
1
0
Pila de Bloques
Pila de Smbolos
TABLA DE SMBOLOS
TABLA DE TIPOS
Pgina 54 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
mySymbolTable : SymbolTable
myTypeTable : TypeTable
12
11
: IntType
10
9
8
: DoubleType
-Nombre = k
7
: FunctionType
Name = procesa
5
4
-Nombre = procesa(I)I
: ClassType
: FunctionData
Access = public
Static = false
Name = TabSimb
: FunctionType
: FunctionData
Name = main
Access = public
Static = true
Pila de Smbolos
Pila de Bloques
: VoidType
TABLA DE SMBOLOS
TABLA DE TIPOS
myTypeTable : TypeTable
12
: IntType
11
10
9
: DoubleType
8
7
6
: VoidType
5
4
0
Pila de Bloques
: ClassType
Name = TabSimb
: Symbol
: AtributeData
Name = r
Address = TSdos.r
Access = private
Static = true
Pila de Smbolos
Nombre = r
TSdos : ClassType
Name = TSdos
TABLA DE SMBOLOS
TABLA DE TIPOS
Pgina 55 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 11 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 4-37 se puede ver la situacin de la tabla de smbolos despus de
compilada la lnea 11.
En la lnea 13 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 14 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.
mySymbolTable : SymbolTable
myTypeTable : TypeTable
: IntType
12
11
10
9
8
7
6
5
4
3
2
2
0
Pila de Bloques
: Symbol
: AtributeData
Access = private
Static = true
Name = ts
Address = Param + 0
: VoidType
Nombre = r
: ClassType
: Symbol
Name = TSdos
Name = m
Address = m([TabSimb;I)V
: Symbol
Name = r
Address = TSdos.r
Pila de Smbolos
: DoubleType
: Symbol
Name = g
Address = Param + 1
Nombre = m([TabSimb;I)V
: ClassType
Name = TabSimb
: FunctionData
Nombre = ts
Access = public
Static = true
: FunctionType
Name = m
TABLA DE SMBOLOS
Nombre = g
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
para hacer ms legible
el diagrama
Pgina 56 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
myTypeTable : TypeTable
mySymbolTable : SymbolTable
: IntType
12
: DoubleType
11
: AtributeData
10
Access = private
Static = true
: VoidType
8
7
Nombre = r
: ClassType
Name = TSdos
Nombre = m([TabSimb;I)V
: ClassType
3
2
2
0
Name = TabSimb
: FunctionData
Nombre = ts
Access = public
Static = true
: FunctionType
Pila de Bloques
Name = m
Pila de Smbolos
TABLA DE SMBOLOS
Nombre = g
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
para hacer ms legible
el diagrama
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.
myTypeTable : TypeTable
mySymbolTable : SymbolTable
: IntType
: FunctionData
12
Access = public
Static = false
11
-Nombre = k
10
9
: FunctionType
8
: Symbol
Name = p
Address = TabSimb.p
4
3
2
1
Pila de Bloques
Name = procesa
Pila de Smbolos
: DoubleType
: VoidType
-Nombre = procesa(I)I
Name = TabSimb
: Symbol
Name = main
Address = main()V
-Nombre = p
: ClassType
: FunctionType
: ClassType
Name = main
: AtributeData
Access = private
Static = false
Name = TSdos
: Symbol
: FunctionData
Name = proces
Address = procesa(I)I
Access = public
Static = true
: FunctionType
Name = m
TABLA DE SMBOLOS
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
y las relaciones del mtodo
m para hacer ms legible
el diagrama
Esto produce una nueva llama 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).
En la lnea 19 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
Pgina 57 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
myTypeTable : TypeTable
: Symbol
mySymbolTable : SymbolTable
Name = d
Address = VarLoc + 1
: IntType
: Symbol
11
10
: Symbol
Name = k
Address = Param + 0
Name = p
Address = TabSimb.p
5
4
: FunctionType
: VoidType
-Nombre = procesa(I)I
Name = main
Address = main()V
2
1
0
: AtributeData
Name = TabSimb
Access = private
Static = false
: FunctionType
: ClassType
Name = main
Name = TSdos
: Symbol
Pila de Smbolos
-Nombre = p
: ClassType
: Symbol
: DoubleType
: Symbol
Pila de Bloques
Access = public
Static = false
-Nombre = k
Name = procesa
: FunctionData
Name = m
Address = VarLoc + 0
12
Name = procesa
Address = provesa(I)I
: FunctionData
Access = public
Static = true
TABLA DE SMBOLOS
: FunctionType
Name = m
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
y las relaciones del mtodo
m para hacer ms legible
el diagrama
Pgina 58 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
myTypeTable : TypeTable
mySymbolTable : SymbolTable
: IntType
: FunctionData
12
Access = public
Static = false
11
10
: Symbol
Name = t
Address = VarLoc + 0
: VoidType
: Symbol
Name = p
Address = TabSimb.p
5
4
-Nombre = procesa(I)I
Name = main
Address = main()V
2
1
0
: AtributeData
Name = TabSimb
: FunctionType
: ClassType
Name = main
Access = private
Static = false
Name = TSdos
: Symbol
Pila de Smbolos
-Nombre = p
: ClassType
: Symbol
Pila de Bloques
: DoubleType
: FunctionType
Name = procesa
3
0
-Nombre = k
: FunctionData
Name = procesa
Address = procesa(I)I
Access = public
Static = true
: FunctionType
Name = m
TABLA DE SMBOLOS
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
y las relaciones del mtodo
m para hacer ms legible
el diagrama
4.4.1
Pgina 59 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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:
4:
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))
quedara:
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
Pgina 60 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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).
Pgina 61 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 62 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Figura 4-46. Estructura AST-TS resultante una vez terminada la visita de identificacin
Pgina 63 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-47.
Figura 4-47. Estructura simplificada AST-TS si se elimina el objeto Symbol y se introduce toda la
informacin en el nodo Declaracion del rbol AST
Una vez visitado el rbol completo, se puede ver en la Figura 4-48 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 64 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Figura 4-48. 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.
2. Declarar un smbolo con el tipo de usuario definido.
Pgina 65 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Figura 4-49. Agregacin prevista entre los nodos del rbol AST. Vase la derivacin que Struct
hace de Type.
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.
Observando este rbol se puede ver que toda la estructura del nuevo tipo (Struct) est
representada en el propio rbol como nodos AST.
Pgina 66 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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 4-51.
Comprese esta figura con la Figura 4-47 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 67 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Figura 4-51. Referencias de declaracin y tipo en el rbol AST para el tipo Struct
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 68 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
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.
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 69 de 75
Pgina 70 de 75
+
+
+
+
+
+
Field
+
+
+
+
+
+
+
+
+
type
+type
+extends *
name
getAccess() : int
getStatic() : boolean
+
+
Atributes
access: int
static: boolean
+return value
+contains
name
RecordType
+contains
position
FunctionType
+method
+method
+extends *
+field
InterfaeType
Type
insert() : void
search() : Type
name
+contains +contains
name name
+
+
TypeTable
+implements
+atribute
ClassType
+contains
ArrayType
getType() : Type
getName() : string
getAddress() : string
Parameter
BuiltInType
getType() : Type
getName() : string
getAddress() : string
Atribute
getType() : Type
getName() : string
getAddress() : string
Property
getType() : Type
getName() : string
getAddress() : string
getType() : Type
getName() : string
getAddress() : string
LocalVar
getType() : Type
getName() : string
getAddress() : string
getAccess() : int
getStatic() : boolean
+
+
+
+
+
access: int
static: boolean
Atributes
name: string
address: string
Symbol
+has
name
insert() : void
search() : Symbol
set() : void
reset() : void
+
+
+
+
SymbolTable
+type
PointerType
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 71 de 75
+has
name: string
address: string
getType() : Type
getName() : string
getAddress() : string
+
+
+
Symbol
name
insert() : void
search() : Symbol
set() : void
reset() : void
+
+
+
+
SymbolTable
access: int
static: boolean
getAccess() : int
getStatic() : boolean
+
+
AtributeData
DoubleType
IntType
type
Type
name
+
+
+return value
+contains
position
FunctionType
getAccess() : int
getStatic() : boolean
access: int
static: boolean
FunctionData
+method
+contains
name name
+extends *
insert() : void
search() : Type
ClassType
+contains
VoidType
+atribute
+
+
TypeTable
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 72 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
Pgina 73 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
9 Bibliografa y Referencias
AHO86
AVL62
BUCH63
CUEV91
CUEV95c
CUEV95d
CUEV03
J.M. Cueva, R. Izquierdo, A.A. Juan, M.C. Luengo, F. Ortn, J.E. Labra.
Lenguajes, Gramticas y Autmatas en Procesadores de Lenguaje.
Servitec. 2003.
HIBB62
HOLUB90
HOPCR02
LOUDE97
LUM71
KNUTH73
Pgina 74 de 75
TABLAS DE SMBOLOS
PROCESADORES DE LENGUAJE
ORTIN04
F. Ortn, J.M. Cueva, J.E. Labra, A.A. Juan, M.C. Luengo, R. Izquierdo.
Anlisis Semntico en Procesadores de Lenguajes. Servitec. 2004.
ISBN: 84-688-6208-8
SEVE74
Pgina 75 de 75