Вы находитесь на странице: 1из 37

Teoría de lenguajes y compiladores

Unidad II

Analizador Sintáctico

Semana 7

Tabla de símbolos
Objetivo General

El alumno al finalizar el curso desarrollará


aplicaciones que le permitan determinar si
una sentencia corresponde a la estructura
gramatical de un lenguaje de
programación. Así mismo estará
capacitado para proponer nuevas formas
estructurales en la definición de lenguajes
de programación.
Objetivo Específico

Desarrollar un analizador sintáctico


Objetivo Instruccional

Incorporar una tabla de símbolos al


analizador lexicográfico
Temas
Generalidades

Tabla de Símbolos
Definición
La tabla de símbolos es una estructura de
datos que se utiliza para almacenar
información (atributos) asociados a símbolos
Generalidades

declarados en el programa.
Funciones de la Tabla de Símbolos
La tabla de símbolos también es conocido
como tabla de nombres o tabla de
identificadores y es accedido por dos
Generalidades

funciones principales:

• Efectuar chequeos semánticos


• Generación de código

Permanece sólo en tiempo de compilación,


no de ejecución, excepto en aquellos casos
en que se compila con opciones de
depuración
¿Qué almacena?
La tabla almacena la información que en cada
momento se necesita conocer sobre las variables
del programa, información tal como: nombre, tipo,
Generalidades

dirección de localización, tamaño, etc.

La gestión de la tabla de símbolos es muy


importante, ya que consume gran parte del tiempo
de compilación. De ahí que su eficiencia sea crítica.
Símbolos definidos por el
programador
Variables: tipo, lugar en la memoria, ¿valor?,
¿referencias?
Generalidades

Procedimientos y funciones: dirección,


parámetros, tipo de resultado

Parámetros: tipo de variable, clase de


variable

Etiquetas: lugar en el programa


Respecto a cada símbolo
podemos guardar…
El nombre.- Se puede hacer con o sin límite.
Generalidades

• Si lo hacemos con límite, emplearemos una


longitud fija para cada variable, lo cual
aumenta la velocidad de creación, pero
limita la longitud en unos casos, y
desperdicia espacio en la mayoría.
• Otro método es habilitar la memoria que
necesitemos en cada caso para guardar el
nombre.

El tipo.- también se almacena en la tabla.


Respecto a cada símbolo
podemos guardar…
Dirección de memoria en que se guardará.- Esta
Generalidades

dirección es necesaria, porque las instrucciones que


referencian a una variable deben saber donde
encontrar el valor de esa variable en tiempo de
ejecución, también cuando se trata de variables
globales.
• En lenguajes que no permiten recursividad, las
direcciones se van asignando secuencialmente a
medida que se hacen las declaraciones.
• En lenguajes con estructuras de bloques, la
dirección se da con respecto al comienzo del
bloque de datos de ese bloque (función o
procedimiento) en concreto.
Respecto a cada símbolo
podemos guardar…
Número de dimensiones.- El número de dimensiones
Generalidades

de una variable arrays, o el de parámetros de una


función o procedimiento junto con el tipo de cada
uno de ellos es útil para el chequeo semántico
Consideraciones sobre la tabla de
símbolos
• Conforme van apareciendo nuevas declaraciones
de identificadores, el analizador léxico, o el
Generalidades

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.
Consideraciones sobre la tabla de
símbolos
En la implementación de la tabla de
símbolos nos creamos un Tipo Abstracto de
Generalidades

Datos (Se utilizara una lista por simplicidad. Lo mejor es usar


otra estructura más eficiente. Por ejemplo un árbol AVL).
Operaciones sobre la tabla de
símbolos
• Crear: Crea una tabla vacía.
Generalidades

• Insertar: Parte de una tabla de símbolo y de un


nodo, lo que hace es añadir ese nodo a la tabla.

• Buscar: Busca el nodo que contiene el nombre


que le paso por parámetro.

• Imprimir: Devuelve una lista con los valores que


tiene los identificadores de usuario, es decir
recorre la tabla de símbolos.
Palabras Reservadas y Operadores
OP_PI = 54; // paréntesis izquierdo
OP_PD = 55; // paréntesis derecho
PC_PR = 1; // Palabra reservada program OP_SS = 56; // operador suma
PC_VA = 2; // Palabra reservada var OP_SR = 57; // operador resta
PC_AR = 3; // Palabra reservada array OP_PU = 58; // operador punto
OP_IG = 59; // operador igual que
PC_OF = 4; // Palabra reservada of OP_DI = 60; // operador distinto o diferente
PC_IN = 5; // Palabra reservada integer OP_LE = 61; // operador menor o igual que
PC_RE = 6; // Palabra reservada real OP_ME = 62; // operador mayor o igual que
Generalidades

