Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Grupo 24
Índice
Tabla de símbolos
Gestión de errores
Conclusiones
Bibliografía
Fases del compilador
En la primera fase del compilador, que se corresponde con la primera entrega del 14 de
Mayo, empezamos a implementar la parte correspondiente a la tabla de símbolos. En
nuestro caso ibamos realizando la implementación de las clases y métodos según
avanzabamos y fueramos necesitando nuevos métodos que al principio no conociamos.
package proyectocompiladorvb;
import java.util.*;
- t: tabla hash (se utiliza la clase Hashtable disponible en las librerías de java) en la que
almacenaremos las entradas de la tabla de símbolos.
- tam_locales: valor de tipo entero que indica el número de bytes que ocupan las
variables locales el ámbito actual.
- tam_param: valor de tipo entero que indica el número de bytes que ocupan los
parámetros del ámbito actual.
Los métodos implementados para acceder a a la tabla de símbolos son:
- boolean esta(String s): devuelve TRUE si en la tabla de símbolos existe una entrada
cuyo campo lexema coincide con la cadena pasada como parámetro. En caso contrario
devuelve FALSE.
public entrada(String l, tipos tip, String tvar, String tacc){lexema=l; tipo=tip; tipovar =
tvar; tipoacceso = tacc;}
public String lex() {return lexema;}
public tipos obtener_tipo(){return tipo;}
public String obtener_tipovar(){return tipovar;}
public String obtener_tipoacceso(){return tipoacceso;}
};
-tipoacceso: cadena de carácteres que indica los posibles modificadores del elemento.
- entrada(String l, tipos tip, String tvar, String tacc) constructor, crea una nueva entrada
inicializando sus atributos con los valores pasados como parámetros.
Partiendo de esta clase implementamos cada tipo del lenguaje con una clase que hereda
de tipos e implementa los métodos abstractos estipo y esigual según la característica del
tipo implementado. Además las clases correspondientes a los tipos del lenguaje pueden
implementar otros métodos específicos del tipo.
- t_array:
public class t_array extends tipos{
private tipos elemento;
public t_array(tipos el){elemento=el;};
public String estipo(){return "array";}
public tipos elementos(){return elemento;}
public boolean esigual(tipos t){if (t.estipo().equals("array")) return
(((t_array)t ).elementos().esigual(elemento));else return false;}
};
-t_entero:
public class t_entero extends tipos{
public t_entero(){;};
public String estipo(){return "entero";}
public boolean esigual(tipos t){return (t.estipo().equals("entero"));}
};
- t_char:
public class t_char extends tipos{
public t_char(){;};
public String estipo(){return "char";}
public boolean esigual(tipos t){return (t.estipo().equals("char"));}
};
- t_logico:
public class t_logico extends tipos{
public t_logico(){;};
public String estipo(){return "booleano";}
public boolean esigual(tipos t){return (t.estipo().equals("booleano"));}
};
- t_puntero:
public class t_puntero extends tipos{
tipos elemento;
public t_puntero(tipos el){elemento=el;};
public String estipo(){return "puntero";}
public tipos elementos(){return elemento;}
public boolean esigual(tipos t){if (t.estipo().equals("puntero")) return
(((t_puntero)t ).elementos().esigual(elemento));else return false;}
};
- t_func:
public class t_func extends tipos{
private listatipos parametros;
private tipos tiporetorno;
- t_proc:
public class t_proc extends tipos{
private listatipos parametros;
- t_enumerado:
public class t_enumerado extends tipos{
private int tam = 2;
public int tamano() {return tam;}
public t_enumerado(){;};
public String estipo(){return "enumerado";}
public boolean esigual(tipos t){return (t.estipo().equals("enumerado"));}
};
- t_interfaz:
public class t_interfaz extends tipos{
public t_interfaz(){;};
public String estipo(){return "interfaz";}
public boolean esigual(tipos t){return (t.estipo().equals("interfaz"));}
};
- t_estructura:
public class t_estructura extends tipos{
public t_estructura(){;};
public String estipo(){return "estructura";}
public boolean esigual(tipos t){return (t.estipo().equals("estructura"));}
};
- t_error:
public class t_error extends tipos{
public t_error(){;};
public String estipo(){return "error";}
public boolean esigual(tipos t){ return (t.estipo().equals("error"));}
};
- t_vacio:
public class t_vacio extends tipos{
public t_vacio(){;};
public String estipo(){return "vacio";}
public boolean esigual(tipos t){return (t.estipo().equals("vacio"));}
};
Para gestionar y acceder a las tablas de símbolos que se crean en los diferentes ámbitos
utilizamos una pila de tablas implementada en la clase pila_tablas:
import java.util.Stack;
public class pila_tablas {
Stack p_tablas;
Para implementar la pila de tablas hemos utilizado la clase Stack disponible en las
librerías de JAVA.
Gestión de errores
if ($$.tipo.estipo()!= "error")
{
aux = nueva_temp_int(ptablas.cima());
Primero creamos una variable temporal aux y realizamos un If..elseif, puesto que
tenemos que tener en cuenta el operador binario que corresponda en cada caso.
{ if ($3.tipo.estipo() == "booleano")
{$$.tipo = new t_vacio() lc.generar(GOTO,
$2.cuad,-,-);
$3.verdad.rellenar($5.cuad);
$6.sig.rellenar($2.cuad);
$6.cont.rellenar($2.cuad); $
$.sig=mezclar($3.falso,$6.bk);
}
else
{
system.out.println("Error,expresion no lógica");
$$.tipo= new t_error();
}
}
|THROW Terminador_sentencia
{$$.sig.crear_lista(sigcuad(lcuadr));
lcuadr.generar(GOTO, , , );
$$.throu =TRUE;
$$.tipo = NULL;
};
;
En primer lugar hemos creado una lista de cuadruplas y después hemos generado un
GOTO. Al tener en el primer caso asociado una expresión hemos puesto el atributo
throu a TRUE y le hemos pasado el tipo.
if ($3.tipo == $4.l_catch.elem(i).get_tipo().estipo())
{ $3.sig.rellenar($4.l_catch.elem(i).get_cuad()); break;}
else if ($4.l_catch.elem(i).get_tipo() == NULL)
{ $3.sig.rellenar($4.l_catch.elem(i).get_cuad()); break;}
i++;
}
while (i <= $4.l_catch.num_elem());
if (i == ($4.l_catch.num_elem() + 1))
{
$$.throu = $3.throu; $$.tipo = $3.tipo; $$.sig = $3.sig;
}
}
Si es una única sentencia catch, se crea la lista catch y se inserta la nueva pareja de
valores con la cuadrupla correspondiente y el tipo de catch, que luego usaremos para
realizar correspondencias con el Try.
Si se trata por el contrario de una lista ya creada de sentencias, lo que se hace es añadir a
la lista de catch ya creada anteriormente.
Sentencia_catch:
CATCH ID AS Nombre_tipo WHEN Expresion_booleana Terminador_sentencia M
Bloque
{
if (pila_tablas.cima().esta($2.lex)) {$$.tipo = $4.tipo; $$.cuad = $8.cuad;}
else
{
system.out.println(“Error,id no declarado”);
$$.tipo= new t_error();
}
}
En la primera opción, aparte de mirar si existe el Id, lo que se realiza es pasar el tipo del
identificador y la cuadrupla correspondiente. En todos los demás casos se realiza de
igual forma, con la salvedad de que cuando no existe Id, el tipo se pone a Null.
"The Microsoft Visual Basic Language Specification Version 9.0" Paul Vick
Microsoft Corporation