Post on 07-Apr-2017
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 ROSARIOMARCELO GONZALES, DIEGO
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.
ESTRUCTURA DE UN COMPILADOR
TABLA DE SIMBOLOSLa 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.
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.
NECESIDAD DE LA TABLA DE SIMBOLOSLos 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.
EJEMPLOExpresión:
Fuerza = Masa * Aceleración<id,1> < = > <id,2> < * > <id,3>
ID TOKENS
1 Fuerza
2 Masa
3 Aceleración
TOKEN 1 : FuerzaTOKEN 2 : =TOKEN 3 : MasaTOKEN 4 : * TOKEN 5 : Aceleración
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.
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.
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:
Funciones hash inyectivas
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.
Funciones hash uniformesFunciones
Algunos valores de la función hash de multiplicación que utiliza Φ=∏y m=25. Se resaltan las colisiones.
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.
Otras funciones hashEsta 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
Factor de cargaUn 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.
Solución de las colisionesPuesto 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
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
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
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.
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.
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.
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.
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.