PC_FU = 7; // Palabra reservada function OP_MY = 63; // operador mayor que


PC_PO = 8; // Palabra reservada procedure OP_AS = 64; // operador multiplicación
PC_BE = 9; // Palabra reservada begin OP_DR = 65; // operador división real
OP_OA = 66; // operador asignación
PC_EN = 10; // Palabra reservada end OP_PC = 67; // operador punto y coma
PC_IF = 11; // Palabra reservada if OP_DP = 68; // operador dos puntos
PC_TH = 12; // Palabra reservada then OP_CO = 69; // operador coma
PC_EL = 13; // Palabra reservada else OP_MQ = 70; // operador menor que
PC_WH = 14; // Palabra reservada while
PC_DO = 15; // Palabra reservada do
PC_EX = 16; // Palabra reservada e (para exponente)
PC_NO = 17; // Palabra reservada not (operador de negación)
PC_OL = 18; // Palabra reservada or (operador o)
PC_AL = 19; // Palabra reservada and (operador y)
PC_DE = 20; // Palabra reservada div (operador división entera)
PC_RT = 21; // Palabra reservada mod (operador residuo)
PC_II = 22; // Palabra reservada input
PC_OO = 23; // Palabra reservada output
PC_LE = 24; // Palabra reservada read
PC_ES = 25; // Palabra reservada write
PC_CO = 26; // Palabra reservada const
•Es utilizada por el compilador para asociar a cada
símbolo del programa fuente (identificadores,
constantes, ... , etc) un contenido semántico.

•Los campos asociados al


Tabla de Símbolos

registro pueden contener la


información misma para lo que
están destinados, o bien un
puntero a posiciones de
memoria en las que se guarda
esta información.
ESTRUCTURA
A. Nombre del símbolo

En la tabla de símbolos deben aparecer todos los lexemas


Tabla de Símbolos

correspondientes a los símbolos usados en el programa fuente. Los


símbolos serán todos aquellos trozos de código que representen
identificadores, constantes numéricas o cualquier otro elemento
que el lenguaje sea capaz de manejar.

Para el almacenamiento en la TS de los lexemas pueden utilizarse


las técnicas:
A.1 Interno: El campo de la tabla de símbolos se define como de
tipo cadena de caracteres de dimensión fija. El inconveniente
esta en que la longitud de los identificadores esta restringida al
valor fijado.

A.2 Externo: El campo de la tabla de símbolos contiene un


puntero a una zona de memoria en la que se almacena el
lexema.
ESTRUCTURA
A. Nombre del símbolo. Almacenamiento Interno

Definiendo el campo nombre como un índice


Tabla de Símbolos

en un vector de nombres.
ESTRUCTURA
A. Nombre del símbolo. Almacenamiento externo

Definiendo el campo nombre como un


Tabla de Símbolos

puntero.
ESTRUCTURA
B. Dirección de memoria

•En este campo se almacenan las direcciones de


Tabla de Símbolos

memoria en las que se guardaran los valores de las


variables correspondientes a cada símbolo, durante
la ejecución del programa.

•Es importante recordar que la tabla de símbolos no


contiene los valores de las variables, sino
simplemente las dirección en la que se almacenaran
cuando el programa se ejecute.
ESTRUCTURA
C. Tipos

En este campo se almacenara el código


Tabla de Símbolos

correspondiente al tipo de datos representado por


el símbolo, o bien un puntero a la estructura de
datos correspondiente.
ESTRUCTURA
D. Numero de la línea de la declaración en la que se
usa el símbolo
Tabla de Símbolos

• Esta es una información auxiliar, que será de


utilidad para producir un listado de
referencias cruzadas que ayuden a la
depuración de los programas.

• Puede utilizarse una lista encadenada de


números de línea, siendo la cabeza de esta
la línea en donde aparece la declaración
del símbolo.
FUNCIONAMIENTO
Tabla de Símbolos

Gener
INICIALIZACION

ador
Análisis Análisis de
léxico sintáctico código

Análisis Semántico

TABLA DE SIMBOLOS
FUNCIONAMIENTO
a. La TS puede inicializarse con cierta información
sobre símbolos especiales en el lenguaje, como son
las palabras reservadas, funciones de librerías,
Tabla de Símbolos

constantes predefinidas, etc.

b. El analizador lexicográfico va leyendo el texto


fuente y construyendo lexemas, creando nuevas
entradas en la TS conforme va encontrando nuevos
símbolos, para lo cual a de comprobar que el
símbolo no figure en la TS.

c. El analizador sintáctico trabaja solamente con la


