nombre_variable_local! [AST t] :
i:IDENT
- { #nombre_variable_local = crear_declaracion_variable_local(#i,#t); }
+ { #nombre_variable_local = crear_declaracion_variable_local(#i,#t);}
;
///////////////////////////////////////////////////////////
String nombre;
AST exportacion;
AST importacion;
+ AST implementacion;
public Modulo(String nombre, AST arbol){
this.nombre = nombre;
ASTFactory f = new ASTFactory();
this.importacion = f.dupTree(t);
}
+ if(t.getText().equals("implementacion")){
+ ASTFactory f = new ASTFactory();
+ this.implementacion = f.dupTree(t);
+ }
t = t.getNextSibling();
}
}
}
return arbol;
}
+
+ public AST getDeclaracion_interna(String nombre){
+ AST arbol = implementacion.getFirstChild();
+ while(!arbol.getFirstChild().getText().equals(nombre)){
+ arbol = arbol.getNextSibling();
+ if (arbol == null)
+ break;
+ }
+ return arbol;
+ }
+
public AST getImportacion(){
return importacion;
}
}
System.out.println("RN modulo: " + nombre_modulo);
Auxiliar aux = tab.get(nombre_modulo);
- resnom.declaracion_modulo(arbol.get(nombre_modulo), aux.t, mods, aux.declaraciones);
+ resnom.declaracion_modulo(arbol.get(nombre_modulo), nombre_modulo, aux.t, mods, aux.declaraciones);
arbol.put(nombre_modulo, resnom.getAST());
}
- ASTFrame frame = new ASTFrame("nombre", arbol.get("p2.mod"));
+ ASTFrame frame = new ASTFrame("nombre", arbol.get("p1.mod"));
frame.setSize(600, 600);
frame.setVisible(true);
System.err.println("No se encontro el fichero");
}
}
-}
\ No newline at end of file
+}
Tabla_Global t;
TablaModulos mods;
AST importaciones = null;
+ String nombre_modulo = "";
Hashtable<String,String> declaraciones = new Hashtable<String,String>();
void resolver_identificadores_tipo(){
ListIterator<Identificador_Tipo> li = i.listIterator();
while(li.hasNext()){
elemento = (Identificador_Tipo) li.next();
- nombre = elemento.getNombre();
+ nombre = elemento.getNombre();
if(t.ambitomodulo.getDeclaracion(nombre) == null &&
mods.Declaracion(nombre, importaciones) == null){
return dec;
}
AST resolver_acceso_objeto(AST arbol, AST ident){
+ String raiz, accs;
+ raiz = arbol.getFirstChild().getText();
+ accs = ident.getText();
+
AST as = arbol.getFirstChild();
Hashtable<String,String> xx = declaraciones;
String tipo = declaraciones.get(as.getText());
-
AST arbol2 = declaracion_tipo(#(#[IDENT, tipo]));
+ if (tipo == null){
+ System.out.println("DEBUG: Acceso a Clase No instanciable " + arbol.getFirstChild().getText());
+ String nombre = arbol.getFirstChild().getText();
+ arbol2 = mods.Declaracion_interna(nombre, nombre_modulo);
+ if (arbol2 == null)
+ arbol2 = mods.Declaracion(arbol.getFirstChild().getText(), importaciones);
+ }
+
+ if (arbol2 == null){
+ System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
+ return #(#[ERROR,"error"]);
+ }
+
if (arbol2.getType() == ERROR)
arbol2 = mods.Declaracion(tipo, importaciones);
- if (arbol2.getType() == ERROR ){
+ if (arbol2 == null || arbol2.getType() == ERROR){
System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
return #(#[ERROR,"error"]);
}
+
+
arbol2 = arbol2.getFirstChild().getNextSibling().getNextSibling();
while(arbol2 != null){
if(arbol2.getType() == ATRIBUTO){
}
}
-declaracion_modulo [Tabla_Global tab, TablaModulos m, Hashtable d]:
-{t = tab;
+declaracion_modulo [String nombre, Tabla_Global tab, TablaModulos m, Hashtable d]:
+{
+ nombre_modulo = nombre;
+ t = tab;
declaraciones = d;
mods = m;
averiguar_importaciones();
acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso)
;
-declaracion_acceso: declaracion_modulo[t, mods, declaraciones]
+declaracion_acceso: declaracion_modulo[nombre_modulo, t, mods, declaraciones]
| declaracion_clase
| declaracion_elemento_clase
| declaracion_parametro
}
return null;
}
+ public AST Declaracion_interna(String nombre, String modulo){
+ ListIterator<Modulo> li = modulos.listIterator();
+ Modulo mod;
+ while(li.hasNext()){
+ mod = li.next();
+ if(mod.getNombre().equals(modulo)){
+ //modulo encontrado, ahora a buscar la declaracion
+ if(mod.getDeclaracion_interna(nombre) != null){
+ return mod.getDeclaracion_interna(nombre);
+ }else return null;
+ }
+ }
+ return null;
+ }
}
-modulo p1\r
-importacion: p2\r
-exportacion:\r
- clase Programa1\r
- {\r
- inicio()\r
- {\r
- entero i;\r
- entero j;\r
- M obj;\r
- \r
- obj := crear(M);\r
- i:=1;\r
- mientras (i<=10) hacer\r
- obj.modificar(i);\r
- j := obj.consultar();\r
- escribir(j);\r
- i:=i+1;\r
- finmientras \r
- } \r
- }\r
-implementacion: \r
+modulo p1
+importacion: p2
+exportacion:
+ clase Programa1
+ {
+ oculto entero i;
+
+ inicio()
+ {
+ Clase1 j;
+ M obj;
+
+ obj := crear(M);
+ i:=1;
+ mientras (i<=10) hacer
+ obj.modificar(i);
+ j := obj.consultar();
+ escribir(j);
+ i:=i+Clase1.valor;
+ finmientras
+ }
+ }
+
+
+implementacion:
+ clase Clase1
+ {
+ entero valor;
+
+ consultar() dev entero
+ {
+ dev valor;
+ }
+ }
\ No newline at end of file
MODULO: p1
--CLASE: Programa1
+----ATRIBUTO: i
----METODO: inicio
+------IDENTIFICADOR TIPO: Clase1
------IDENTIFICADOR TIPO: M
------ACCESO SIMPLE: obj (variable_local)
-------ACCESO SIMPLE: M------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: M------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: i (atributo)
------ACCESO SIMPLE: obj (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: i (atributo)
------ACCESO SIMPLE: j (variable_local)
------ACCESO SIMPLE: obj (variable_local)
------ACCESO SIMPLE: j (variable_local)
------IDENTIFICADOR TIPO: j
-------ACCESO SIMPLE: i (variable_local)
-------ACCESO SIMPLE: i (variable_local)
+------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: i (atributo)
+------ACCESO SIMPLE: Clase1--CLASE: Clase1
+----ATRIBUTO: valor
+----METODO: consultar
+------ACCESO SIMPLE: valor (atributo)
-modulo p2\r
-importacion: p3\r
-exportacion:\r
- inst clase M\r
- {\r
- oculto C a;\r
- \r
- consultar() dev C\r
- {\r
- formacion 10, 13 entero k;\r
- dev a; \r
- } \r
- \r
- modificar(entero i)\r
- {\r
- a.modificar(i);\r
- } \r
- }\r
-implementacion: \r
- inst clase C\r
- {\r
- entero valor;\r
- \r
- consultar() dev entero\r
- {\r
- dev valor; \r
- } \r
- \r
- oculto modificar(entero i)\r
- {\r
- valor:=i;\r
- } \r
- }\r
+modulo p2
+importacion: p3
+exportacion:
+ inst clase M
+ {
+ oculto C a;
+
+ consultar() dev C
+ {
+ formacion 10, 13 entero k;
+ dev a;
+ }
+
+ modificar(entero i)
+ {
+ a.modificar(i);
+ }
+ }
+
+ clase D
+ {
+ oculto Elemento e;
+
+ modificar(entero e)
+ {
+ e.modificar(e);
+ }
+ }
+implementacion:
modulo p3\r
-\r
+importacion: p1\r
exportacion:\r
clase Elemento\r
{\r
- imprimirMensaje(entero e)\r
+ ampramarMensaje(entero e)\r
{\r
escribir(e);\r
}\r