En informática, una tabla de símbolos 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.
Una implementación común de una tabla de símbolos puede ser una tabla hash, la cual será mantenida a lo largo de todas las fases del proceso de compilación de ticses.
Puede tratarse como una estructura transitoria o volátil, que sea utilizada únicamente en el proceso de traducción de un lenguaje de programación, para luego ser descartada, o integrada en la salida del proceso de compilación para una explotación posterior, como puede ser por ejemplo, durante una sesión de depuración, o como recurso para obtener un informe de diagnóstico durante o después la ejecución de un programa.
Los símbolos en la tabla de símbolos pueden referirse a constantes, a funciones o a tipos de datos en el código fuente de un programa.
La tabla de símbolos forma parte de cada fichero que contiene el código objeto durante el enlazado o linking de los diferentes ficheros; recae en la responsabilidad del linker o enlazador resolver cualquier referencia no resuelta.
Tabla de símbolos en lenguaje C
Como ya se dijo en el esbozo, la tabla de símbolos es una estructura de datos que se crea en tiempo de traducción del programa fuente. Es como un diccionario variable, debe darle apoyo a la inserción, búsqueda y cancelación de nombres (identificadores) con sus atributos asociados, representando las vinculaciones con las declaraciones. Debe aclararse que no necesariamente deberá estar representada en una tabla como su nombre indica ya que también se emplean árboles, pilas , etc.
Los símbolos se guardan en la tabla con su nombre y una serie de atributos opcionales que dependerán del lenguaje y de los objetivos del procesador, este conjunto de atributos almacenados se denomina registro de la tabla de símbolos.
La siguiente representa una serie de atributos que no es necesaria para todos los compiladores, sin embargo cada uno de ellos se puede utilizar en la implementación de un compilador particular.
- nombre del identificador.
- dirección en tiempo de ejecución a partir del cual se almacenara el identificador si es una variable.
- tipo del identificador. Si es una función, el tipo que devuelve la función.
- número de dimensiones del array (arreglo), o número de miembros de una estructura o clase, o números de parámetros si se trata de una función.
- tamaño máximo o rango de cada una de las dimensiones de los array, si tiene dimensión estática.
- etc.
Operaciones con la Tabla de símbolos
En general en la Tabla de símbolos ( operadores ahora) se realizan dos operaciones: la inserción y la búsqueda.
En C la operación de inserción se realiza cuando se procesa una declaración.
Hay dos posibilidades: que la TS esté ordenada (o sea, nombres de variables por orden alfabético) o que no esté ordenada.
Si está ordenada, entonces la operación de inserción llama a un procedimiento de búsqueda para encontrar el lugar donde colocar los atributos del identificador a insertar, por lo que en este caso la inserción lleva tanto tiempo como la búsqueda. En cambio, si no está ordenada la TS, la inserción se simplifica mucho aunque se complica la búsqueda, pues debe examinar toda la tabla.
En la búsqueda, se detectan los identificadores que no hayan sido declarados previamente, emitiendo un mensaje de error.
ejemplo en lenguaje C: Undefined símbolo 'x', si es una variable que desea usarse pero no se declaró.
En la inserción, se detectan identififcadores que ya han sido declarados previamente, emitiendo un mensaje de error
ejemplo en C: multiple declaration for 'x' si x ya estaba en TS.
Analizador Sintáctico(Parser)
Sintaxis: El orden correcto de las palabras
Ej. Programa Fuente: 34:= *x - 640; Analex: NUM ASIGN POR ID MENOS NUM PTOCOMA Parser: "Error Sintáctico"
El Analizador semántico
Semántica: Significado de las frases.
Estando una frase del programa fuente ya analizada sintácticamente ("parseada") pasa al analizador semántico para verificar la intención del programador con esa frase: "Pasó por el parser y no presentó errores".
Ejemplo: byte b; int v[3]; String s;//Error semántico b = 4000; //out of range s = 6000; //incompatible type's o "Type mismatch" v[8]= 12; // out of range