X-Git-Url: http://git.danigm.net/?p=PL2.git;a=blobdiff_plain;f=ResNom.g;h=41eb74637fa794f7287d744d11df1cdab0b1dd48;hp=05ab61ec6fab997385d18f52ab88017378cec799;hb=HEAD;hpb=b22782ba9f237946b8a150588430fc4cc2dbb4ef diff --git a/ResNom.g b/ResNom.g index 05ab61e..41eb746 100644 --- a/ResNom.g +++ b/ResNom.g @@ -1,7 +1,7 @@ header{ import java.util.*; - import antlr.ASTFactory; - + import antlr.ASTFactory; + import java.util.Hashtable; } class ResNom extends TreeParser; @@ -10,6 +10,7 @@ options{ buildAST = true; importVocab=Analex; importVocab=Anasint; + } { @@ -17,6 +18,8 @@ options{ Tabla_Global t; TablaModulos mods; AST importaciones = null; + String nombre_modulo = ""; + Hashtable declaraciones = new Hashtable(); void resolver_identificadores_tipo(){ Identificador_Tipo elemento; @@ -26,7 +29,7 @@ options{ ListIterator 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){ @@ -66,6 +69,69 @@ options{ 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 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 == 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){ + AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling(); + if(arbol2.getFirstChild().getText().equals(ident.getText())){ + if (visibilidad.getType() != OCULTO){ + return arbol2; + } + else{ + System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible"); + return #(#[ERROR,"error"]); + } + } + } + else if (arbol2.getType() == METODO){ + AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling(); + if(arbol2.getFirstChild().getFirstChild().getText().equals(ident.getText())){ + if (visibilidad.getType() != OCULTO){ + return arbol2; + } + else{ + System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible"); + return #(#[ERROR,"error"]); + } + } + } + arbol2 = arbol2.getNextSibling(); + } + System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado"); + return #(#[ERROR,"error"]); + } void averiguar_importaciones() { Ambito a = t.ambitomodulo; @@ -87,8 +153,11 @@ options{ } } -declaracion_modulo [Tabla_Global tab, TablaModulos m]: -{t = tab; +declaracion_modulo [String nombre, Tabla_Global tab, TablaModulos m, Hashtable d]: +{ + nombre_modulo = nombre; + t = tab; + declaraciones = d; mods = m; averiguar_importaciones(); resolver_identificadores_tipo();} @@ -128,7 +197,7 @@ declaraciones_elementos_clase : (declaracion_elemento_clase)* ; declaracion_elemento_clase : #(METODO declaracion_metodo cualificador_elemento_clase) -| #(ATRIBUTO IDENT tipo cualificador_elemento_clase) +| #(ATRIBUTO i:IDENT t:tipo cualificador_elemento_clase) ; cualificador_elemento_clase: OCULTO | VISIBLE ; @@ -147,7 +216,7 @@ definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locale declaracion_variables_locales : (declaracion_variable_local)* ; -declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) ; +declaracion_variable_local : #(VARIABLE_LOCAL i:IDENT t:tipo) ; declaracion_error : ERROR; @@ -218,19 +287,23 @@ expresion: ; acceso : acceso_simple -| #(ACCESO_OBJETO acceso_simple a:IDENT); +| #(ACCESO_OBJETO as:acceso_simple acceso_objeto[#as]) +; -acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso) +acceso_objeto [AST arbol] : a:IDENT {#acceso_objeto = resolver_acceso_objeto(arbol, #a);}; + +acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso) ; -declaracion_acceso: declaracion_modulo[t, mods] +declaracion_acceso: declaracion_modulo[nombre_modulo, t, mods, declaraciones] | declaracion_clase | declaracion_elemento_clase | declaracion_parametro | declaracion_variable_local | declaracion_error | i:LIT_ENTERO -{#declaracion_acceso = resolver_acceso_simple(i.getText());} +{#declaracion_acceso = resolver_acceso_simple(i.getText()); +} ; lista_expresiones_nv : (expresion)+; @@ -239,7 +312,7 @@ tipo : tipo_predefinido_simple | tipo_predefinido_compuesto | declaracion_error -| IDENT +| i:IDENT {#tipo = declaracion_tipo(#i);} ; tipo_predefinido_simple :