Categories: All - dimensiones - variables - memoria - datos

by María Belén Espinoza Morante 3 years ago

286

Implementación léxica

En el diseño y desarrollo de traductores, se destaca la importancia de gestionar adecuadamente los identificadores de usuario, que pueden ser nombres de funciones, procedimientos o variables.

Implementación léxica

Implementación léxica

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
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.

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

Número de dimensiones

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

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.

Dirección de memoria en que se almacenará su valor en tiempo de ejecución.
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.

Nombre del elemento

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

Ejemplos de la tabla de símbolos

La tabla de símbolos tendrá una estructura de lista no ordenada simplemente encadenada
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.
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.

Bibliografía

Sergio.(2015).Traductores, Compiladores e Intérpretes.
Berzal F.(2017). Introducción a la programación en C. Universidad de Madrid

Consideraciones sobre la tabla de símbolos

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.
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.
La tabla de símbolos puede inicializarse con cierta información útil, que puede almacenarse en una única estructura o en varias:
Palabras reservadas
Funciones de librería
Constantes