header{
import java.util.*;
- import antlr.ASTFactory;
-
+ import antlr.ASTFactory;
+ import java.util.Hashtable;
}
class ResNom extends TreeParser;
buildAST = true;
importVocab=Analex;
importVocab=Anasint;
+
}
{
LinkedList<String> leas = new LinkedList<String>();
Tabla_Global t;
+ TablaModulos mods;
+ AST importaciones = null;
+ String nombre_modulo = "";
+ Hashtable<String,String> declaraciones = new Hashtable<String,String>();
void resolver_identificadores_tipo(){
Identificador_Tipo elemento;
ListIterator<Identificador_Tipo> li = i.listIterator();
while(li.hasNext()){
elemento = (Identificador_Tipo) li.next();
- nombre = elemento.getNombre();
- if(t.ambitomodulo.getDeclaracion(nombre) == null){
+ nombre = elemento.getNombre();
+
+ if(t.ambitomodulo.getDeclaracion(nombre) == null &&
+ mods.Declaracion(nombre, importaciones) == null){
//identificador de tipo no declarado
- System.out.println("ERROR RN: identificador " + nombre + " no declarado");
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+elemento.getLinea()+"): identificador '" + nombre + "' no declarado");
}
}
}
Simbolo sim;
AST dec = #(#[ERROR, "error"]);
//comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
- if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null){
- //acceso simple no declarado
- if(!leas.contains(numero)){
- System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
- leas.add(numero);
+ //Hace falta mirar en los modulos, para el crear
+ if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null ){
+ if (mods.Declaracion(nom, importaciones) != null){
+ dec = mods.Declaracion(nom, importaciones);
}
+ //acceso simple no declarado
+ else
+ if(!leas.contains(numero)){
+ //System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+acc.getLinea()+"): acceso simple '" + nom + "' no declarado");
+ leas.add(numero);
+ }
}
else {
dec = sim.getDeclaracion(); //referencia adelantada
return dec;
}
+ AST resolver_acceso_objeto(AST arbol, AST ident){
+ String raiz, accs;
+ raiz = arbol.getFirstChild().getText();
+ accs = ident.getText();
+
+ AST as = arbol.getFirstChild();
+
+ Hashtable<String,String> xx = declaraciones;
+ String tipo = declaraciones.get(as.getText());
+ AST arbol2 = declaracion_tipo(#(#[IDENT, tipo]));
+ if (tipo == null){
+ System.out.println("DEBUG: Acceso a Clase No instanciable " + arbol.getFirstChild().getText());
+ String nombre = arbol.getFirstChild().getText();
+ arbol2 = mods.Declaracion_interna(nombre, nombre_modulo);
+ if (arbol2 == null)
+ arbol2 = mods.Declaracion(arbol.getFirstChild().getText(), importaciones);
+ }
+
+ if (arbol2 == null){
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
+ return #(#[ERROR,"error"]);
+ }
+
+ if (arbol2.getType() == ERROR)
+ arbol2 = mods.Declaracion(tipo, importaciones);
+
+ if (arbol2 == null || arbol2.getType() == ERROR){
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
+ return #(#[ERROR,"error"]);
+ }
+
+
+ arbol2 = arbol2.getFirstChild().getNextSibling().getNextSibling();
+ while(arbol2 != null){
+ if(arbol2.getType() == ATRIBUTO){
+ AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling();
+ if(arbol2.getFirstChild().getText().equals(ident.getText())){
+ if (visibilidad.getType() != OCULTO){
+ return arbol2;
+ }
+ else{
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible");
+ return #(#[ERROR,"error"]);
+ }
+ }
+ }
+ else if (arbol2.getType() == METODO){
+ AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling();
+ if(arbol2.getFirstChild().getFirstChild().getText().equals(ident.getText())){
+ if (visibilidad.getType() != OCULTO){
+ return arbol2;
+ }
+ else{
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible");
+ return #(#[ERROR,"error"]);
+ }
+ }
+ }
+ arbol2 = arbol2.getNextSibling();
+ }
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
+ return #(#[ERROR,"error"]);
+ }
+
+ void averiguar_importaciones() {
+ Ambito a = t.ambitomodulo;
+ Modulo mx = mods.get(a.getNombre());
+ importaciones = mx.getImportacion();
+ }
//con esta funcion se podrian poner la clases
//tipo: i:IDENT {#tipo = declaracion_tipo(#i);}
}
}
-declaracion_modulo [Tabla_Global tab]:
-{t = tab;
+declaracion_modulo [String nombre, Tabla_Global tab, TablaModulos m, Hashtable d]:
+{
+ nombre_modulo = nombre;
+ t = tab;
+ declaraciones = d;
+ mods = m;
+ averiguar_importaciones();
resolver_identificadores_tipo();}
#(MODULO nombre_modulo definicion_modulo);
declaracion_elemento_clase :
#(METODO declaracion_metodo cualificador_elemento_clase)
-| #(ATRIBUTO IDENT tipo cualificador_elemento_clase)
+| #(ATRIBUTO i:IDENT t:tipo cualificador_elemento_clase)
;
cualificador_elemento_clase: OCULTO | VISIBLE ;
declaracion_variables_locales : (declaracion_variable_local)* ;
-declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) ;
+declaracion_variable_local : #(VARIABLE_LOCAL i:IDENT t:tipo) ;
declaracion_error : ERROR;
;
acceso : acceso_simple
-| #(ACCESO_OBJETO acceso_simple a:IDENT);
+| #(ACCESO_OBJETO as:acceso_simple acceso_objeto[#as])
+;
+
+acceso_objeto [AST arbol] : a:IDENT {#acceso_objeto = resolver_acceso_objeto(arbol, #a);};
-acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso)
+acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso)
;
-declaracion_acceso: declaracion_modulo[t]
+declaracion_acceso: declaracion_modulo[nombre_modulo, t, mods, declaraciones]
| declaracion_clase
| declaracion_elemento_clase
| declaracion_parametro
| declaracion_variable_local
| declaracion_error
| i:LIT_ENTERO
-{#declaracion_acceso = resolver_acceso_simple(i.getText());}
+{#declaracion_acceso = resolver_acceso_simple(i.getText());
+}
;
lista_expresiones_nv : (expresion)+;
tipo_predefinido_simple
| tipo_predefinido_compuesto
| declaracion_error
-| IDENT
+| i:IDENT {#tipo = declaracion_tipo(#i);}
;
tipo_predefinido_simple :