Implementación léxica

Consideraciones sobre la tabla de símbolos

La tabla de símbolos puede inicializarse con cierta información útil, que puede almacenarse en una única estructura o en varias:

Constantes

Funciones de librería

Palabras reservadas

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.

Bibliografía

Berzal F.(2017). Introducción a la programación en C. Universidad de Madrid

Sergio.(2015).Traductores, Compiladores e Intérpretes.

Ejemplos de la tabla de símbolos

Ejemplo: una calculadora con variables
Para simplificar el diseño no se incluirá un área de
declaraciones de variables, sino que éstas se podrán utilizar directamente inicializándose a 0, puesto que tan sólo disponemos del tipo entero.

Para introducir las variables en la calculadora necesitamos una nueva construcción sintáctica con la que poder darle valores: se trata de la asignación. 1.- a := 7 * 3;
2.- b := 3 * a;
3.- a := a + b;

A) En la sentencia 1 una vez evaluada la expresión 7*3 al valor 21 se inspeccionará la tabla de símbolos en busca del identificador a.
B) El analizador léxico lo creará inicializándolo a 0.
C) La regla asociada a la asignación modificará la entrada de la a para asignarle el valor 21.

D) En la sentencia 2, la evaluación de la expresión requiere buscar a en la tabla de símbolos para recoger su valor 21 para multiplicarlo por 3.

E) El resultado 63 se almacena en la entrada asociada a la b

F) La sentencia 3 evalúa una nueva expresión en la que intervienen a y b, asignando su suma 84 a la entrada de a en la tabla de símbolos.

Nota: Utilizaremos una tabla de símbolos en la que almacenaremos tan sólo el nombre de cada variable, así como su valor ya que estamos tratando con un intérprete.

La tabla de símbolos tendrá una estructura de lista no ordenada simplemente encadenada

Información sobre los identificadores de usuario

La información que el desarrollador decida almacenar en esta tabla dependerá de las características concretas del traductor que esté desarrollando

Nombre del elemento

El nombre o identificador puede almacenarse limitando o no la longitud del mismo

Tipo del elemento

Cuando se almacenan variables, resulta fundamental conocer el tipo de datos a que pertenece cada una de ellas, tanto si es primitivo como si no, con objeto de poder controlar que el uso que se hace de tales variables es coherente con el tipo con que fueron declaradas.

Dirección de memoria en que se almacenará su valor en tiempo de ejecución.

Cuando se almacenan variables, resulta fundamental conocer el tipo de datos a que pertenece cada una de ellas, tanto si es primitivo como si no, con objeto de poder controlar que el uso que se hace de tales variables es coherente con el tipo con que fueron declaradas.

Valor del elemento

Cuando se trabaja con intérpretes sencillos, y dado que en un intérprete se solapan los tiempos de compilación y ejecución, puede resultar más fácil gestionar las variables si almacenamos sus valores en la tabla de símbolos.

Número de dimensiones

Si la variable a almacenar es un array, también
pueden almacenarse sus dimensiones

Tipos de los parámetros formales

Si el identificador a almacenar pertenece
a una función o procedimiento, es necesario almacenar los tipos de los parámetros formales para controlar que toda invocación a esta función sea

Otra información.

Si el identificador a almacenar pertenece
a una función o procedimiento, es necesario almacenar los tipos de los parámetros formales para controlar que toda invocación a esta función sea.