Lab 5 (Symbol Table)¶
En este laboratorio aprenderán a implementar una tabla de símbolos como la que usarán en la fase 3 del proyecto.
1. Introducción¶
Han terminado las primeras 2 fases de su proyecto y ahora es donde empieza la verdadera batalla contra el dragón. En la fase 3 se encargarán de hacer el análisis semántico del compilador, es decir, deberán asignar un tipo a cada nodo del árbol generado en la fase 2 y así terminar de capturar cualquier error o inconsistencia en el código o programa a compilar. Para realizar esta fase, ustedes deben implementar una tabla de símbolos en donde guardarán todas las variables declaradas para validar su existencia en base a su scope, y poder asignar un tipo a cada una.
Para iniciar, ejecuten el comando para generar los archivos necesarios:
make -f /usr/class/cc4/assignments/PA3/Makefile
2. Tabla de Símbolos¶
Estos son los archivos necesarios para implementar la fase 3 del proyecto, pero por ahora nos enfocaremos únicamente en SymtabExample.java. Noten que este archivo contiene un ejemplo de como funciona la tabla de símbolos:
// se crea la tabla de sibolos. SymbolTable map = new SymbolTable(); // se crea un nuevo AbstractSymbol AbstractSymbol fred = AbstractTable.stringtable.addString("Fred"); // se agrega un nuevo scope a la tabla. Notese que al crear la tabla, esta no contiene ningun scope map.enterScope(); // se agrega el simbolo a la tabla junto con un valor map.addId(fred, new Integer(22)); // busca y devuelve el valor asociado al simbolo en el scope actual, si no lo encuentra, devuelve null map.probe(fred) // busca y devuelve el valor asociado al simbolo en todos los scopes, si no lo encuentra, devuelve null map.lookup(fred) // elimina el ultimo scope creado. map.exitScope();
La tabla de símbolos (SymbolTable.java), en su implementación utiliza un stack para los scopes, y adicional al ejemplo que tienen en el archivo, estos son los métodos que contiene la clase:
// un constructor sin parametros que inicializa la tabla public SymbolTable() // agrega un nuevo scope a la tabla, en forma de una HashTable public void enterScope() // elimina el ultimo scope agregado public void exitScope() // agrega una entrada a la tabla en el scope mas reciente public void addId(AbstractSymbol id, Object info) // busca y devuelve el valor del simbolo. Busca unicamente en el scope mas reciente public Object probe(AbstractSymbol sym) // busca en todos los scopes de la tabla. Devuelve el valor del simbolo mas reciente que encontro public Object lookup(AbstractSymbol sym) // devuelve un String que representa la tabla public String toString()
Vean que las entradas de la tabla de símbolos son pares (Key,Value), donde la llave es de tipo AbstractSymbol y el valor es de tipo Object. En este laboratorio, para simplificar la calificación, ingresaremos únicamente valores de tipo String.
Ahora que se han familiarizado un poco con la tabla de símbolos, es hora de modificar el archivo SymtabExample.java. Agreguen a este un menú en el que se puedan realizar las siguientes operaciones:
- Agregar Símbolo
- Agregar Scope
- Borrar Scope
- Buscar en el scope actual (devolver el valor almacenado con el símbolo)
- Buscar en cualquier scope (devolver el valor almacenado con el símbolo)
- Comparar el valor de 2 simbolos diferentes
- Imprimir tabla de símbolos
- Salir
Para compilar su programa deben de hacer lo siguiente:
make symtab-example
Para ejecutarlo:
./symtab-example
Una vez terminado todo, envíen al GES un archivo .zip conteniendo únicamente el archivo SymtabExample.java