Siguiendo la guía de referencia adelantada del tema5 de PL2
authordanigm <>
Sat, 29 Mar 2008 15:15:55 +0000 (16:15 +0100)
committerdanigm <>
Sat, 29 Mar 2008 15:15:55 +0000 (16:15 +0100)
Acceso.java [new file with mode: 0644]
Anasint.g
Identificador_Tipo.java [new file with mode: 0644]
Lista_Accesos.java [new file with mode: 0644]
Lista_Identificadores.java [new file with mode: 0644]
Pila_Ambitos.java
Principal.java
Tabla_Global.java [new file with mode: 0644]
prueba1

diff --git a/Acceso.java b/Acceso.java
new file mode 100644 (file)
index 0000000..89849d1
--- /dev/null
@@ -0,0 +1,31 @@
+
+public class Acceso {
+       int numero; //identificador unico para cada acceso simple en un ambito
+       String nombre; //nombre del acceso simple
+       Ambito contenedor; //ambito contenedor del acceso simple
+       
+       public Acceso(int numero, String nombre, Ambito contenedor){
+               this.numero = numero;
+               this.nombre = nombre;
+               this.contenedor = contenedor;
+       }
+       public String getNombre(){
+               return nombre;
+       }
+       public String getNumero() {
+               return Integer.toString(numero);
+       }
+       public void setNumero(int numero) {
+               this.numero = numero;
+       }
+       public Ambito getContenedor() {
+               return contenedor;
+       }
+       public void setContenedor(Ambito contenedor) {
+               this.contenedor = contenedor;
+       }
+       public void setNombre(String nombre) {
+               this.nombre = nombre;
+       }
+       
+}
index 972265d..cb2c2c5 100755 (executable)
--- a/Anasint.g
+++ b/Anasint.g
@@ -50,6 +50,7 @@ tokens{
        logFile log;
        int margen = 0;
        Pila_Ambitos pilaambitos = new Pila_Ambitos();
+       Tabla_Global t = new Tabla_Global();
        LinkedList<Simbolo_no_resuelto> no_resueltos = new LinkedList<Simbolo_no_resuelto>();
        
        void ambito_abrir_programa(){
@@ -72,20 +73,26 @@ tokens{
        
        void ambito_cerrar(){
                if(pilaambitos.vacia() == false){
+                       ambito_instalar();
                        pilaambitos.desapilar_ambito();
                }
        }
        void ambito_cerrar_programa(){
-               if(pilaambitos.vacia() == false && pilaambitos.ambito_actual().getTipo().equals("PROGRAMA"))
+               if(pilaambitos.vacia() == false && pilaambitos.ambito_actual().getTipo().equals("PROGRAMA")){
+                       ambito_instalar();
                        pilaambitos.desapilar_ambito();
-        //TODO referencia adelantada
-        Simbolo_no_resuelto snr;
-        while(no_resueltos.size() > 0){
-            snr = no_resueltos.remove(0);
-            System.out.println(snr.getNombre() + " - " + snr.getAmbito().getNombre());
         }
        }
        
+       //XX TODO referencia adelantada
+       void ambito_instalar(){
+               Ambito a = pilaambitos.ambito_actual();
+               t.tablaambitos.apilar_ambito(a);
+               if(a.getTipo().equals("MODULO")){
+                       t.ambitomodulo = a;
+               }
+       }
+       
        AST crear_declaracion_modulo(AST nombre_modulo, AST definicion_modulo){
                String m = nombre_modulo.getText();
                AST M = #(#[MODULO, "modulo"],nombre_modulo, definicion_modulo);
@@ -139,18 +146,21 @@ tokens{
        AST ambito_tratar_acceso_simple (AST ident){
                String acc = ident.getText();
                AST dec_acc = null;
+               AST ACC = null;
                Simbolo s;
                if ((s=pilaambitos.buscar_simbolo(acc)) != null){
                dec_acc = s.getDeclaracion(); // AST de la declaracion del acceso simple
+               ACC = #(#[ACCESO_SIMPLE,"acceso_simple"], ident, dec_acc);
                        log.writeNoIndent(" ("+dec_acc.getText()+")\n");
                }
                else{
-                       String men = "ERROR RN: Identificador " +acc+ " no declarado";
-                       dec_acc = #(#[ERROR,"error"]);
-                       System.out.println(men); // identificador no declarado
-                       log.writeNoIndent(" (error)\n");
+                       //referencia adelantada o error
+                       String n = t.accesossinresolver.setAcceso(acc, pilaambitos.ambito_actual());
+                       AST LI = #(#[LIT_ENTERO, "lit_entero"]);
+                       LI.setText(n);
+                       ACC = #(#[ACCESO_SIMPLE, "acceso_simple"], ident, LI);
                }
-               AST ACC = #(#[ACCESO_SIMPLE,"acceso_simple"], ident, dec_acc);
+               
                return ACC;
        }
 
@@ -162,19 +172,16 @@ tokens{
                while (amb != null && !amb.getTipo().equals("MODULO"))
                        amb = amb.getContenedor();
                if (amb == null){
-                       System.out.println(men); // el tipo no es un tipo clase
+                       System.out.println("ERROR: El tipo" + tipo + "no es un tipo clase"); // el tipo no es un tipo clase
                        return #(#[ERROR,"error"]);
                }
                Simbolo simb = amb.getDeclaracion(tipo);
                if (simb == null){
-                       System.out.println(men); // el tipo no es un tipo clase
-                       //TODO referencia adelanatada
-               no_resueltos.add(new Simbolo_no_resuelto(tipo, pilaambitos.ambito_actual()));
-                       return #(#[ERROR,"error"]); //#(#[ERROR,"error"]);
+                       //referencia adelantada o error
+                       Identificador_Tipo IT = new Identificador_Tipo(tipo);
+                       t.identtiposinresolver.setIdentificador(IT);
                }
-               AST C = simb.getDeclaracion();
-
-               return C;
+               return ident;
        }
        
        
@@ -243,7 +250,7 @@ tokens{
 // DECLARACION DE MODULO          
 /////////////////////////////////////////////////////////
  
-declaracion_modulo![String f] :
+declaracion_modulo![String f] returns [Tabla_Global tab=null] :
    {
        ambito_abrir_programa();
        log = new logFile(f);
@@ -262,7 +269,7 @@ declaracion_modulo![String f] :
     ambito_cerrar_programa();
     log.decNivel();
     log.close();
-    }
+   tab = t;}
    ;
  
 nombre_modulo : MODULO! IDENT ;
diff --git a/Identificador_Tipo.java b/Identificador_Tipo.java
new file mode 100644 (file)
index 0000000..52f34ae
--- /dev/null
@@ -0,0 +1,18 @@
+
+public class Identificador_Tipo {
+       String nombre;
+       
+       public Identificador_Tipo(String nombre){
+               this.nombre = nombre;
+       }
+
+       public String getNombre() {
+               return nombre;
+       }
+
+       public void setNombre(String nombre) {
+               this.nombre = nombre;
+       }
+       
+       
+}
diff --git a/Lista_Accesos.java b/Lista_Accesos.java
new file mode 100644 (file)
index 0000000..8316bae
--- /dev/null
@@ -0,0 +1,33 @@
+import java.util.Iterator;
+import java.util.LinkedList;
+
+
+public class Lista_Accesos {
+       LinkedList<Acceso> accesos;
+       int tamano;
+       
+       public Lista_Accesos(){
+               accesos = new LinkedList<Acceso>();
+               tamano = 0;
+       }
+
+       public Acceso getAcceso(int numero) {
+               return accesos.get(numero);
+       }
+
+       public String setAcceso(String nombre, Ambito amb) {
+               Acceso a;
+               Iterator<Acceso> it = accesos.iterator();
+               while(it.hasNext()){
+                       a = it.next();
+                       if(a.getNombre().equals(nombre) && a.getContenedor().equals(amb)){
+                               return a.getNumero();
+                       }
+               }
+               tamano++;
+               a = new Acceso(tamano, nombre, amb);
+               accesos.add(a);
+               return a.getNumero();
+       }
+       
+}
diff --git a/Lista_Identificadores.java b/Lista_Identificadores.java
new file mode 100644 (file)
index 0000000..bda7e09
--- /dev/null
@@ -0,0 +1,20 @@
+import java.util.LinkedList;
+
+
+public class Lista_Identificadores {
+       LinkedList<Identificador_Tipo> identificadores;
+       
+       public Lista_Identificadores(){
+               identificadores = new LinkedList<Identificador_Tipo>();
+       }
+
+       public LinkedList<Identificador_Tipo> getIdentificadores() {
+               return identificadores;
+       }
+
+       public void setIdentificador(Identificador_Tipo ident) {
+               if(!identificadores.contains(ident)){
+                       identificadores.add(ident);
+               }
+       }
+}
index ab3ae8e..06562d2 100755 (executable)
@@ -20,7 +20,7 @@ public class Pila_Ambitos extends Pila{
        }
        //funcion auxiliar que implementa la recursion para buscar
        //en el contenedor del ambito actual
-       private Simbolo buscar_simbolo(Ambito act, String s){
+       public Simbolo buscar_simbolo(Ambito act, String s){
                Simbolo sim = act.getDeclaracion(s);
                if(sim == null){
                        Ambito cont = act.getContenedor();
index 449b4af..26144f6 100755 (executable)
@@ -16,7 +16,8 @@ public class Principal {
                        Anasint anasint = new Anasint(analex);
                        AnaSem anasem = new AnaSem();
                        AST arbol = null;
-                       anasint.declaracion_modulo(args[0]);
+                       Tabla_Global tab;
+                       tab = anasint.declaracion_modulo(args[0]);
                        arbol = anasint.getAST();
                        anasem.declaracion_modulo(arbol);
                        ASTFrame frame = new ASTFrame(args[0], arbol);
diff --git a/Tabla_Global.java b/Tabla_Global.java
new file mode 100644 (file)
index 0000000..a71276e
--- /dev/null
@@ -0,0 +1,18 @@
+/**
+ * Tabla con todos los elementos almacenados durante el analisis
+ * @author danigm
+ *
+ */
+public class Tabla_Global {
+       //tabla con todos los ambitos, y sus declaraciones contenidas
+       Pila_Ambitos tablaambitos;
+       Ambito ambitomodulo; //facilita las busquedas
+       Lista_Accesos accesossinresolver;
+       Lista_Identificadores identtiposinresolver;
+               
+       public Tabla_Global(){
+               tablaambitos = new Pila_Ambitos();
+               accesossinresolver = new Lista_Accesos();
+               identtiposinresolver = new Lista_Identificadores();
+       }
+}
diff --git a/prueba1 b/prueba1
index c2dbb30..a493795 100644 (file)
--- a/prueba1
+++ b/prueba1
@@ -2,30 +2,20 @@ modulo pila
 \r
 importacion: modulo1, modulo2\r
 exportacion:\r
-inst clase Elemento\r
-{\r
-   oculto entero e;\r
-   oculto Pila a;\r
-   \r
-   consultar() dev entero\r
-   {\r
-      dev e;\r
-   }\r
-   modificar(entero n)\r
-   {\r
-      e := n;\r
-   }  \r
-}\r
 \r
 // Pila con 100 elementos como maximo \r
 inst clase Pila  \r
 {\r
    oculto formacion 100 Elemento almacen;\r
+   oculto Pila a;\r
+   oculto Elemento b;\r
    oculto entero cima;\r
    \r
    iniciar()\r
    {\r
        cima := 0;\r
+       a := 3;\r
+       tal.inicio();\r
    }\r
 \r
    estaLlena() dev logico\r
@@ -65,6 +55,20 @@ inst clase Pila
    }   \r
 }\r
 \r
+inst clase Elemento\r
+{\r
+   oculto entero e;\r
+   \r
+   consultar() dev entero\r
+   {\r
+      dev e;\r
+   }\r
+   modificar(entero n)\r
+   {\r
+      e := n;\r
+   }  \r
+}\r
+\r
 \r
 clase Programa\r
 {\r
@@ -85,7 +89,7 @@ inicio()
 }}\r
 \r
 implementacion:\r
-inst clase tal\r
+clase tal\r
 {\r
 inicio()\r
 {\r