Acceso a clase
[PL2.git] / ResNom.g
index 05ab61e..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,6 +10,7 @@ options{
        buildAST = true;
        importVocab=Analex;
        importVocab=Anasint;
+       
 }
 
 {
@@ -17,6 +18,8 @@ options{
        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;
@@ -26,7 +29,7 @@ options{
                ListIterator<Identificador_Tipo> li = i.listIterator();
                while(li.hasNext()){
                        elemento = (Identificador_Tipo) li.next();
-                       nombre = elemento.getNombre();
+                       nombre = elemento.getNombre();  
                 
                        if(t.ambitomodulo.getDeclaracion(nombre) == null &&
                        mods.Declaracion(nombre, importaciones) == null){
@@ -66,6 +69,69 @@ 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;
@@ -87,8 +153,11 @@ options{
        }
 }
 
-declaracion_modulo [Tabla_Global tab, TablaModulos m]:
-{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();}
@@ -128,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 ;
@@ -147,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;
 
@@ -218,19 +287,23 @@ expresion:
 ;
 
 acceso : acceso_simple
-| #(ACCESO_OBJETO acceso_simple a:IDENT);
+| #(ACCESO_OBJETO as:acceso_simple acceso_objeto[#as])
+;
 
-acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso)
+acceso_objeto [AST arbol] : a:IDENT {#acceso_objeto = resolver_acceso_objeto(arbol, #a);};
+
+acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso)
 ;
 
-declaracion_acceso: declaracion_modulo[t, mods]
+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)+;
@@ -239,7 +312,7 @@ tipo :
 tipo_predefinido_simple
 | tipo_predefinido_compuesto
 | declaracion_error
-| IDENT
+| i:IDENT {#tipo = declaracion_tipo(#i);}
 ;
 
 tipo_predefinido_simple :