Principio del soporte a la importación
authordanigm <>
Sat, 29 Mar 2008 20:32:38 +0000 (21:32 +0100)
committerdanigm <>
Sat, 29 Mar 2008 20:32:38 +0000 (21:32 +0100)
Anasint.g
Conflex.g [new file with mode: 0644]
EjemploMain.java [new file with mode: 0644]
Principal.java
ResNom.g
ejemplo.cfg [new file with mode: 0644]
elemento.mod [new file with mode: 0644]
p1.res
pila.mod [new file with mode: 0644]
principal.mod [new file with mode: 0644]
prueba1

index cb2c2c5..5ab8d28 100755 (executable)
--- a/Anasint.g
+++ b/Anasint.g
@@ -265,7 +265,7 @@ declaracion_modulo![String f] returns [Tabla_Global tab=null] :
    {
        ambito_cerrar();
     #declaracion_modulo=crear_declaracion_modulo(#n,#d);
-    comprobarPrograma(#declaracion_modulo);
+    //comprobarPrograma(#declaracion_modulo);
     ambito_cerrar_programa();
     log.decNivel();
     log.close();
diff --git a/Conflex.g b/Conflex.g
new file mode 100644 (file)
index 0000000..2670cd6
--- /dev/null
+++ b/Conflex.g
@@ -0,0 +1,9 @@
+class Conflex extends Lexer;\r
+\r
+BT : ('\t'|';'|"\r\n") {$setType(Token.SKIP);} ;\r
+protected LETRA : ('a'..'z'|'A'..'Z');\r
+protected DIGITO : ('0'..'9');\r
+protected PUNTUACION : ('\\'|':'|' '|'('|')');\r
+protected IDENT : LETRA(LETRA|DIGITO|PUNTUACION)* ;\r
+\r
+MODULO:  IDENT ".mod" ;\r
diff --git a/EjemploMain.java b/EjemploMain.java
new file mode 100644 (file)
index 0000000..f6b7da6
--- /dev/null
@@ -0,0 +1,61 @@
+import java.io.FileInputStream;\r
+import java.io.FileNotFoundException;\r
+import java.util.LinkedList;\r
+import java.util.List;\r
+\r
+import antlr.CommonToken;\r
+import antlr.Token;\r
+import antlr.TokenStreamException;\r
+\r
+/**\r
+ * Ejemplo de la estructura del método main para comenzar el procesado de una serie de archivos\r
+ * en el lenguaje L-1\r
+ * \r
+ *\r
+ */\r
+public class EjemploMain {\r
+\r
+       /**\r
+        *  Pre: 'nombre_prog' es el nombre de un fichero conteniendo un programa L-1.\r
+        *               Ej. "programa.cfg" \r
+        *               c:\PL2\Laboratorio\SEMANTICA\sem2\m.mod;\r
+        *               c:\PL2\Laboratorio\SEMANTICA\sem2\n.mod;\r
+        *               c:\PL2\Laboratorio\SEMANTICA\sem2\p.mod;\r
+        *\r
+        *      Cada elemento en 'lista_nombre_modulos' contiene el nombre de un módulo \r
+        *  del programa 'nombre_prog'.\r
+        */\r
+       private static List<String> extraer_modulos(String nombre_prog) {\r
+               List<String> lista_nombres_modulos = new LinkedList<String>();\r
+               try {\r
+                       FileInputStream f = new FileInputStream(nombre_prog);\r
+                       Conflex conflex = new Conflex(f);\r
+                       CommonToken tok = (CommonToken) conflex.nextToken();\r
+\r
+                       // Análisis léxico del archivo "*.cfg". Cada token 'tok' representa el nombre de un módulo.\r
+                       while (tok.getType() != Token.EOF_TYPE) {\r
+                               String s = new String(tok.getText());\r
+                               lista_nombres_modulos.add(s);\r
+                               tok = (CommonToken) conflex.nextToken();\r
+                       }\r
+               } catch (FileNotFoundException e) {\r
+                       System.out.println("Excepcion: " + e);\r
+               } catch (TokenStreamException e) {\r
+                       System.out.println("Excepcion: " + e);\r
+               }\r
+               return lista_nombres_modulos;\r
+       }\r
+       \r
+       /**\r
+        * @param args Como único argumento a la aplicación se le pasará un archivo *.cfg con \r
+        * las rutas de los archivos *.mod que queramos procesar.\r
+        */\r
+       public static void main(String[] args) {\r
+               List<String> nombres_modulos = extraer_modulos(args[0]);\r
+               \r
+               //TODO Realizar análisis léxico, sintáctico y semántico de cada módulo\r
+       }\r
+\r
+       \r
+       \r
+}\r
index ab6c430..b7e6f0f 100755 (executable)
@@ -2,19 +2,58 @@
 // Principal.java (clase principal)
 ///////////////////////////////
 import java.io.*;
+import java.util.LinkedList;
+import java.util.List;
 
 import antlr.ANTLRException;
+import antlr.CommonToken;
+import antlr.Token;
+import antlr.TokenStreamException;
 import antlr.collections.AST;
 import antlr.debug.misc.ASTFrame;
 
 public class Principal {
+               /**
+                *  Pre: 'nombre_prog' es el nombre de un fichero conteniendo un programa L-1.
+                *               Ej. "programa.cfg" 
+                *               c:\PL2\Laboratorio\SEMANTICA\sem2\m.mod;
+                *               c:\PL2\Laboratorio\SEMANTICA\sem2\n.mod;
+                *               c:\PL2\Laboratorio\SEMANTICA\sem2\p.mod;
+                *
+                *      Cada elemento en 'lista_nombre_modulos' contiene el nombre de un modulo 
+                *  del programa 'nombre_prog'.
+                */
+               private static List<String> extraer_modulos(String nombre_prog) {
+                       List<String> lista_nombres_modulos = new LinkedList<String>();
+                       try {
+                               FileInputStream f = new FileInputStream(nombre_prog);
+                               Conflex conflex = new Conflex(f);
+                               CommonToken tok = (CommonToken) conflex.nextToken();
+
+                               while (tok.getType() != Token.EOF_TYPE) {
+                                       String s = new String(tok.getText());
+                                       lista_nombres_modulos.add(s);
+                                       tok = (CommonToken) conflex.nextToken();
+                               }
+                       } catch (FileNotFoundException e) {
+                               System.out.println("Excepcion: " + e);
+                       } catch (TokenStreamException e) {
+                               System.out.println("Excepcion: " + e);
+                       }
+                       return lista_nombres_modulos;
+               }
+       
+       
        public static void main(String args[]) {
                
                try {
-                       FileInputStream fis = new FileInputStream(args[0]);
+                       List<String> nombres_modulos = extraer_modulos(args[0]);
+                       // TODO hay que parsear todos los ficheros del cfg
+                       // y luego exportar los modulos
+                       FileInputStream fis = new FileInputStream(nombres_modulos.get(0));
                        Analex analex = new Analex(fis);
                        Anasint anasint = new Anasint(analex);
-                       AnaSem anasem = new AnaSem();
+                       AnaSem2 anasem = new AnaSem2();
                        ResNom resnom = new ResNom();
                        AST arbol = null;
                        Tabla_Global tab;
index 05c1b5c..5f03368 100644 (file)
--- a/ResNom.g
+++ b/ResNom.g
@@ -13,6 +13,7 @@ options{
 }
 
 {
+       LinkedList<String> leas = new LinkedList<String>();
        Tabla_Global t;
        
        void resolver_identificadores_tipo(){
@@ -34,6 +35,7 @@ options{
        AST resolver_acceso_simple(String numero){
                int no = Integer.parseInt(numero);
                //nombre y ambito contenedor del acceso
+               Lista_Accesos acsr = t.accesossinresolver;
                Acceso acc = t.accesossinresolver.getAcceso(no);
                String nom = acc.getNombre();
                Ambito amb = acc.getContenedor();
@@ -43,7 +45,10 @@ options{
                //comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
                if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null){
                        //acceso simple no declarado
-                       System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
+                       if(!leas.contains(numero)){
+                               System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
+                               leas.add(numero);
+                       }
                }
                else {
                        dec = sim.getDeclaracion(); //referencia adelantada
@@ -52,6 +57,8 @@ options{
                return dec;
        }
        
+       //con esta funcion se podrian poner la clases
+       //tipo: i:IDENT {#tipo = declaracion_tipo(#i);}
        AST declaracion_tipo(AST ident){
                AST tipo = #(#[ERROR, "error"]);
                Ambito modulo = t.ambitomodulo;
@@ -214,7 +221,7 @@ tipo :
 tipo_predefinido_simple
 | tipo_predefinido_compuesto
 | declaracion_error
-| i:IDENT {#tipo = declaracion_tipo(#i);}
+| IDENT
 ;
 
 tipo_predefinido_simple :
@@ -226,7 +233,6 @@ ENTERO
 
 tipo_predefinido_compuesto : formacion;
 
-formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros)
-(tipo_predefinido_simple | IDENT));
+formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros) tipo);
 
 lista_enteros : (LIT_ENTERO)+ ;
diff --git a/ejemplo.cfg b/ejemplo.cfg
new file mode 100644 (file)
index 0000000..dfe851f
--- /dev/null
@@ -0,0 +1,3 @@
+principal.mod;\r
+pila.mod;\r
+elemento.mod;
\ No newline at end of file
diff --git a/elemento.mod b/elemento.mod
new file mode 100644 (file)
index 0000000..114ad5c
--- /dev/null
@@ -0,0 +1,17 @@
+modulo elemento\r
+\r
+exportacion:\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
+}
\ No newline at end of file
diff --git a/p1.res b/p1.res
index ecf0d15..e69de29 100644 (file)
--- a/p1.res
+++ b/p1.res
@@ -1,63 +0,0 @@
-MODULO: pila
---CLASE: Elemento
-----METODO: consultar
-------ACCESO SIMPLE: e (variable_local)
-----ATRIBUTO: e
-----METODO: modificar
-------ACCESO SIMPLE: e (atributo)
-------ACCESO SIMPLE: n (parametro)
---CLASE: Pila
-----IDENTIFICADOR TIPO: Elemento
-----ATRIBUTO: almacen
-----ATRIBUTO: cima
-----ATRIBUTO: x
-----METODO: iniciar
-------ACCESO SIMPLE: cima (atributo)
-----METODO: estaLlena
-------ACCESO SIMPLE: cima (atributo)
-----METODO: apilar
-----IDENTIFICADOR TIPO: Elemento
-------ACCESO SIMPLE: estaLlena (metodo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: almacen (atributo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: elem (parametro)
-------ACCESO SIMPLE: i (parametro)
-----METODO: estaVacia
-------ACCESO SIMPLE: cima (atributo)
-----METODO: desapilar
-----IDENTIFICADOR TIPO: Elemento
-------ACCESO SIMPLE: estaVacia (metodo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: almacen (atributo)
-------ACCESO SIMPLE: cima (atributo)
-------ACCESO SIMPLE: almacen (atributo)
-------ACCESO SIMPLE: cima (atributo)
---CLASE: Programa
-----METODO: inicio
-------IDENTIFICADOR TIPO: Elemento
-------IDENTIFICADOR TIPO: Pila
-------IDENTIFICADOR TIPO: TipoErr
-------ACCESO SIMPLE: p (variable_local)
-------ACCESO SIMPLE: Pila (clase)
-------IDENTIFICADOR TIPO: Pila
-------ACCESO SIMPLE: p (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: p (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: Pila (clase)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: p (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: e (variable_local)
-------ACCESO SIMPLE: Pila (clase)
-------IDENTIFICADOR TIPO: Pila
-------ACCESO SIMPLE: e (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: p (variable_local)
-------ACCESO SIMPLE: e (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
diff --git a/pila.mod b/pila.mod
new file mode 100644 (file)
index 0000000..e376c27
--- /dev/null
+++ b/pila.mod
@@ -0,0 +1,54 @@
+modulo pila\r
+\r
+importacion: elemento\r
+exportacion:\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
+   }\r
+\r
+   estaLlena() dev logico\r
+   {\r
+       si (cima = 100) entonces\r
+               dev cierto;\r
+       sino\r
+               dev falso;\r
+       finsi\r
+   }\r
+\r
+   apilar(Elemento elem)\r
+   {\r
+      si (no estaLlena( ) ) entonces\r
+               cima := cima + 1 + 2;\r
+               almacen[cima] := elem;\r
+         finsi   \r
+   }   \r
+   \r
+   estaVacia() dev logico\r
+   {\r
+       si (cima = 0) entonces\r
+               dev cierto;\r
+       sino\r
+               dev falso;\r
+       finsi\r
+   }\r
+   \r
+   desapilar() dev Elemento\r
+   {\r
+      si (no estaVacia()) entonces \r
+               cima := cima - 1;\r
+               dev almacen[cima+1];\r
+       sino\r
+               dev almacen[cima];\r
+       finsi\r
+   }   \r
+}
\ No newline at end of file
diff --git a/principal.mod b/principal.mod
new file mode 100644 (file)
index 0000000..59b0dae
--- /dev/null
@@ -0,0 +1,23 @@
+modulo principal\r
+\r
+importacion: pila, elemento\r
+exportacion:\r
+\r
+clase Programa\r
+{\r
+       inicio()\r
+       {\r
+               Elemento e;\r
+               Pila p;\r
+               entero i;\r
+               p:=crear(Pila);\r
+               p.iniciar();\r
+             i :=1;\r
+             mientras (i<=10) hacer\r
+                   e := crear(Elemento);\r
+                 e.modificar(i);\r
+                 p.apilar(e);\r
+                 i:=i+1;\r
+              finmientras\r
+       }\r
+}
\ No newline at end of file
diff --git a/prueba1 b/prueba1
index a493795..2559b43 100644 (file)
--- a/prueba1
+++ b/prueba1
@@ -7,13 +7,14 @@ exportacion:
 inst clase Pila  \r
 {\r
    oculto formacion 100 Elemento almacen;\r
-   oculto Pila a;\r
+   //oculto Pila a;\r
    oculto Elemento b;\r
    oculto entero cima;\r
    \r
    iniciar()\r
    {\r
        cima := 0;\r
+       //no se por que sale 3 veces este error\r
        a := 3;\r
        tal.inicio();\r
    }\r