estructura formal y a nivel de tokens ya formados
en la fase anterior.
FUNCIONAMIENTO
d. El analizador sintáctico sirve de soporte o
armazón de un conjunto de rutinas del análisis
semántico. Parte de estas rutinas puede
Tabla de Símbolos

completar la información de la TS sobre el tipo


de un determinado lexema.

e. El generador de código usa la información de la


TS para referenciar el código a las posiciones
adecuadas de memoria.
OPERACIONES
La TS funciona como una estructura de base de datos en la que
el campo clave es el lexema correspondiente al símbolo.
Tabla de Símbolos

En general, puede hacerse las siguientes operaciones:

a. Insertar un nuevo registro y comprobar que no existe otro con


el mismo nombre.
b. Buscar y localizar el contenido de la TS asociado a un
determinado lexema
c. Modificar la información contenida en un registro.
d. Recuperar información de un símbolo.

En lenguaje con estructura de bloque se incluyen dos


operaciones más:
e. Nuevo bloque : Inicio de un nuevo bloque
f. Fin_bloque : Terminación del ámbito de un bloque.

Las inserciones se realizan cuando se procesa la zona de


declaración de variables.
ORGANIZACIÓN
Program ejemplo; 1 Las técnicas para
Var uno : integer;
el manejo de TS
Procedure dos en lenguajes con
estructura de
Tabla de Símbolos

Var tres, cuatro : integer; 2


bloques suelen
Procedure cinco
emplear una pila
Var uno, dos:real; 3 auxiliar de índices
 (a)
Begin de bloque cuyos
… elementos son
End
punteros a las
tablas de símbolos
Procedure seis y sirven para
Var uno, tres:real; 4 marcar el
 (b) comienzo o el final
Begin

de los símbolos
End correspondientes
Begin a un bloque.

End
EJEMPLO
program e e():
var a, b, c : char;
procedure f; a, b, c
f, g, j
Tabla de Símbolos

var a, b, c: char;

procedure g;
var a, b : char;
procedure h; f(): g(): j():
var c, d : char;
… a, b, c a, b b, d
procedure i; h, i
var b, c: char;


procedure j; h(): i():
var b, d:char; c, d b, c


ESTRUCTURAS DE DATOS
Lista no ordenada:
• Búsqueda e inserción no eficaces
• Solo es valida cuando va a haber pocos símbolos
Tabla de Símbolos

Lista ordenada:
• Búsqueda mas rápida si se implementa por una matriz
• Inserción sigue siendo lenta

Árbol binario:
• Búsqueda e inserción rápidas (si se mantienen balanceados)
• Eficientes en términos de espacio

Tablas hash:
• Las mas utilizadas por su eficiencia
• La función hash debe mantener los nombres uniformemente
distribuidos
ESTRUCTURAS DE DATOS
Lista no ordenada
Tabla de Símbolos
ESTRUCTURAS DE DATOS
Árbol binario
Tabla de Símbolos
ESTRUCTURAS DE DATOS
(bosque de árboles)
En este caso la TS esta formada por múltiples arboles,
uno por cada bloque. Se usa una estructura de datos
Tabla de Símbolos

auxiliar (pila) que sirve de índice de bloque.

Índice de 1 2 3
bloque

uno … tres … uno …

dos … cuatro … dos …

cinco … (a)
ESTRUCTURAS DE DATOS
(bosque de árboles)
Las operaciones sobre esta son:
Tabla de Símbolos

a. Insertar: Al existir tablas independientes para cada bloque, la


operación inserción se realiza normalmente atendiendo al
bloque activo.
b. Buscar: La búsqueda es algo mas compleja. Para localizar un
lexema se busca primero en la tabla de bloque activo, luego
en la tabla a la que apunta el índice del bloque anterior y así
sucesivamente hasta localizarlo o hasta que se hayan
rastreado todos los árboles.
c. Nuevo_bloque: Se crea un nuevo elemento en la pila de
índice de bloque y una nueva estructura de tipo árbol
inicialmente vacía.
d. Fin_bloque: Se destruye toda la estructura arborescente
asociada al bloque que se termina y se elimina el puntero de
la pila de índice de bloques.
ESTRUCTURAS DE DATOS
Tablas hash
Tabla de Símbolos

Dos cadenas
diferentes pueden
estar asociadas al
mismo índice
(COLISION).

La función de dispersión h:
asocia una cadena de
caracteres con un código de
dispersión = índice de la tabla.
TRABAJO
Al analizador lexicográfico desarrollado,
incorporar la implementación y uso de
Tabla de Símbolos

la tabla de símbolos para reconocer


errores tales como variables no
definidas o variables ya definidas.
Teoría de lenguajes y compiladores

Unidad II

Analizador Sintáctico

Semana 7

Tabla de símbolos

Вам также может понравиться