Acceso a clase master
authordanigm <danigm@arch_box>
Thu, 24 Apr 2008 16:14:06 +0000 (18:14 +0200)
committerdanigm <danigm@arch_box>
Thu, 24 Apr 2008 16:14:06 +0000 (18:14 +0200)
Anasint.g
Modulo.java
Principal.java
ResNom.g
TablaModulos.java
p1.mod
p1.res
p2.mod
p3.mod

index 45f4501..010d16e 100755 (executable)
--- a/Anasint.g
+++ b/Anasint.g
@@ -430,7 +430,7 @@ lista_nombres_variables_locales [AST t] :
  
 nombre_variable_local! [AST t] : 
    i:IDENT 
-   { #nombre_variable_local = crear_declaracion_variable_local(#i,#t); }
+   { #nombre_variable_local = crear_declaracion_variable_local(#i,#t);}
    ;
    
 ///////////////////////////////////////////////////////////
index a0468ed..e0ced5d 100644 (file)
@@ -6,6 +6,7 @@ public class Modulo {
        String nombre;
        AST exportacion;
        AST importacion;
+    AST implementacion;
        
        public Modulo(String nombre, AST arbol){
                this.nombre = nombre;
@@ -22,6 +23,10 @@ public class Modulo {
                                ASTFactory f = new ASTFactory();
                                this.importacion = f.dupTree(t);
                        }
+                       if(t.getText().equals("implementacion")){
+                               ASTFactory f = new ASTFactory();
+                               this.implementacion = f.dupTree(t);
+                       }
                        t = t.getNextSibling();
                }
        }
@@ -47,6 +52,17 @@ public class Modulo {
                }
                return arbol;
        }
+       
+       public AST getDeclaracion_interna(String nombre){
+               AST arbol = implementacion.getFirstChild();
+               while(!arbol.getFirstChild().getText().equals(nombre)){
+                       arbol = arbol.getNextSibling();
+                       if (arbol == null)
+                               break;
+               }
+               return arbol;
+       }
+       
        public AST getImportacion(){
                return importacion;
        }
index 3b8932b..e43f76b 100755 (executable)
@@ -88,12 +88,12 @@ public class Principal {
                                }
                                System.out.println("RN modulo: " + nombre_modulo);
                                Auxiliar aux = tab.get(nombre_modulo);
-                               resnom.declaracion_modulo(arbol.get(nombre_modulo), aux.t, mods, aux.declaraciones);
+                               resnom.declaracion_modulo(arbol.get(nombre_modulo), nombre_modulo, aux.t, mods, aux.declaraciones);
                                arbol.put(nombre_modulo, resnom.getAST());
                                
                                
                        }
-                       ASTFrame frame = new ASTFrame("nombre", arbol.get("p2.mod"));
+                       ASTFrame frame = new ASTFrame("nombre", arbol.get("p1.mod"));
                        frame.setSize(600, 600);
                        frame.setVisible(true);
                        
@@ -106,4 +106,4 @@ public class Principal {
                        System.err.println("No se encontro el fichero");
                }
        }
-}
\ No newline at end of file
+}
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
index 87c6cdb..f1c0ce9 100644 (file)
@@ -57,4 +57,18 @@ public class TablaModulos {
                }
                return null;
        }
+       public AST Declaracion_interna(String nombre, String modulo){
+               ListIterator<Modulo> li = modulos.listIterator();
+               Modulo mod;
+               while(li.hasNext()){
+                       mod = li.next();
+                       if(mod.getNombre().equals(modulo)){
+                               //modulo encontrado, ahora a buscar la declaracion
+                               if(mod.getDeclaracion_interna(nombre) != null){
+                                       return mod.getDeclaracion_interna(nombre);
+                               }else return null;
+                       }
+               }
+               return null;
+       }
 }
