Acceso a clase
[PL2.git] / ResNom.g
index 5f03368..41eb746 100644 (file)
--- a/ResNom.g
+++ b/ResNom.g
@@ -1,7 +1,7 @@
 header{
        import java.util.*; 
-       import antlr.ASTFactory;
-       
+       import antlr.ASTFactory;        
+       import java.util.Hashtable;
 }
 
 class ResNom extends TreeParser;
@@ -10,11 +10,16 @@ options{
        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;
@@ -24,10 +29,12 @@ options{
                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");
                        }
                }
        }
@@ -43,12 +50,18 @@ options{
                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
@@ -56,6 +69,75 @@ options{
                
                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);}
@@ -71,8 +153,13 @@ options{
        }
 }
 
-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);
 
@@ -110,7 +197,7 @@ declaraciones_elementos_clase : (declaracion_elemento_clase)* ;
 
 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 ;
@@ -129,7 +216,7 @@ definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locale
 
 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;
 
@@ -200,19 +287,23 @@ expresion:
 ;
 
 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)+;
@@ -221,7 +312,7 @@ tipo :
 tipo_predefinido_simple
 | tipo_predefinido_compuesto
 | declaracion_error
-| IDENT
+| i:IDENT {#tipo = declaracion_tipo(#i);}
 ;
 
 tipo_predefinido_simple :