Primer paso para la referencia adelantada, guarda las declaraciones de tipos en una...
[PL2.git] / Anasint.g
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.*;
@@ -41,6 +50,7 @@ tokens{
        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){
@@ -68,6 +78,12 @@ tokens{
        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){
@@ -152,9 +168,12 @@ tokens{
                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 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;
-               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){
@@ -243,21 +266,17 @@ declaracion_modulo![String f] :
    ;
  
 nombre_modulo : MODULO! IDENT ;
-/*
-definicion_modulo :
-       lista_declaraciones_clases;
-*/
+
 definicion_modulo :
-   importacion
+   (importacion)?
    (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 :
@@ -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
-{## = #(#[REAL_A_ENTERO],#e1);};
\ No newline at end of file
+{## = #(#[REAL_A_ENTERO],#e1);};