diff --git a/p1.mod b/p1.mod
index ee9ff7a..217d90e 100755 (executable)
--- a/p1.mod
+++ b/p1.mod
@@ -1,22 +1,34 @@
-modulo p1\r
-importacion: p2\r
-exportacion:\r
-   clase Programa1\r
-   {\r
-      inicio()\r
-      {\r
-         entero i;\r
-         entero j;\r
-         M obj;\r
-         \r
-         obj := crear(M);\r
-         i:=1;\r
-         mientras (i<=10) hacer\r
-            obj.modificar(i);\r
-            j := obj.consultar();\r
-            escribir(j);\r
-            i:=i+1;\r
-         finmientras      \r
-       }   \r
-   }\r
-implementacion:    \r
+modulo p1
+importacion: p2
+exportacion:
+   clase Programa1
+   {
+      oculto entero i;
+      
+      inicio()
+      {
+         Clase1 j;
+         M obj;
+         
+         obj := crear(M);
+         i:=1;
+         mientras (i<=10) hacer
+            obj.modificar(i);
+            j := obj.consultar();
+            escribir(j);
+            i:=i+Clase1.valor;
+         finmientras      
+       }   
+   }
+   
+   
+implementacion:    
+   clase Clase1
+   {
+      entero valor;
+      
+      consultar() dev entero
+      {
+         dev valor;      
+      }   
+   }
\ No newline at end of file
diff --git a/p1.res b/p1.res
index 52fde01..6692ff1 100644 (file)
--- a/p1.res
+++ b/p1.res
@@ -1,15 +1,21 @@
 MODULO: p1
 --CLASE: Programa1
+----ATRIBUTO: i
 ----METODO: inicio
+------IDENTIFICADOR TIPO: Clase1
 ------IDENTIFICADOR TIPO: M
 ------ACCESO SIMPLE: obj (variable_local)
-------ACCESO SIMPLE: M------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: M------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: i (atributo)
 ------ACCESO SIMPLE: obj (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: i (atributo)
 ------ACCESO SIMPLE: j (variable_local)
 ------ACCESO SIMPLE: obj (variable_local)
 ------ACCESO SIMPLE: j (variable_local)
 ------IDENTIFICADOR TIPO: j
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: Clase1--CLASE: Clase1
+----ATRIBUTO: valor
+----METODO: consultar
+------ACCESO SIMPLE: valor (atributo)
diff --git a/p2.mod b/p2.mod
index d7efd38..4997038 100755 (executable)
--- a/p2.mod
+++ b/p2.mod
@@ -1,33 +1,29 @@
-modulo p2\r
-importacion: p3\r
-exportacion:\r
-   inst clase M\r
-   {\r
-      oculto C a;\r
-      \r
-      consultar() dev C\r
-      {\r
-         formacion 10, 13 entero k;\r
-         dev a;      \r
-      }   \r
-      \r
-      modificar(entero i)\r
-      {\r
-         a.modificar(i);\r
-      } \r
-   }\r
-implementacion:    \r
-   inst clase C\r
-   {\r
-      entero valor;\r
-      \r
-      consultar() dev entero\r
-      {\r
-         dev valor;      \r
-      }   \r
-      \r
-      oculto modificar(entero i)\r
-      {\r
-         valor:=i;\r
-      } \r
-   }\r
+modulo p2
+importacion: p3
+exportacion:
+   inst clase M
+   {
+      oculto C a;
+      
+      consultar() dev C
+      {
+         formacion 10, 13 entero k;
+         dev a;      
+      }   
+      
+      modificar(entero i)
+      {
+         a.modificar(i);
+      } 
+   }
+   
+   clase D
+   {
+               oculto Elemento e;
+               
+               modificar(entero e)
+               {
+                       e.modificar(e);
+               }
+   }
+implementacion:    
diff --git a/p3.mod b/p3.mod
index 09c09d1..80b5472 100755 (executable)
--- a/p3.mod
+++ b/p3.mod
@@ -1,9 +1,9 @@
 modulo p3\r
-\r
+importacion: p1\r
 exportacion:\r
    clase Elemento\r
    {\r
-      imprimirMensaje(entero e)\r
+      ampramarMensaje(entero e)\r
       {\r
        escribir(e);\r
       }\r