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.