Referencias ciclicas mostradas
authordanigm <>
Mon, 31 Mar 2008 18:07:34 +0000 (20:07 +0200)
committerdanigm <>
Mon, 31 Mar 2008 18:07:34 +0000 (20:07 +0200)
Modulo.java
Principal.java
ResNom.g
ejemplo.cfg
elemento.mod
elemento2.mod [new file with mode: 0644]
pila.mod
pila2.mod [new file with mode: 0644]

index 2e9c04b..a0468ed 100644 (file)
@@ -50,4 +50,50 @@ public class Modulo {
        public AST getImportacion(){
                return importacion;
        }
+       
+       public String referenciaCiclica(TablaModulos mods){
+               String ref = "";
+               String ref2 = "";
+               AST arbol = null;
+               String minombre =nombre;
+               if(importacion != null)
+                       arbol = importacion.getFirstChild();
+               else return ref;
+               while(arbol != null){
+                       Modulo mod = mods.get(arbol.getText());
+                       if(mod.getNombre().equals(nombre)){
+                               return nombre + "->" + mod.getNombre();
+                       }
+                       ref2 = referenciaCiclica(mod, mods);
+                       if(!ref2.equals("")){
+                               return nombre + "->" + ref2;
+                       }
+                       arbol = arbol.getNextSibling();
+               }
+               
+               return ref;
+       }
+       
+       public String referenciaCiclica(Modulo mod, TablaModulos mods){
+               if(mod.getNombre().equals(nombre)){
+                       return mod.getNombre();
+               }
+               AST arbol = mod.getImportacion();
+               if(arbol != null)
+                       arbol = arbol.getFirstChild();
+               else return "";
+               while(arbol != null){
+                       Modulo mod1 = mods.get(arbol.getText());
+                       if(mod1.getNombre().equals(nombre)){
+                               return mod.getNombre() + "->" + mod1.getNombre();
+                       }else{
+                               String ref2 =referenciaCiclica(mod1, mods); 
+                               if(!ref2.equals("")){
+                                       return mod.getNombre() + "->" + ref2;
+                               }
+                       }
+                       arbol = arbol.getNextSibling();
+               }
+               return "";
+       }
 }
index 158589b..0873c46 100755 (executable)
@@ -78,14 +78,24 @@ public class Principal {
                        li = nombres_modulos.listIterator();
                        while(li.hasNext()){
                                ResNom resnom = new ResNom();
+                               resnom.setASTNodeClass("ArbolLineas");
                                nombre_modulo = li.next();
+                               String nom2 = nombre_modulo.substring(0, nombre_modulo.length()-4);
+                               Modulo mod2 = mods.get(nom2);
+                               String refciclica = mod2.referenciaCiclica(mods);
+                               if(!refciclica.equals("")){
+                                       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);
                                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("Princial", arbol.get("principal.mod"));
-                       //frame.setVisible(true);
+                       
                        //anasem.declaracion_modulo(arbol);
 
                } catch (ANTLRException ae) {
index 05ab61e..be3ce98 100644 (file)
--- a/ResNom.g
+++ b/ResNom.g
@@ -1,7 +1,6 @@
 header{
        import java.util.*; 
-       import antlr.ASTFactory;
-       
+       import antlr.ASTFactory;        
 }
 
 class ResNom extends TreeParser;
@@ -239,7 +238,7 @@ tipo :
 tipo_predefinido_simple
 | tipo_predefinido_compuesto
 | declaracion_error
-| IDENT
+| i:IDENT {#tipo = declaracion_tipo(#i);}
 ;
 
 tipo_predefinido_simple :
index ef511ff..d964551 100644 (file)
@@ -1,4 +1,4 @@
+elemento2.mod;\r
 elemento.mod;\r
-pila.mod;\r
-principal.mod;\r
+pila2.mod;\r
 \r
index 114ad5c..6dbe003 100644 (file)
@@ -1,5 +1,6 @@
 modulo elemento\r
 \r
+importacion: pila2\r
 exportacion:\r
 \r
 inst clase Elemento\r
diff --git a/elemento2.mod b/elemento2.mod
new file mode 100644 (file)
index 0000000..4e38e42
--- /dev/null
@@ -0,0 +1,39 @@
+modulo elemento2
+
+importacion: elemento
+exportacion:
+inst clase Elemento
+{
+   consultar() dev entero
+   {
+      dev e;                              // ERROR variable no declarada
+   }
+   oculto entero e;
+   modificar(entero n)
+   {
+      e := haceralgo();
+   }
+   haceralgo() dev entero
+       {
+               dev 10;
+       }
+   
+}
+implementacion:
+inst clase Elemento2
+{
+   consultar() dev entero
+   {
+      dev e;                              // ERROR variable no declarada
+   }
+   oculto entero e;
+   modificar(entero n)
+   {
+      e := haceralgo();
+   }
+   haceralgo() dev entero
+       {
+               dev 10;
+       }
+   
+}
\ No newline at end of file
index 5f5c102..91fe68c 100644 (file)
--- a/pila.mod
+++ b/pila.mod
@@ -19,6 +19,8 @@ inst clase Pila
 \r
    estaLlena() dev logico\r
    {\r
+   TipoErr c;\r
+   apilar1(c);\r
        si (cima = 100) entonces\r
                dev cierto;\r
        sino\r
diff --git a/pila2.mod b/pila2.mod
new file mode 100644 (file)
index 0000000..7df27b6
--- /dev/null
+++ b/pila2.mod
@@ -0,0 +1,76 @@
+modulo pila2
+
+importacion: elemento2
+
+exportacion:
+// Pila con 100 elementos como maximo
+inst clase Pila
+{
+   oculto Elemento el;
+   Elemento2 e2;
+   oculto entero cima;
+   entero x;
+   iniciar()
+   {
+      cima := 0;
+   }
+   estaLlena() dev logico
+   {
+               // aa
+               // bb
+      si (cima = 100.1) entonces          // ERROR Semántico
+            dev cierto;
+      sino
+            dev falso;
+      finsi
+      apilar(0, 0);
+   }
+   apilar(Elemento elem, entero i)
+   {
+      si (no estaLlena()) entonces
+            cima := cima + 1;
+            el := elem;
+      finsi
+      i := 1;                          // ERROR Semántico
+      e2.haceralgo();
+   }
+   estaVacia() dev logico
+    {
+        si (cima = 0) entonces
+               dev cierto;
+        sino
+               dev falso;
+        finsi
+    }
+    desapilar() dev Elemento
+    {
+        si (no estaVacia(1)) entonces             // ERROR Semántico
+               cima := cima - realaentero(1.0);
+               dev el;
+        sino
+               dev el;
+        finsi
+    }
+}
+clase Programa
+{
+      inicio()
+      {
+         Elemento ed;
+         Pila p;
+         TipoErr k;                               // ERROR tipo no declarado
+         entero i;
+         p := crear(Pila);
+         p.iniciar();
+         i := p.cima; 
+         i := Pila; //ERROR
+         i:=1;
+         mientras (i < 10) hacer
+             ed := crear(Pila);                    // ERROR Semántico
+             ed.modificar(i);
+             p.apilar(ed, i);
+             i:=i+1;
+         finmientras
+      }
+  }
+implementacion:
\ No newline at end of file