Compilador Diseo - Tabla de Smbolos



Tabla de smbolos es una importante estructura de datos creada y mantenida por los compiladores con el fin de almacenar informacin acerca de la ocurrencia de diversas entidades, tales como nombres de variables, nombres de funciones, objetos, clases, interfaces, etc. tabla de smbolos se utiliza en el anlisis y la sntesis de un compilador.

Una tabla de smbolos pueden servir los fines siguientes en funcin del idioma de la mano:

  • Para almacenar los nombres de todas las entidades de forma estructurada en un solo lugar.

  • Para verificar si se ha declarado una variable.

  • Comprobacin del tipo de implemento, comprobando las cesiones y las expresiones en el cdigo fuente son semnticamente correcto.

  • Para determinar el alcance de un nombre (alcance de la resolucin).

Una tabla de smbolos es simplemente una tabla que puede ser lineal o una tabla hash. Mantiene una entrada para cada uno de los nombres con el formato siguiente:

<symbol name,  type,  attribute>

Por ejemplo, si tiene una tabla de smbolos para almacenar informacin acerca de la siguiente declaracin de variables:

static int interest;

A continuacin, debe almacenar la entrada como la siguiente:

<interest, int, static>

El atributo clusula contiene las entradas relacionadas con el nombre.

Aplicacin

Si un compilador es manejar una pequea cantidad de datos, a continuacin, la tabla de smbolos puede ser implementado como una lista desordenada, que es muy fcil de cdigo, sino que slo es adecuado para pequeas mesas. Una tabla de smbolos se puede implementar en una de las siguientes formas:

  • Lineal (ordenadas o desordenadas) lista
  • rbol de bsqueda binaria
  • Tabla Hash

Entre todos, tablas de smbolos son en su mayora implementadas como tablas hash, en el que el cdigo fuente propio smbolo es tratada como un elemento clave para la funcin de hash y el valor de retorno es la informacin sobre el smbolo.

Operaciones

Una tabla de smbolos, ya sea lineal o hash, debe proporcionar las siguientes operaciones.

Insert()

Esta operacin es el que se utiliza con ms frecuencia en fase de anlisis, es decir, la primera mitad del compilador en donde los testigos son identificados y los nombres se almacenan en la tabla. Esta operacin se utiliza para aadir informacin en la tabla de smbolos de nombres nicos que ocurren en el cdigo fuente. El formato o estructura en la que los nombres se almacenan depende del compilador en mano.

Un atributo de un smbolo en el cdigo fuente es la informacin asociada con ese smbolo. Esta informacin contiene el valor, el estado, el alcance y el tipo sobre el smbolo. El insertar() toma el smbolo y sus atributos como argumentos y almacena la informacin en la tabla de smbolos.

Por ejemplo:

int a;

Debe ser procesada por el compilador como:

insert(a, int);

Lookup()

Lookup() es utilizado para buscar un nombre en la tabla de smbolos para determinar:

  • Si el smbolo existe en la tabla.
  • Si se declara antes de que se utilice.
  • Si el nombre se usa en el mbito de aplicacin.
  • Si el smbolo est inicializado.
  • Si el smbolo declarado varias veces.

El formato de bsqueda() vara segn el lenguaje de programacin. El formato bsico debe coincidir con el siguiente:

Lookup(smbolo)

Este mtodo devuelve el valor 0 (cero) si el smbolo no existe en la tabla de smbolos. Si el smbolo existe en la tabla de smbolos, se devuelve sus atributos almacenados en la tabla.

mbito Gestin

Un compilador mantiene dos tipos de tablas de smbolos: a global tabla de smbolos que puede ser accedida por todos los procedimientos y el alcance tablas de smbolos que se crean para cada mbito en el programa.

A fin de determinar el alcance de un nombre, smbolo mesas estn dispuestas en estructura jerrquica que se muestra en el ejemplo siguiente:

. . . 
int value=10;
void pro_one()
   {
   int one_1;
   int one_2;
      {              \
      int one_3;      |_  inner scope 1 
      int one_4;      | 
      }              /
   int one_5; 
     {              \   
      int one_6;      |_  inner scope 2
      int one_7;      |
      }              /
   }
void pro_two()
   {
   int two_1;
   int two_2;
      {              \
      int two_3;      |_  inner scope 3
      int two_4;      |
      }              /
   int two_5;
   }
. . . 

El programa anterior se puede representar en una estructura jerrquica de tablas de smbolos:

Tabla de Smbolos

La tabla de smbolos global contiene los nombres de una variable global (int valor) y dos nombres de procedimiento, que debe estar disponible para todos los nodos secundarios se muestra arriba. Los nombres mencionados en la tabla de smbolos pro_one (y todos sus nios tablas) no estn disponibles para smbolos pro_two tablas y su hijo.

Este smbolo jerarqua en la estructura los datos de la tabla se almacena en el analizador semntico y cada vez que un nombre se debe buscar en una tabla de smbolos, se busca mediante el siguiente algoritmo:

  • En primer lugar, un smbolo se buscar en el mbito actual, es decir tabla de smbolos.

  • Si un nombre se encuentra, entonces, otra cosa que se buscar en la tabla de smbolos hasta que padre,

  • O bien se encuentra el nombre o smbolo mundial tabla se ha buscado para el nombre.

Advertisements