Primer paso para la referencia adelantada, guarda las declaraciones de tipos en una...
authordanigm <>
Thu, 27 Mar 2008 19:41:55 +0000 (20:41 +0100)
committerdanigm <>
Thu, 27 Mar 2008 19:41:55 +0000 (20:41 +0100)
Anasint.g
Simbolo_no_resuelto.java [new file with mode: 0644]
prueba1

index e3c9d59..972265d 100755 (executable)
--- a/Anasint.g
+++ b/Anasint.g
@@ -1,3 +1,12 @@
+/*
+ *
+ * Referencia adelantada
+ * se intentan resolver los nombres, los que no se resuelvan se almacenan en al tabla de simbolos
+ * se recorren los no resueltos, y se le asigna el nombre correspondiente
+ * se recorre el ambito modulo, y se instalan las declaraciones en los no resueltos
+ *
+**/
+
 header{
        import java.util.*;
        import antlr.*;
 header{
        import java.util.*;
        import antlr.*;
@@ -41,6 +50,7 @@ tokens{
        logFile log;
        int margen = 0;
        Pila_Ambitos pilaambitos = new Pila_Ambitos();
        logFile log;
        int margen = 0;
        Pila_Ambitos pilaambitos = new Pila_Ambitos();
+       LinkedList<Simbolo_no_resuelto> no_resueltos = new LinkedList<Simbolo_no_resuelto>();
        
        void ambito_abrir_programa(){
                if(pilaambitos.vacia() == true){
        
        void ambito_abrir_programa(){
                if(pilaambitos.vacia() == true){
@@ -68,6 +78,12 @@ tokens{
        void ambito_cerrar_programa(){
                if(pilaambitos.vacia() == false && pilaambitos.ambito_actual().getTipo().equals("PROGRAMA"))
                        pilaambitos.desapilar_ambito();
        void ambito_cerrar_programa(){
                if(pilaambitos.vacia() == false && pilaambitos.ambito_actual().getTipo().equals("PROGRAMA"))
                        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());
+        }
        }
        
        AST crear_declaracion_modulo(AST nombre_modulo, AST definicion_modulo){
        }
        
        AST crear_declaracion_modulo(AST nombre_modulo, AST definicion_modulo){
@@ -152,9 +168,12 @@ tokens{
                Simbolo simb = amb.getDeclaracion(tipo);
                if (simb == null){
                        System.out.println(men); // el tipo no es un tipo clase
                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"]);
                }
                AST C = simb.getDeclaracion();
                        return #(#[ERROR,"error"]); //#(#[ERROR,"error"]);
                }
                AST C = simb.getDeclaracion();
+
                return C;
        }
        
                return C;
        }
        
@@ -176,7 +195,11 @@ tokens{
        //comprueba que existe la clase programa y el metodo inicio en esta
        public void comprobarPrograma(AST modulo){
                boolean programa=false;
        //comprueba que existe la clase programa y el metodo inicio en esta
        public void comprobarPrograma(AST modulo){
                boolean programa=false;
-               AST clase = modulo.getFirstChild().getNextSibling().getNextSibling().getFirstChild();
+               AST clase = modulo.getFirstChild().getNextSibling();
+               while (!clase.getText().equals("exportacion")){
+                       clase = clase.getNextSibling();
+               }
+               clase = clase.getFirstChild();
                String nombre = clase.getFirstChild().getText();
                while(true){
                        if(nombre.equals("Programa") && !programa){
                String nombre = clase.getFirstChild().getText();
                while(true){
                        if(nombre.equals("Programa") && !programa){
@@ -243,21 +266,17 @@ declaracion_modulo![String f] :
    ;
  
 nombre_modulo : MODULO! IDENT ;
    ;
  
 nombre_modulo : MODULO! IDENT ;
-/*
-definicion_modulo :
-       lista_declaraciones_clases;
-*/
+
 definicion_modulo :
 definicion_modulo :
-   importacion
+   (importacion)?
    (exportacion)+
    (implementacion)?
           ;
 
 lista_ident: IDENT (COMA! IDENT)*;
 
    (exportacion)+
    (implementacion)?
           ;
 
 lista_ident: IDENT (COMA! IDENT)*;
 
-importacion! :
-       (IMPORTACION DOS_PUNTOS l:lista_ident)?
-       {#importacion = #(#[IMPORTACION, "importacion"], #l);}
+importacion :
+       IMPORTACION^ DOS_PUNTOS! l:lista_ident
        ;
 
 exportacion :
        ;
 
 exportacion :
@@ -590,4 +609,4 @@ entero_a_real!: ENTERO_A_REAL PARENTESIS_ABIERTO e1:expresion PARENTESIS_CERRADO
 {## = #(#[ENTERO_A_REAL],#e1);};
 
 real_a_entero!: REAL_A_ENTERO PARENTESIS_ABIERTO e1:expresion PARENTESIS_CERRADO
 {## = #(#[ENTERO_A_REAL],#e1);};
 
 real_a_entero!: REAL_A_ENTERO PARENTESIS_ABIERTO e1:expresion PARENTESIS_CERRADO
-{## = #(#[REAL_A_ENTERO],#e1);};
\ No newline at end of file
+{## = #(#[REAL_A_ENTERO],#e1);};
diff --git a/Simbolo_no_resuelto.java b/Simbolo_no_resuelto.java
new file mode 100644 (file)
index 0000000..a752386
--- /dev/null
@@ -0,0 +1,23 @@
+public class Simbolo_no_resuelto {
+
+       String nombre;
+       Ambito amb;
+       
+       public Simbolo_no_resuelto(String nombre, Ambito amb){
+               this.nombre = nombre;
+               this.amb = amb;
+       }
+       public String getNombre(){
+               return nombre;
+       }
+       
+       public Ambito getAmbito(){
+               return amb;
+       }
+       public void setNombre(String nombre){
+               this.nombre = nombre;
+       }
+       public void setAmbito(Ambito amb){
+               this.amb = amb;
+       }
+}
diff --git a/prueba1 b/prueba1
index 1629047..c2dbb30 100644 (file)
--- a/prueba1
+++ b/prueba1
@@ -5,6 +5,7 @@ exportacion:
 inst clase Elemento\r
 {\r
    oculto entero e;\r
 inst clase Elemento\r
 {\r
    oculto entero e;\r
+   oculto Pila a;\r
    \r
    consultar() dev entero\r
    {\r
    \r
    consultar() dev entero\r
    {\r