Red de conocimiento informático - Conocimiento informático - Definir estructuras de datos para árboles de sintaxis y tablas de símbolos.

Definir estructuras de datos para árboles de sintaxis y tablas de símbolos.

Para mantener el seguimiento de cada nombre en un programa de ámbito estático, el compilador necesita confiar en una estructura de datos llamada tabla de símbolos. En su nivel más básico, una tabla de símbolos es un diccionario: asigna nombres a información relevante conocida por el compilador. La operación más básica aquí es colocar una nueva relación de mapeo (restricción de objeto de nombre) en la tabla y (de manera no destructiva) usar un nombre determinado para extraer la información debajo del mapeo. Más adelante

Estos. Dos operaciones se denominan inserción y búsqueda respectivamente. Las reglas de alcance estático en la mayoría de los lenguajes presentan complicaciones adicionales al requerir diferentes entornos de referencia en diferentes partes del programa. Para manejar las reglas de alcance, es posible que deseemos simplemente agregar una operación de eliminación. Debido a que el compilador escanea el código de principio a fin durante la fase de análisis semántico, puede insertar nuevas restricciones al comienzo de un alcance y revocarlas al final del alcance. Sin embargo, hay factores que hacen que este enfoque sencillo no sea práctico.

¨ En muchos lenguajes con ámbitos anidados, los efectos de las declaraciones internas pueden eclipsar las declaraciones externas, lo que significa que la tabla de símbolos debe poder contener cualquier número de asignaciones para un nombre determinado. La operación de búsqueda debe devolver el mapeo más interno y hacer que el mapeo externo sea visible nuevamente cuando finalice el alcance.

¨ Los registros (estructuras) en lenguajes tipo Algol tienen ciertas propiedades de alcance, pero no disfrutan de la buena estructura de anidamiento de ámbitos. Cuando el analizador semántico ve una declaración de registro, debe escribir los nombres de los distintos campos del registro (también son recursivos, ya que los registros se pueden anidar). Al final de esta declaración, los nombres de los respectivos campos deben volverse invisibles. Sin embargo, después de esto, tan pronto como aparezca una variable de este tipo de registro en el cuerpo del programa (por ejemplo, en my_rec.field_name), estos campos deben volver a ser visibles inmediatamente después del punto en la referencia. En Pascal y otros lenguajes con declaraciones with, los nombres de los campos de registro también deberían volverse visibles en el contexto de varias declaraciones.

¨ A veces los nombres pueden usarse antes de ser declarados, incluso en lenguajes tipo Algol. Por ejemplo, tanto Algol 60 como Algol 68 permiten referencias directas de etiquetas. Pascal evita esta situación al exigir que las etiquetas se declaren al principio del alcance, pero aún permite referencias directas de declaraciones de puntero:

tipo