Tabla de tipos y símbolosProf. Diego Mosquera
@diegomosuz
Introducción
• En lenguajes tipeados existen dos clases de tipos:
• Los tipos primitivos.
• Los tipos definidos por el programador.
• Normalmente, las variables y subprogramas de un lenguaje de programación con tipos, se declaran usando tipos.
• A las variables y subprogramas se les denomina símbolos.
Introducción
• La tabla de símbolos es una estructura compleja que, normalmente, incluye información acerca de:
• Los tipos del lenguaje.
• Los símbolos.
• Existen implementaciones de la tabla de símbolos que:
• Utilizan dos tablas diferentes: tipos y símbolos.
• Utilizan una única tabla de símbolos (que incluye la información de tipos).
• Cuando un lenguaje admite ámbitos se suelen implementar pilas de tablas.
Introducción
Tabla de tipos
• Es necesaria para satisfacer el proceso de análisis semántico que hace un compilador.
• La tarea básica de un analizador semántico es la comprobación de tipos en variables, funciones y parámetros.
• Debe ser lo suficientemente dinámica para:
• Inicializarse con los tipos primitivos del lenguaje.
• Agregar los tipos definidos por el programador (normalmente a partir de tipos primitivos).
• Se deben utilizar estructuras eficientes porque:
• Normalmente el acceso a la tabla de tipos es muy recurrente.
Tabla de tipos
• Si el lenguaje admite ámbitos de ejecución, utilizar alguna estrategia para manejar la tabla en esos ámbitos:
• Una única tabla con información de ámbito.
• Una pila de tablas.
• RECUERDE: Cuando hay ámbitos anidados, desde dentro de un ámbito se puede acceder sólo a su ámbito superior.
• Cuando se utiliza una tabla por cada ámbito, éstas deben destruirse una vez el programa sale del ámbito.
• Si el lenguaje permite redefinir tipos (o símbolos) con el mismo nombre dentro de diferentes ámbitos, el análisis del compilador debe hacerse partiendo del ámbito más interno.
Tabla de tipos
• Para implementar la tabla de tipos (o símbolos) suelen utilizarse tablas hash:
• Tienen el tiempo de acceso más reducido.
• Los campos mínimos necesarios para la tabla de tipos son:
• Nombre: identificador del tipo (Ej. En Java podría ser int).
• TipoBase: cuando hay tipos compuestos (Ej. String[] tipo, el tipo base es String).
• Padre: es el tipo para el caso de registros (o estructuras).
• Dimensión: número de elementos de un tipo básico que están contenidos en un tipo compuesto. Por ejemplo, para un tipo int la dimensión es 1, pero para un tipo int[5], la dimensión es de 5.
Tabla de tipos
• Los campos mínimos necesarios para la tabla de tipos son (cont…):
• Mínimo: Para la definición de vectores (a veces definida por el programador, Ej. Pascal).
• Máximo: Para la definición de vectores (a veces definida por el programador, Ej. Pascal).
• Ámbito: Si se utiliza una única tabla, el ámbito es un número entero que, normalmente, comienza en 0.
• Es habitual la inclusión de un código (ID) de tipo.
• IMPORTANTE: Para saber si un tipo ya está incluido en una tabla de tipos, se debe tomar en cuenta si el lenguaje es sensible a las mayúsculas.
Tabla de tipos
• Ejemplo: Implementación de una tabla de tipos de un lenguaje sensible a las mayúsculas cuyos tipos primitivos son int y boolean.
• Ver la clase Tipo, que implementa el código relacionado con un tipo particular del lenguaje.
• Ver la clase TablaDeTipos, que implementa la tabla y su estrategia de gestión.
Tabla de tipos
• Ejemplo de utilización:
• Supongamos un subconjunto del lenguaje Pascal que permite, además de los tipos primitivos integer y boolean, la definición de tipos vector y registro.
• Supongamos que tenemos el siguiente código:
Tabla de tipos
• Ejemplo de utilización:
• Supongamos que este lenguaje es sensible a las mayúsculas (aunque Pascal no lo sea).
• Veamos el procesamiento del programa y la gestión de la tabla de tipos:
Tabla de tipos
• Inicialización de la tabla:
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
Tabla de tipos
• Procesamiento de las líneas 1 y 2 (en secuencia):
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
Tabla de tipos
• Procesamiento de la línea 3:
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 -1 -1 -1 0
Tabla de tipos
• Procesamiento de las líneas 4 y 5 (en secuencia):
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
Tabla de tipos
• Procesamiento de las líneas 6, 7 y 8 (en secuencia):
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
6 vector 1 -1 9 0 8 1
Tabla de tipos
• Procesamiento de la línea 9:
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
6 vector 1 -1 9 0 8 1
7 r1 -1 -1 -1 -1 -1 1
Tabla de tipos
• Procesamiento de las líneas 10 y 11 (en secuencia):
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
6 vector 1 -1 9 0 8 1
7 r1 -1 -1 2 -1 -1 1
8 y 0 7 1 -1 -1 1
9 z 0 7 1 -1 -1 1
Tabla de tipos
• Procesamiento de las líneas 12 y 13 (en secuencia):
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
6 vector 1 -1 9 0 8 1
7 r1 -1 -1 2 -1 -1 1
8 y 0 7 1 -1 -1 1
9 z 0 7 1 -1 -1 1
Tabla de tipos
• Procesamiento de la línea 14:
Código Nombre TipoBase Padre Dimensión Mínimo Máximo Ámbito
0 integer -1 -1 1 -1 -1 0
1 boolean -1 -1 1 -1 -1 0
2 vector 0 -1 10 0 9 0
3 registro -1 -1 2 -1 -1 0
4 x 0 3 1 -1 -1 0
5 y 1 3 1 -1 -1 0
Tabla de tipos
• Procesamiento de las líneas 15 y 16:
• Resultado: No existe la tabla de tipos (se puede eliminar).
Dimensión y acceso a los elementos de los tipos
• Cálculo de la dimensión:
• En los tipos básicos no hay problema (se conoce de antemano).
• En los tipos estructurados depende de la dimensión de cada uno de sus componentes.
• Cuando hay varios grados de anidamientos los cálculos se realizan de manera recursiva.
• Acceso a los elementos de un tipo estructurado:
• El acceso de los elementos depende de la dimensión de los tipos.
Dimensión y acceso a los elementos de los tipos
• Ejemplo: Suponga el siguiente código:
type vector = array[0..10] of boolean;
type registro1 = record
x : integer;
y : vector;
s : boolean;
end;
type registro2 = record
z : boolean;
k : registro1;
end;
Dimensión y acceso a los elementos de los tipos
• Del ejemplo anterior, calcule:
1. La dimensión de vector
2. La dimensión de registro1 y registro2
3. La posición del elemento 6 del tipo vector
4. La posición de registro1.y[6]
5. La posición de registro1.s
6. La posición de registro2.k.y[6]
Top Related