Ahora están resueltos los accesos a objetos....
authordanigm <>
Thu, 3 Apr 2008 19:42:04 +0000 (21:42 +0200)
committerdanigm <>
Thu, 3 Apr 2008 19:42:04 +0000 (21:42 +0200)
Pero no me ha dado tiempo a hacerlo en clase, me ha faltado una hora más...

Anasint.g
Auxiliar.java [new file with mode: 0644]
Principal.java
ResNom.g
p1.mod [new file with mode: 0755]
p1.res
p2.mod [new file with mode: 0755]
p3.mod [new file with mode: 0755]
pila2.mod
programa.cfg [new file with mode: 0755]

index 23f3e0a..45f4501 100755 (executable)
--- a/Anasint.g
+++ b/Anasint.g
@@ -51,6 +51,7 @@ tokens{
        int margen = 0;
        Pila_Ambitos pilaambitos = new Pila_Ambitos();
        Tabla_Global t = new Tabla_Global();
+       Hashtable<String,String> declaraciones = new Hashtable<String,String>();
 
        LinkedList<Simbolo_no_resuelto> no_resueltos = new LinkedList<Simbolo_no_resuelto>();
        
@@ -119,6 +120,7 @@ tokens{
        }
        
        AST crear_declaracion_atributo (AST nombre_atributo, AST tipo_atributo, AST cualificador_atributo){
+               declaraciones.put(nombre_atributo.getText(), tipo_atributo.getText());
        String a = nombre_atributo.getText();
        AST A = #(#[ATRIBUTO,"atributo"], nombre_atributo, tipo_atributo, cualificador_atributo);
        Simbolo S = new Simbolo(a, A);
@@ -128,6 +130,7 @@ tokens{
 
        AST crear_declaracion_parametro (AST nombre_parametro, AST tipo_parametro){
                String p = nombre_parametro.getText();
+               declaraciones.put(nombre_parametro.getText(), tipo_parametro.getText());
                AST P = #(#[PARAMETRO,"parametro"], nombre_parametro, tipo_parametro);
                Simbolo S = new Simbolo(p, P);
                pilaambitos.ambito_actual().setDeclaracion(S);
@@ -138,6 +141,7 @@ tokens{
        
        AST crear_declaracion_variable_local (AST nombre_variable, AST tipo_variable){
                String v = nombre_variable.getText();
+               declaraciones.put(nombre_variable.getText(), tipo_variable.getText());
                AST V = #(#[VARIABLE_LOCAL,"variable_local"], nombre_variable, tipo_variable);
                Simbolo S = new Simbolo(v, V);
                pilaambitos.ambito_actual().setDeclaracion(S);
@@ -252,7 +256,7 @@ tokens{
 // DECLARACION DE MODULO          
 /////////////////////////////////////////////////////////
  
-declaracion_modulo![String f] returns [Tabla_Global tab=null] :
+declaracion_modulo![String f] returns [Auxiliar tab=null] :
    {
        ambito_abrir_programa();
        log = new logFile(f);
@@ -271,7 +275,7 @@ declaracion_modulo![String f] returns [Tabla_Global tab=null] :
     ambito_cerrar_programa();
     log.decNivel();
     log.close();
-   tab = t;}
+    tab = new Auxiliar(t, declaraciones);}
    ;
  
 nombre_modulo : MODULO! IDENT ;
diff --git a/Auxiliar.java b/Auxiliar.java
new file mode 100644 (file)
index 0000000..4c8249a
--- /dev/null
@@ -0,0 +1,14 @@
+import java.util.Hashtable;
+
+
+public class Auxiliar {
+       Tabla_Global t = null;
+       Hashtable<String,String> declaraciones = null;
+       
+       public Auxiliar(Tabla_Global t, Hashtable<String,String> declaraciones) {
+               this.t = t;
+               this.declaraciones = declaraciones;
+       }
+       
+       
+}
index 0873c46..3b8932b 100755 (executable)
@@ -60,7 +60,7 @@ public class Principal {
                        Anasint anasint;
                        String nombre_modulo;
                        Hashtable<String, AST> arbol = new Hashtable<String, AST>();
-                       Hashtable<String, Tabla_Global> tab = new Hashtable<String, Tabla_Global>();
+                       Hashtable<String, Auxiliar> tab = new Hashtable<String, Auxiliar>();
                        
                        while(li.hasNext()){
                                nombre_modulo = li.next();
@@ -87,13 +87,15 @@ public class Principal {
                                        System.out.println("Referencia ciclica: " + refciclica);
                                }
                                System.out.println("RN modulo: " + nombre_modulo);
-                               resnom.declaracion_modulo(arbol.get(nombre_modulo), tab.get(nombre_modulo), mods);
+                               Auxiliar aux = tab.get(nombre_modulo);
+                               resnom.declaracion_modulo(arbol.get(nombre_modulo), aux.t, mods, aux.declaraciones);
                                arbol.put(nombre_modulo, resnom.getAST());
                                
-                               //ASTFrame frame = new ASTFrame(nombre_modulo, arbol.get(nombre_modulo));
-                               //frame.setSize(600, 600);
-                               //frame.setVisible(true);
+                               
                        }
+                       ASTFrame frame = new ASTFrame("nombre", arbol.get("p2.mod"));
+                       frame.setSize(600, 600);
+                       frame.setVisible(true);
                        
                        
                        //anasem.declaracion_modulo(arbol);
index be3ce98..044785e 100644 (file)
--- a/ResNom.g
+++ b/ResNom.g
@@ -1,6 +1,7 @@
 header{
        import java.util.*; 
        import antlr.ASTFactory;        
+       import java.util.Hashtable;
 }
 
 class ResNom extends TreeParser;
@@ -9,6 +10,7 @@ options{
        buildAST = true;
        importVocab=Analex;
        importVocab=Anasint;
+       
 }
 
 {
@@ -16,6 +18,7 @@ options{
        Tabla_Global t;
        TablaModulos mods;
        AST importaciones = null;
+       Hashtable<String,String> declaraciones = new Hashtable<String,String>();
        
        void resolver_identificadores_tipo(){
                Identificador_Tipo elemento;
@@ -65,6 +68,51 @@ options{
                
                return dec;
        }
+       AST resolver_acceso_objeto(AST arbol, AST ident){
+               AST as = arbol.getFirstChild();
+               
+               Hashtable<String,String> xx = declaraciones;
+               String tipo = declaraciones.get(as.getText());
+               
+               AST arbol2 = declaracion_tipo(#(#[IDENT, tipo]));
+               if (arbol2.getType() == ERROR)
+                       arbol2 = mods.Declaracion(tipo, importaciones);
+               
+               if (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;
@@ -86,8 +134,9 @@ options{
        }
 }
 
-declaracion_modulo [Tabla_Global tab, TablaModulos m]:
+declaracion_modulo [Tabla_Global tab, TablaModulos m, Hashtable d]:
 {t = tab;
+       declaraciones = d;
        mods = m;
        averiguar_importaciones();
        resolver_identificadores_tipo();}
@@ -127,7 +176,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 ;
@@ -146,7 +195,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;
 
@@ -217,19 +266,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, mods]
+declaracion_acceso: declaracion_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)+;
diff --git a/p1.mod b/p1.mod
new file mode 100755 (executable)
index 0000000..ee9ff7a
--- /dev/null
+++ b/p1.mod
@@ -0,0 +1,22 @@
+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
diff --git a/p1.res b/p1.res
index e69de29..52fde01 100644 (file)
--- a/p1.res
+++ b/p1.res
@@ -0,0 +1,15 @@
+MODULO: p1
+--CLASE: Programa1
+----METODO: inicio
+------IDENTIFICADOR TIPO: M
+------ACCESO SIMPLE: obj (variable_local)
+------ACCESO SIMPLE: M------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: obj (variable_local)
+------ACCESO SIMPLE: i (variable_local)
+------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)
diff --git a/p2.mod b/p2.mod
new file mode 100755 (executable)
index 0000000..d7efd38
--- /dev/null
+++ b/p2.mod
@@ -0,0 +1,33 @@
+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
diff --git a/p3.mod b/p3.mod
new file mode 100755 (executable)
index 0000000..09c09d1
--- /dev/null
+++ b/p3.mod
@@ -0,0 +1,11 @@
+modulo p3\r
+\r
+exportacion:\r
+   clase Elemento\r
+   {\r
+      imprimirMensaje(entero e)\r
+      {\r
+       escribir(e);\r
+      }\r
+   }\r
+implementacion:    \r
index 7df27b6..996b8cd 100644 (file)
--- a/pila2.mod
+++ b/pila2.mod
@@ -61,6 +61,7 @@ clase Programa
          TipoErr k;                               // ERROR tipo no declarado
          entero i;
          p := crear(Pila);
+         escribir(Pila);
          p.iniciar();
          i := p.cima; 
          i := Pila; //ERROR
diff --git a/programa.cfg b/programa.cfg
new file mode 100755 (executable)
index 0000000..35c31ed
--- /dev/null
@@ -0,0 +1,3 @@
+p1.mod;\r
+p2.mod;\r
+p3.mod;
\ No newline at end of file