Creación de Tabla de Símbolos

22
Creación de Tablas de Símbolos Programación de Sistemas 3.4

Transcript of Creación de Tabla de Símbolos

Page 1: Creación de Tabla de Símbolos

Creación de Tablas de Símbolos

Programación de Sistemas

3.4

Page 2: Creación de Tabla de Símbolos

Tabla de Símbolos

También se la llama tabla de nombres o tabla de identificadores.

Es una estructura de datos que usa el proceso de traducción de un lenguaje de

programación, por un compilador o un intérprete, donde cada símbolo en el

código fuente de un programa está asociado con información tal como la

ubicación, el tipo de datos y el ámbito de cada variable, constante o

procedimiento.

Funciones principales:

Efectuar chequeos semánticos.

Generación de código.

Page 3: Creación de Tabla de Símbolos

Ambas funciones se realizan insertando o recuperando desde la tabla de

símbolos los atributos de las variables usadas en el programa fuente.

Estos atributos, tales como: el nombre, tipo, dirección de

almacenamiento y dimensión de una variable, usualmente se

encuentran explícitamente en las declaraciones o más implícitamente a

través del contexto en que aparecen los nombres de variables en el

programa.

Page 4: Creación de Tabla de Símbolos

Muchos compiladores configuran una tabla en el momento del análisis

léxico y le agregan información de los símbolos utilizados durante el

análisis semántico, cuando se conoce mas información sobre las

variables.

Page 5: Creación de Tabla de Símbolos

La organización de la tabla de símbolos variará dependiendo de las

limitaciones de memoria y tiempo de acceso.

Una tabla de símbolo provee la siguiente información:

Da un identificador.

Que información es asociada con un nombre.

Como se asocia esa información con un nombre.

Como acceder esta información.

Page 6: Creación de Tabla de Símbolos

La tabla almacena la información que en cada momento se necesita sobre

las variables del programa, información tal como: nombre, tipo, dirección

de localización, tamaño, etc.

La gestión de la tabla de símbolos es muy importante, ya que consume

gran parte del tiempo de compilación. De ahí que su eficiencia sea crítica.

También sirve para guardar información referente a los tipos creados por

el usuario, tipos enumerados y, en general, a cualquier identificador

creado por el usuario, nos vamos a centrar principalmente en las

variables de usuario.

Page 7: Creación de Tabla de Símbolos

Registro de la tabla de símbolos(symbol-table record)

Page 8: Creación de Tabla de Símbolos

Lista de Atributos

Nombre de identificador.

Dirección en tiempo de ejecución a partir de la cual se almacenará el

identificador si es una variable. En el caso de funciones puede ser la dirección a

partir de la cual se colocará el código de la función.

Tipo del identificador. Si es una función, es el tipo que devuelve la función.

Número de dimensiones del array, o número de miembros de una estructura o

clase, o número de parámetros si se trata de una función.

Page 9: Creación de Tabla de Símbolos

Tamaño máximo o rango de cada una de las dimensiones de los arrays, si tienen dimensión estática.

Tipo y forma de acceso de cada uno de los miembros de las estructuras, uniones o clases. Tipo de cada uno de los parámetros 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 homogéneos.

Número de la línea del texto fuente en que se hace referencia a la variable.

Campo puntero para construir una lista encadenada que permita listar las variables en orden alfabético en las fases de depuración de código.

Page 10: Creación de Tabla de Símbolos

Almacenamiento del nombre

Se puede hacer con o sin límite.

Si lo hacemos con límite, emplearemos una longitud fija para cada

variable, lo cual aumenta la velocidad de creación, pero limita la longitud

en unos casos, y desperdicia espacio en la mayoría.

Otro método es habilitar la memoria que necesitemos en cada caso para

guardar el nombre.

Page 11: Creación de Tabla de Símbolos

Dirección de memoria donde se guardará

Esta dirección es necesaria, porque las instrucciones que referencian a una

variable deben saber donde encontrar el valor de esa variable en tiempo de

ejecución, también cuando se trata de variables globales.

En lenguajes que no permiten recursividad, las direcciones se van asignando

secuencialmente a medida que se hacen las declaraciones.

En lenguajes con estructuras de bloques, la dirección se da con respecto al

comienzo del bloque de datos de ese bloque, (función o procedimiento) en

concreto.

Page 12: Creación de Tabla de Símbolos

El número de dimensiones de una variable array, o el de parámetros de

una función o procedimiento junto con el tipo de cada uno de ellos es

útil para el chequeo semántico.

Aunque esta información puede extraerse de la estructura de tipos, para

un control más eficiente, se puede indicar explícitamente.

Page 13: Creación de Tabla de Símbolos

El tipo también se almacena en la tabla.

También podemos guardar información de los números de línea en los

que se ha usado un identificador, y de la línea en que se declaró.

Page 14: Creación de Tabla de Símbolos

Consideraciones sobre la Tabla de Símbolos

La tabla de símbolos puede iniciarse con cierta información útil, tal

como:

Constantes: PI, E, etc.

Funciones de librería: EXP, LOG, etc.

Palabras reservadas. Esto facilita el trabajo al lexicográfico, que tras

reconocer un identificador lo busca en la tabla de símbolos, y si es palabra

reservada devuelve un token asociado.

Page 15: Creación de Tabla de Símbolos

Conforme van apareciendo nuevas declaraciones de identificadores, el

analizador léxico, o el analizador sintáctico según la estrategia que sigamos,

insertará nuevas entradas en la tabla de símbolos, evitando siempre la

existencia de entradas repetidas.

El analizador semántico efectúa las comprobaciones sensibles al contexto

gracias a la tabla de símbolos, y el generador de código intermedio usa las

direcciones de memoria asociadas a cada identificador en la tabla de

símbolos, al igual que el generador de código.

El optimizador de código no necesita hacer uso de ella

Page 16: Creación de Tabla de Símbolos
Page 17: Creación de Tabla de Símbolos

La tabla de símbolos contiene información útil para poder compilar, por

tanto existe en tiempo de compilación, y no de ejecución.

Sin embargo, en un intérprete, dado que la compilación y ejecución se

producen a la vez, la tabla de símbolos permanece todo el tiempo.

Page 18: Creación de Tabla de Símbolos

Ejemplo

Vamos a hacer un intérprete. Recordar que en un intérprete la entrada

es un programa y la salida es la ejecución de ese programa.

Suponemos que queremos hacer las siguientes operaciones:

a = 7 * 3

b = 3 * a

Page 19: Creación de Tabla de Símbolos

En la segunda instrucción necesitamos saber cuanto vale ‘a’; es decir el

valor de ‘a’ debe estar guardado en algún sitio. Para ello utilizaremos

una lista de pares:

Nombre

Valor

Nombre

Valor

Nombre

Valor

Tabla de símbolos

Page 20: Creación de Tabla de Símbolos

De forma que cuando nos encontremos con la instrucción a = 7 * 3,

miremos en la tabla, si no está ‘a’ en la tabla, creamos un nodo para

introducirla

a

21

Ts

Page 21: Creación de Tabla de Símbolos

A continuación nos encontramos con b = 3 * a. ¿Qué es ‘a’? Busco en la

tabla de símbolos y vemos que el valor de ‘a’ es 21.

b = 3 * a Ahora buscamos b en la tabla de símbolos y como no está lo

creamos

a

21

b

63

Ts

Page 22: Creación de Tabla de Símbolos

Si ejecutáramos ahora la instrucción: a = a + b

Tendríamos a ‘a’ y ‘b’ en la tabla de símbolos con lo cual solo

tendríamos que modificar el valor de ‘a’.

a

84

b

63

Ts