La tabla de símbolos es una estructura de datos central en la fase de front-end del compilador. Sirve como un “diccionario” donde el compilador guarda y consulta toda la información relevante sobre identificadores (variables, funciones, constantes, tipos, etc.) que aparecen en el código fuente.

Piensa en ella como una agenda del compilador: cada vez que el analizador léxico, sintáctico o semántico detecta un nuevo símbolo, lo “anota” con todos sus datos.


1. Funciones principales

Relacionado: Alcance. CENT. partes principales de un sistema robotico.

  • Insertar un símbolo cuando se declara por primera vez.

  • Buscar un símbolo cuando aparece en el código para obtener su información.

  • Actualizar datos de un símbolo (por ejemplo, añadir su dirección de memoria).

  • Eliminar símbolos cuando salen de su ámbito (por ejemplo, al salir de una función).


2. Qué información guarda

Depende del tipo de símbolo:

  • Variable:

    • Tipo (int, float, struct…)

    • Dirección en memoria (offset o registro)

    • Alcance (scope)

    • Valor inicial (si lo tiene)

  • Constante:

    • Tipo y valor literal
  • Función / Procedimiento:

    • Lista y tipo de parámetros

    • Tipo de retorno

    • Forma de paso de parámetros (por valor, por referencia)

    • Dirección de inicio de código

  • Tipos definidos por el usuario:

    • Campos de un struct o class

    • Límites de arrays


3. Uso dentro del compilador

  • Análisis léxico: puede crear entradas iniciales (palabras reservadas, símbolos predefinidos).

  • Análisis sintáctico: al reconocer declaraciones, pide insertar entradas nuevas.

  • Análisis semántico: valida que un identificador esté declarado antes de usarlo, y que el tipo concuerde con su uso.

  • Generación de código: usa la dirección, tamaño y tipo para emitir instrucciones correctas.


4. Implementaciones comunes

  • Lista lineal: fácil de implementar, pero lenta para muchos símbolos.

  • Tabla hash: la más habitual; acceso rápido promedio O(1).

  • Árboles de búsqueda (AVL, B-tree): útiles si hay ordenamientos o búsquedas por rango, aunque menos comunes para compiladores.


5. Ámbitos y reglas de alcance

La tabla de símbolos debe manejar estructuras de bloques (scopes) y ocultamiento de nombres:

  • Ámbito local: válido solo dentro de una función o bloque.

  • Ámbito global: válido en todo el programa.

  • Regla de anidación más próxima: si un nombre existe en varios ámbitos, se usa el más cercano al punto de uso.

Ejemplo en C:

int x; // Global
 
void f() {
    int x; // Local, oculta la global
    x = 5; // Se refiere al x local
}

6. Ejemplo de entrada en tabla de símbolos

NombreTipoCategoríaAlcanceDirecciónOtros atributos
PIdoubleConstanteGlobalConstSegValor=3.1415
xintVariableLocal f()FP-4Inicializada=false
ffuncProcedim.GlobalCódigoSegParams=(int,float)

Si quieres, puedo prepararte un ejemplo visual donde, al compilar un pequeño programa en C o Pascal, veas cómo la tabla de símbolos se va llenando paso a paso conforme actúan el léxico, el sintáctico y el semántico.
¿Quieres que lo haga?