From 81f8191a9844ae76abb7942082cbffd81369a822 Mon Sep 17 00:00:00 2001 From: danigm <> Date: Sat, 29 Mar 2008 16:15:55 +0100 Subject: [PATCH] =?utf8?q?Siguiendo=20la=20gu=C3=ADa=20de=20referencia=20a?= =?utf8?q?delantada=20del=20tema5=20de=20PL2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Acceso.java | 31 +++++++++++++++++++++++++++++ Anasint.g | 49 ++++++++++++++++++++++++++-------------------- Identificador_Tipo.java | 18 +++++++++++++++++ Lista_Accesos.java | 33 +++++++++++++++++++++++++++++++ Lista_Identificadores.java | 20 +++++++++++++++++++ Pila_Ambitos.java | 2 +- Principal.java | 3 ++- Tabla_Global.java | 18 +++++++++++++++++ prueba1 | 34 ++++++++++++++++++-------------- 9 files changed, 170 insertions(+), 38 deletions(-) create mode 100644 Acceso.java create mode 100644 Identificador_Tipo.java create mode 100644 Lista_Accesos.java create mode 100644 Lista_Identificadores.java create mode 100644 Tabla_Global.java diff --git a/Acceso.java b/Acceso.java new file mode 100644 index 0000000..89849d1 --- /dev/null +++ b/Acceso.java @@ -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; + } + +} diff --git a/Anasint.g b/Anasint.g index 972265d..cb2c2c5 100755 --- 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 no_resueltos = new LinkedList(); 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 index 0000000..52f34ae --- /dev/null +++ b/Identificador_Tipo.java @@ -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 index 0000000..8316bae --- /dev/null +++ b/Lista_Accesos.java @@ -0,0 +1,33 @@ +import java.util.Iterator; +import java.util.LinkedList; + + +public class Lista_Accesos { + LinkedList accesos; + int tamano; + + public Lista_Accesos(){ + accesos = new LinkedList(); + tamano = 0; + } + + public Acceso getAcceso(int numero) { + return accesos.get(numero); + } + + public String setAcceso(String nombre, Ambito amb) { + Acceso a; + Iterator 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 index 0000000..bda7e09 --- /dev/null +++ b/Lista_Identificadores.java @@ -0,0 +1,20 @@ +import java.util.LinkedList; + + +public class Lista_Identificadores { + LinkedList identificadores; + + public Lista_Identificadores(){ + identificadores = new LinkedList(); + } + + public LinkedList getIdentificadores() { + return identificadores; + } + + public void setIdentificador(Identificador_Tipo ident) { + if(!identificadores.contains(ident)){ + identificadores.add(ident); + } + } +} diff --git a/Pila_Ambitos.java b/Pila_Ambitos.java index ab3ae8e..06562d2 100755 --- a/Pila_Ambitos.java +++ b/Pila_Ambitos.java @@ -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(); diff --git a/Principal.java b/Principal.java index 449b4af..26144f6 100755 --- a/Principal.java +++ b/Principal.java @@ -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 index 0000000..a71276e --- /dev/null +++ b/Tabla_Global.java @@ -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 --- a/prueba1 +++ b/prueba1 @@ -2,30 +2,20 @@ modulo pila importacion: modulo1, modulo2 exportacion: -inst clase Elemento -{ - oculto entero e; - oculto Pila a; - - consultar() dev entero - { - dev e; - } - modificar(entero n) - { - e := n; - } -} // Pila con 100 elementos como maximo inst clase Pila { oculto formacion 100 Elemento almacen; + oculto Pila a; + oculto Elemento b; oculto entero cima; iniciar() { cima := 0; + a := 3; + tal.inicio(); } estaLlena() dev logico @@ -65,6 +55,20 @@ inst clase Pila } } +inst clase Elemento +{ + oculto entero e; + + consultar() dev entero + { + dev e; + } + modificar(entero n) + { + e := n; + } +} + clase Programa { @@ -85,7 +89,7 @@ inicio() }} implementacion: -inst clase tal +clase tal { inicio() { -- 2.1.4