1. UNIVERSIDAD NACIONAL DEL CALLAO
FACULTAD DE INGENIERIA DE INDUSTRAL Y DE SISTEMAS
ESCUELA PROFESIONAL DE INGENIERIA DE SISTEMAS
CURSO : COMPILADORES E INTERPRETES
TEMA : TABLA DE SIMBOLOS
CATEDRATICO : EDDIE CHRISTIAN MALCA VICENTE
ALUMNOS : ALVARES ROMERO, JOSUE
LEON MEZA, LILIAN ROSARIO
MARCELO GONZALES, DIEGO
2.
3.
4.
5. El compilador traduce el código
escrito en un idioma a otro idioma
sin cambiar el sentido del
programa. También está previsto
que un compilador debe hacer el
código de destino eficaz y
optimizado en términos de tiempo
y espacio.
7. TABLA DE SIMBOLOS
La tabla de símbolos es una importante
estructura de datos creada y mantenida por
los compiladores con el fin de almacenar
información acerca de la ocurrencia de
diversas entidades, tales como nombres de
variables, nombres de funciones, objetos,
clases, interfaces, etc. La tabla de símbolos se
utiliza en el análisis y la síntesis de un
compilador.
8. o Para almacenar los nombres de todas las entidades de
forma estructurada en un solo lugar.
o Para verificar si se ha declarado una variable.
o Comprobación del tipo de implemento, revisando si las
expresiones en el código fuente son semánticamente
correctas.
o Para determinar el alcance de un nombre (alcance de la
resolución).
o Una tabla de símbolos puede ser lineal o una tabla hash.
o Una tabla de símbolos se puede implementar en una de
las siguientes formas:
– Lineal (ordenadas o desordenadas).
– Árbol de búsqueda binaria.
– Tabla Hash.
9. NECESIDAD DE LA TABLA DE SIMBOLOS
Los compiladores utilizan una gramática libre de contexto
para describir la sintaxis de lenguaje y una fase de análisis
semántico posterior para restringir las sentencias que
“semánticamente” no pertenecen al lenguaje.
El analizador sintáctico se limita a comprobar, mediante
una gramática libre de contexto, que un identificador
forma parte de un expresión. Luego si la sentencia es
sintácticamente correcta, el analizador semántico deberá
verificar que el identificador empleado haya sido
declarado .
Para llevar a cabo esta tarea es necesaria la utilización de
una estructura de datos denominada tabla de símbolos.
Esta poseerá una entrada por cada identificador declarado
en el contexto que se está analizando.
11. OBJETIVOS DE LA TABLA DE SIMBOLOS
Las TS son estructuras de datos que almacenan
toda la información de los identificadores del
lenguaje fuente.
Las misiones principales de la TS en el proceso
de traducción son:
Colaborar con las comprobaciones
semánticas.
Facilitar ayuda a la generación de código.
12. COMPLEJIDAD TEMPORAL DE LOS ALGORITMOS
La complejidad de los algoritmos se puede
estudiar estimando la dependencia entre el
tiempo que necesitan para procesar su
entrada y el tamaño de ésta. El mejor
rendimiento se obtiene si ambos son
independientes: el tiempo es constante.
13.
14. Funciones hash
Se usará la siguiente notación para las funciones
hash: sea K el conjunto de claves, sean 11 y m
respectivamente las posiciones mínima y máxima
de la tabla, y sea N el conjunto de los números
naturales. Cualquier función hash h se define de
la siguiente forma:
16. Funciones hash pseudoaleatorias
1. Se tira un dado con m caras.
2. Se anota el valor de la cara
superior (i).
3. Se toma i como el valor hash
para la clave k: h(k)=i.
3. Se accede a la posición i de la
tabla y se le asigna la
información de la clave k.
1. Se tira un dado con m caras.
2. Se anota el valor de la cara
superior (j)
3. Se define j como el valor hash
para la clave k: h(k)=j.
4. Se accede a la posición j de la
tabla y se recupera la
información almacenada en ella.
18. Algunos valores de la función hash de
multiplicación que utiliza Φ=∏y m=25. Se
resaltan las colisiones.
19. Funciones hash de división
- m es el valor máximo de posición dentro de la tabla. Se le
exige que sea primo.
Algunos valores de la función hash de división, para
m=7. Se resaltan las colisiones.
20. Otras funciones hash
Esta función hash es un algoritmo iterativo que calcula un valor
auxiliar (hi) entre 0 y la longitud m de la clave id. El valor final h(id)
se obtiene a partir de alguno de los bits del valor m-ésimo (hm).
• k es una constante deducida experimentalmente.
• n es el tamaño de la tabla, deducido con k experimentalmente.
• bits(x,j) es una función que obtiene los j bits menos significativos
del entero x.
• ci es el código ASCII del carácter i-ésimo de id
21. Factor de carga
Un concepto muy importante en el estudio de la
eficiencia es el factor de carga. Dada una tabla hash con
espacio para m claves, en la que ya se han insertado n, se
llama factor de carga y se representa mediante la letra λ,
al cociente entre n y m.
22. Solución de las colisiones
Puesto que se van a usar funciones hash que permiten colisiones, es
necesario articular mecanismos para reaccionar frente a éstas. Aunque
son muchas las alternativas posibles, en las siguientes secciones se
explicarán algunas de ellas con detalle.
Hash con direccionamiento abierto
23.
24. Sondeo lineal
Posible estado de una tabla hash con direccionamiento abierto y sondeo
lineal. Hay tres grupos de claves que colisionan, con tres, diez y nueve
claves, respectivamente. La primera posición de cada grupo (por la
izquierda) es la asignada por la función hash. Obsérvese que el último
grupo continúa en las primeras posiciones de la tabla.
Factor de Carga Rendimiento
25. HASH CON ENCADENAMIENTO
• Usa listas para contener las claves que
colisionan.
• Para tener acceso a los datos de las claves, se
accede a la posición de colisión y luego se
redirige a un nuevo vector donde se
almacenan todos los valores de las llaves.
• El proceso de creación de nuevos vectores se
puede realizar tantas veces como la limitación
de la memoria del CPU se lo permita
26.
27. TABLAS DE SÍMBOLOS PARA LENGUAJES
CON ESTRUCTURAS DE BLOQUES
Hasta el momento solo se ha tratado con
datos simples, pero también existen las
estructuras de datos como procedimientos o
funciones.
Existen 2 métodos principales para poder
manejar estructuras en una tabla hash.
28.
29. USO DE UNA TABLA POR ÁMBITO
Este método consiste en usar una
tabla de Hash para cada estructura
que se defina en el código, existen 2
formas de ejecutar este método.
30. COMPILADORES DE UN PASO
– Se utiliza una pila para almacenar las estructuras.
– Cuando se abre la estructura se sitúa en la parte superior
a la estructura ya abierta (si existe).
– Una vez se cierra la estructura se ejecuta una instrucción
pop donde se retira el bloque cerrado de la pila.
– Lo más simple en este método es la inserción.
– La complejidad reside en la búsqueda, si no se encuentra
el dato, se deberá explorar todas las tablas.
31.
32. COMPILADORES DE MÁS DE UN PASO
Este método es igual al anterior, pero se
diferencian en que las estructuras una
vez cerradas solo se marcan como
CERRADAS y no son expulsadas de la
pila, es así como se transforma la pila en
una lista de estructuras.
33.
34. USO DE UNA SOLA TABLA PARA TODOS LOS ÁMBITOS
• Como su nombre lo dice hace uso de una sola
tabla para almacenar todas la estructuras
• Este método busca solucionar el problema
anterior que maximiza la cantidad de tablas,
ocupando mucha memoria
• Este método implica guardar información
adicional como :
– la identificación del bloque
– un apuntador hacia el bloque actual
– un apuntador hacia donde se guardan los
identificadores.