Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
de
Smbolos
de
Procesadores
de
Lenguaje
Cuaderno N 41
Autores:
Aquilino Adolfo Juan Fuente
Juan Manuel Cueva Lovelle
Francisco Ortn Soler
Ral Izquierdo Castanedo
M Cndida Luengo Dez
Jose Emilio Labra Gayo
Editorial:
SERVITEC
ISBN: 84-688-7631-3
INDICE DE MATERIAS
1 Introduccin.............................................................................................................. 4
1.1 Necesidad de las Tablas de smbolos ............................................................... 4
1.2 Objetivos de la Tabla de Smbolos (TS)........................................................... 4
1.3 Compiladores de una y de varias pasadas ........................................................ 5
1.3.1 Compiladores de varias pasadas ............................................................... 5
1.3.2 Compiladores de una pasada .................................................................... 8
2 Contenidos de la TS.................................................................................................. 9
2.1 Nombre del identificador................................................................................ 10
2.2 Atributos de los identificadores...................................................................... 11
2.2.1 Direccin en memoria (offset)................................................................ 11
2.2.2 Tipo......................................................................................................... 12
2.2.3 Nmero de dimensiones, de miembros o de parmetros ........................ 12
2.2.4 Valor mximo de las dimensiones o rangos de arrays............................ 12
2.2.5 Tipo y forma de acceso de los miembros de estructuras, registros,
uniones y clases ...................................................................................................... 13
2.2.6 Tipo de los parmetros de las funciones, funciones libres, procedimientos
o mtodos de las clases........................................................................................... 14
2.2.7 Descriptor de ficheros............................................................................. 14
2.2.8 Otros atributos ........................................................................................ 14
3 Operaciones con la TS............................................................................................ 15
3.1 TS y Declaracin explcita vs implcita.......................................................... 15
3.1.1 Lenguajes con declaraciones explcitas obligatorias .............................. 15
3.1.2 Lenguajes con declaraciones implcitas de los identificadores .............. 15
3.2 Operaciones con lenguajes estructurados en bloques..................................... 16
3.2.1 Operaciones de activacin y desactivacin de tablas de smbolos......... 16
4 Organizacin de la TS ............................................................................................ 17
4.1 Lenguajes no estructurados en bloques .......................................................... 18
4.1.1 TS no ordenadas ..................................................................................... 18
4.1.2 TS ordenadas .......................................................................................... 20
4.1.3 TS con estructura en rbol (AVL) .......................................................... 21
1.1.1.1. rboles AVL ...................................................................................... 25
4.1.4 TS con estructura de tablas hash............................................................. 27
4.1.4.1 Conceptos bsicos .............................................................................. 27
4.1.4.2 Mtodos de organizacin de las tablas hash....................................... 29
4.1.4.3 Manejo de colisiones .......................................................................... 30
Pgina 2 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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 PROCESADORES DE LENGUAJE
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).
Pgina 9 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
1
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
Sobre la organizacin de la memoria en tiempo de ejecucin consultar el captulo de Gestin de
Memoria.
Pgina 11 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
2.2.2 Tipo
El atributo tipo se almacena en la TS cuando los lenguajes a compilar tienen distintos
tipos de datos definidos explcita o implcitamente.
Por supuesto, los lenguajes sin tipos no tienen este atributo. Un ejemplo de tipos
definidos implcitamente se da en el lenguaje FORTRAN, pues si no se asignan o se
declaran previamente, todas las variables cuyo nombre comienza con I, J, K, L M son
variables enteras. Todas las dems son reales.
El tipo de la variable se utiliza en las comprobaciones semnticas de las sentencias. El
tipo tambin se usa como indicacin de la cantidad de memoria que debe ser reservada
en tiempo de ejecucin. Por ejemplo, si el tipo es integer, suele ocupar la mitad de un
float. Generalmente, el tipo de una variable se almacena en forma de cdigo, as el tipo
de float se puede codificar como F, integer como I, carcter como C, etc.
El tamao de los tipos de datos depender de cada implementacin del lenguaje, aunque
el constructor del compilador suele aprovechar al mximo las caractersticas de mximo
rendimiento de la mquina objeto.
Pgina 12 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
3
Esto permitir implementar el polimorfismo por herencia.
Pgina 13 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Figura 2-3. Tabla de Smbolos con referencias cruzadas como atributo de los smbolos.
La Figura 2-3 nos muestra una lista de referencias cruzadas.
Se pueden tener problemas cuando se representan todas las referencias a una variable,
pues el nmero de lneas en que aparece puede ser grande y ocupar mucho espacio en la
tabla. Generalmente se utiliza una lista.
Pgina 14 de 75
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.
Pgina 15 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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).
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
El mtodo ms simple de organizar una TS es colocar los registros en la tabla segn el
orden en que las variables se declaran. En el caso de que los identificadores estn
declarados implcitamente, los atributos se colocan segn el orden en que las variables
aparecen en el texto fuente.
Se examinan ahora las operaciones de insercin y bsqueda en los lenguajes con
declaraciones explcitas.
En una operacin de insercin no se necesitan comparaciones (a excepcin de la
comprobacin de que la tabla no est llena), ya que los atributos de cada nuevo
identificador se aaden en la tabla a continuacin del identificador ledo anteriormente.
Este procedimiento es un poco idealista, pues ignora el problema de la duplicacin del
nombre de las variables en las declaraciones.
Para detectar este tipo de error se deber investigar toda la tabla antes de realizar
operaciones de insercin. Esta comprobacin siempre tiene una LMI que se calcular
posteriormente en este mismo apartado. En cualquier caso, se debe tener en cuenta que
al no estar ordenados los smbolos es necesario en cada caso investigar la tabla completa
para garantizar la no existencia del smbolo, diferente de cuando el objetivo es
encontrarlo en la tabla.
La LMI requerida para la operacin de bsqueda en una TS no ordenados es:
n
i (n + 1) n n + 1
LMI = =
i =1
=
n 2n 2
siendo n el nmero de registros de la TS.
La deduccin de esta frmula es sencilla, pues para acceder al primer registro hemos de
hacer una comparacin, para acceder al segundo dos, , al ensimo n. Entonces el
nmero de comparaciones es:
Pgina 18 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
n
(n + 1) n
i =
i =1 2
Dado que se ha definido la LMI como el nmero de comparaciones partido por el
nmero de registros, queda demostrada la primera expresin.
La Figura 4-1 representa la LMI frente al nmero de registros de la TS.
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 PROCESADORES DE LENGUAJE
4.1.2 TS ordenadas
En este apartado y en los siguientes se describirn organizaciones de la TS que se basan
en el nombre del identificador.
En tales circunstancias, la operacin de insercin debe ser acompaada de un
procedimiento de bsqueda que determina en qu lugar de la TS debe ser colocado el
identificador.
La insercin en un momento dado de un nuevo registro puede obligar a que parte de los
registros ya insertados en al TS se tenga que desplazar para lograr la insercin.
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:
(log 2 n )+1
1
( (log n )
) 1
1 1 + 2 2 + 4 3 + ... + 2 2 ((log 2 n ) + 1) = (2 i 1
i )
n n i =1
Pgina 21 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Pgina 22 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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.
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.
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.
Pgina 26 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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 0 1 9 A B Z # + -
Cdigo 1 2 10 11 12 36 37 38 39
65 68 35 ASCII en decimal
C1 C4 7B EBCDIC en hexadecimal
etc.
Ntese que se pueden tener problemas con la longitud de los nmeros generados por los
nombres de los identificadores. De hecho se describirn algunas funciones hash que
efectan varios tipos de transformaciones para reducir el tamao del nmero generado.
En general se utilizan dos funciones hash, una para preacondicionar el nombre del
identificador transformndolo en un nmero y la segunda para transformar el nmero en
una direccin que seala su localizacin en la TS.
A continuacin se estudiarn varias funciones hash que se pueden aplicar para el
manejo de TS. A partir de ahora se utilizar el trmino clave para identificar la
representacin numrica preacondicionada del nombre de un identificador.
Pgina 28 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Pgina 29 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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:
NODE 1
STORAGE 2
AN 3
ADD 3
FUNCTION 9
B 9
BRAND 9
PARAMETER 9
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
2
En la siguiente tabla se representan los valores de las dos frmulas:
Pgina 32 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Pgina 33 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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.
Pgina 35 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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 PROCESADORES DE LENGUAJE
4.1.5 Conclusiones
Si se va a compilar programas con menos de 10 variables, se pueden usar tablas de
smbolos no ordenadas. Si el nmero de variables no supera a 25 se pueden usar tablas
de smbolos ordenadas, utilizando el algoritmo de bsqueda binaria.
Las tablas de smbolos con estructura de rbol se pueden utilizar en ciertos lenguajes
con unas caractersticas muy determinadas (por ejemplo BASIC y FORTRAN tienen
limitados los nombres de los identificadores a unos pocos caracteres).
El mejor mtodo cuando no se tienen problemas de memoria reducida es el
direccionamiento hash abierto, su problema principal es la asignacin de memoria a
priori para la tabla de smbolos. Esto se palia en parte utilizando en el compilador algn
parmetro que nos d una idea a priori del tamao de la tabla de smbolos (por ejemplo
el nmero de lneas del programa). Otro mtodo igualmente vlido son los rboles
AVL.
Como conclusin prctica, el mtodo hash abierto con arrays de punteros a registros es
el que ofrece las mejores prestaciones, teniendo en cuenta su fcil y cmoda
implementacin. El nico inconveniente est en tener que fijar a priori el tamao
mximo del array de punteros a registros. Sin embargo el uso de listas dinmicas puede
garantizarnos, si hay suficiente memoria, que no se colapsar el compilador si se
alcanzan valores prximos al tamao mximo del array.
Es muy importante elegir bien una funcin de preacondicionamiento para reducir las
colisiones. La funcin hash ms utilizada y de ms fcil comprensin es la funcin
mdulo, que adems asegura una distribucin uniforme a travs del array de punteros
(para mejorar an ms este comportamiento se suele elegir un tamao del array que sea
nmero primo).
En los modernos lenguajes de compilacin se poseen estructuras de contenedores con
mejoras significativas de este comportamiento, es el caso de las tablas hash
implementadas por hashtable de Java o map de C++. En estos casos, m es un valor
dinmico que se va cambiando a medida que la tabla se llena, de manera que las
colisiones se reducen o se eliminan completamente.
Pgina 37 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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
Set 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.
4
Realmente no es necesario borrarlos, simplemente es necesario desafilarlos y dejar nuevo espacio
disponible para apilar nuevos smbolos.
Pgina 39 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Pgina 40 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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
Este tipo de organizacin de la tabla de smbolos se utiliza cuando la memoria de que se
dispone para realizarla es pequea.
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
La Figura 4-20 muestra la tabla de smbolos en el instante anterior a que se complete el
anlisis del bloque 2. Otra vez los nuevos registros de las nuevas variables se colocan en
la cima de la pila y el campo de ndices de bloques (BLOCK INDEX) seala el
registro donde comienzan los bloques actualmente activos.
En este ejemplo se puede observar que ocurre cuando se duplica el nombre de una
variable en bloques diferentes. Es el caso de la variable X cuando sta aparece en el
bloque 2. El registro del identificador M1 se encadena al registro de la variable X
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
Pgina 46 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Pgina 47 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
SymbolTable
+ insert() : void
+ search() : Symbol
+ set() : void
+ reset() : void
name
Symbol
- name: string
Type
- address: string
+has type
+ getType() : Type
+ getName() : string
+ getAddress() : string
Parameter Property
SymbolTable
+ insert() : void
+ search() : Symbol
+ set() : void
+ reset() : void
name
GenericSymbol
- name: string Type
+has type
- address: string
+ getName() : string
+ getType() : Type
+ getAddress() : string
Pgina 48 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
+field
+atribute
+implements
*
* *
+type name name name position name +type
+contains +contains +contains +method
+contains
+method
+return value
+contains
Atributes Atributes
Pgina 49 de 75
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
Pgina 50 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
Type
+atribute
Atributes
- access: int
- static: boolean
+contains
+ getAccess() : int
+ getStatic() : boolean 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 *
* *
Figura 4-31. Herencia
La herencia se implementa mediante interfaces y clases de manera que las interfaces
pueden heredar entre ellas y las clases pueden heredar de otras clases o implementar
interfaces. Obsrvese, adems, que la cardinalidad de las relaciones permitira
implementar herencia mltiple (Ver Figura 4-31).
Pgina 51 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
TypeTable
SymbolTable
+ insert() : void
+ insert() : void + search() : Type
+ search() : Symbol
name
+ set() : void
+ reset() : void
name
type
Type
Atributes +field
+ getAccess() : int
+ getStatic() : boolean +implements
*
+has
BuiltInType ArrayType ClassType InterfaeType FunctionType RecordType PointerType
Symbol +extends * +extends *
- name: string
- address: string * *
+type name name name position name +type
+ getType() : Type +contains +contains +contains +method
+ getName() : string +contains
+method
+ getAddress() : string
+return value
+contains
Atributes
LocalVar Property Parameter
- access: int
+ getType() : Type + getType() : Type + getType() : Type - static: boolean
+ getName() : string + getName() : string + getName() : string
+ getAddress() : string + getAddress() : string + getAddress() : string + getAccess() : int
+ getStatic() : boolean
Field Atribute
Figura 4-32. Es quema general de una tabla de smbolos con las dos jerarquas diferenciadas. (Ver
Anexo 1)
Las dos relaciones de agregacin: SymbolTable a Symbol y TypeTable a Type, se pueden
definir tambin como cualificadas a travs de una string que sera el nombre del
identificador en el contendor correspondiente. No se ha puesto as por claridad del
grfico.
Pgina 52 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
13: ts.procesa(g);
14: }
15: }
16:
17: public class TabSimb
18: {
19: double p;
20:
21: public int procesa (int k)
22: {
23: int m;
24: double d = k * m;
25: p = 2 * d;
26: return d;
27: }
28:
29: public static void main ()
30: {
31: TabSimb t = new TabSimb();
32: TSdos.m(ts,7);
33: }
34: }
El esquema que se necesita de tabla de smbolos est simplificado con respecto al
general que se ha visto anteriormente.
TypeTable
+ insert() : void
SymbolTable
+ search() : Type
+ insert() : void
name
+ search() : Symbol
+ set() : void
+ reset() : void
name type
Type
+atribute
+has
+contains
AtributeData FunctionData
- access: int - access: int
- static: boolean - static: boolean
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
Pgina 54 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
mySymbolTable : SymbolTable
myTypeTable : TypeTable
12
11 : IntType
10
9
8 -Nombre = k : DoubleType
7
: FunctionType
6
Name = procesa : VoidType
5
4
-Nombre = procesa(I)I
3
: ClassType
2 : FunctionData
Name = TabSimb
1 Access = public
Static = false : FunctionType
0 : FunctionData
Name = main
Pila de Bloques Pila de Smbolos Access = public
Static = true
TABLA DE SMBOLOS
TABLA DE TIPOS
12 : IntType
11
10
9 : DoubleType
8
7
6 : VoidType
5
4
3 : ClassType
2 Name = TabSimb
1 : Symbol : AtributeData Nombre = r
0 0 Name = r Access = private TSdos : ClassType
Address = TSdos.r Static = true
Pila de Bloques Pila de Smbolos 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
: Symbol : DoubleType
9 Name = g : AtributeData
8 Address = Param + 1
Access = private
7 Static = true : VoidType
: Symbol
6 Name = ts
Address = Param + 0 Nombre = r
5
: ClassType
4
: Symbol Name = TSdos
3 Name = m
Nombre = m([TabSimb;I)V
2 Address = m([TabSimb;I)V
: ClassType
2 1 : Symbol Name = TabSimb
0 0 Name = r : FunctionData Nombre = ts
Address = TSdos.r Access = public
Pila de Bloques Pila de Smbolos : FunctionType
Static = true
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
9 Static = true : VoidType
8
7 Nombre = r
6 : ClassType
5 Name = TSdos
4 Nombre = m([TabSimb;I)V
: ClassType
3
: FunctionData Name = TabSimb
2
Access = public Nombre = ts
2 1 Static = true : FunctionType
0 0 Name = m
Pila de Bloques Pila de Smbolos
TABLA DE TIPOS
Se han suprimido todos
los mtodos de esta clase
para hacer ms legible
el diagrama
myTypeTable : TypeTable
mySymbolTable : SymbolTable
: IntType
: FunctionData
12
Access = public
11 Static = false
-Nombre = k : DoubleType
10
9
: FunctionType
8 Name = procesa : VoidType
7 : Symbol
6 Name = p -Nombre = procesa(I)I -Nombre = p
5 Address = TabSimb.p : ClassType
4 Name = TabSimb : AtributeData
: Symbol
3 : FunctionType Access = private
Name = main
Static = false
2 Address = main()V Name = main : ClassType
1 Name = TSdos
: Symbol
0 0 Name = proces : FunctionData
: FunctionType
Pila de Bloques Pila de Smbolos Address = procesa(I)I Access = public
Static = true 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
Pgina 57 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
myTypeTable : TypeTable
: Symbol
mySymbolTable : SymbolTable Name = d
Address = VarLoc + 1
: Symbol : IntType
12 Name = m : FunctionData
Address = VarLoc + 0 Access = public
11
Static = false : DoubleType
10 : Symbol -Nombre = k
9 Name = k
Address = Param + 0 : FunctionType
8 Name = procesa : VoidType
7 : Symbol
6 Name = p -Nombre = procesa(I)I -Nombre = p
5 Address = TabSimb.p : ClassType
4 Name = TabSimb : AtributeData
: Symbol
3 : FunctionType Access = private
Name = main
Static = false
2 Address = main()V Name = main : ClassType
3 1 Name = TSdos
: Symbol
0 0 Name = procesa : FunctionData
: FunctionType
Pila de Bloques Pila de Smbolos Address = provesa(I)I Access = public
Name = m
Static = true
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
Pgina 58 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
myTypeTable : TypeTable
mySymbolTable : SymbolTable
: IntType
: FunctionData
12
Access = public
11 Static = false
-Nombre = k : DoubleType
10 : Symbol
9 Name = t
Address = VarLoc + 0 : FunctionType
8 Name = procesa : VoidType
7 : Symbol
6 Name = p -Nombre = procesa(I)I -Nombre = p
5 Address = TabSimb.p : ClassType
4 Name = TabSimb : AtributeData
: Symbol
3 : FunctionType Access = private
Name = main
Static = false
2 Address = main()V Name = main : ClassType
3 1 Name = TSdos
: Symbol
0 0 Name = procesa : FunctionData
Access = public : FunctionType
Pila de Bloques Pila de Smbolos Address = procesa(I)I
Static = true 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
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: int i;
2: float f;
3: main ()
4: {
5: int f;
6: read f;
7: i = f;
8: write I + 2;
9: }
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:
Pgina 60 de 75
TABLAS DE SMBOLOS PROCESADORES DE LENGUAJE
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
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.
Sea el siguiente cdigo:
1: struct Concepto {
2: int cantidad;
3: String descrip;
4: float precio;
5: };
6:
7: main() {
8: int i;
9: i = 2;
10: Concepto con;
11: con.cantidad = 1;
12: con.descrip = "telfono";
13: con.precio =240.00;
14: int a [5];
15: a[i]=7;
16: }
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
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
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.
Pgina 69 de 75
TypeTable
SymbolTable
+ insert() : void
+ insert() : void + search() : Type
+ search() : Symbol
name
+ set() : void
+ reset() : void
TABLAS DE SMBOLOS
name
type
Type
Atributes +field
+ getAccess() : int
+ getStatic() : boolean +implements
*
+has
BuiltInType ArrayType ClassType InterfaeType FunctionType RecordType PointerType
Symbol +extends * +extends *
- name: string
- address: string * *
+type name name name position name +type
+ getType() : Type +contains +contains +contains +method +contains
Pgina 70 de 75
+ getName() : string
+method
+ getAddress() : string
+return value
+contains
5 Anexo 1. Diagrama General de Clases
Atributes
LocalVar Property Parameter
- access: int
+ getType() : Type + getType() : Type + getType() : Type - static: boolean
+ getName() : string + getName() : string + getName() : string
+ getAddress() : string + getAddress() : string + getAddress() : string + getAccess() : int
+ getStatic() : boolean
Field Atribute
+ insert() : void
SymbolTable
+ search() : Type
+ insert() : void
name
+ search() : Symbol
ejemplo
+ set() : void
TABLAS DE SMBOLOS
+ reset() : void
name type
Type
+atribute
+has
Pgina 71 de 75
+extends *
- name: string
- address: string *
name name position
+ getType() : Type
+ getName() : string +contains +contains
+ getAddress() : string +method
+return value
+contains
AtributeData FunctionData
- access: int - access: int
6 Anexo 2. Tabla de smbolos simplificada para el
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 A. Aho, R. SEIT y J. D. Ullman. Compiladores: principios, tcnicas y
herramientas. Addison-Wesley Interamericana (1990).
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.
KNUTH73 Knuth, D.: The Art of Computer Programming, Vol. 3, Sorting and
Searching, Addison Wesley, Reading, Mass. (1973).
Knuth D. El arte de programar ordenadores, Volumen III: Clasificacin
y bsqueda. Ed. Revert, 1987.
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
Pgina 75 de 75