Acceso a clase
[PL2.git] / ResNom.g
index 044785e..41eb746 100644 (file)
--- a/ResNom.g
+++ b/ResNom.g
@@ -18,6 +18,7 @@ options{
        Tabla_Global t;
        TablaModulos mods;
        AST importaciones = null;
+       String nombre_modulo = "";
        Hashtable<String,String> declaraciones = new Hashtable<String,String>();
        
        void resolver_identificadores_tipo(){
@@ -28,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){
@@ -69,19 +70,37 @@ 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.getType() == ERROR ){
+               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){
@@ -134,8 +153,10 @@ options{
        }
 }
 
-declaracion_modulo [Tabla_Global tab, TablaModulos m, Hashtable d]:
-{t = tab;
+declaracion_modulo [String nombre, Tabla_Global tab, TablaModulos m, Hashtable d]:
+{
+       nombre_modulo = nombre;
+       t = tab;
        declaraciones = d;
        mods = m;
        averiguar_importaciones();
@@ -274,7 +295,7 @@ acceso_objeto [AST arbol] : a:IDENT {#acceso_objeto = resolver_acceso_objeto(arb
 acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso)
 ;
 
-declaracion_acceso: declaracion_modulo[t, mods, declaraciones]
+declaracion_acceso: declaracion_modulo[nombre_modulo, t, mods, declaraciones]
 | declaracion_clase
 | declaracion_elemento_clase
 | declaracion_parametro