3 import antlr.ASTFactory;
4 import java.util.Hashtable;
7 class ResNom extends TreeParser;
17 LinkedList<String> leas = new LinkedList<String>();
20 AST importaciones = null;
21 String nombre_modulo = "";
22 Hashtable<String,String> declaraciones = new Hashtable<String,String>();
24 void resolver_identificadores_tipo(){
25 Identificador_Tipo elemento;
27 LinkedList<Identificador_Tipo> i;
28 i = t.identtiposinresolver.getIdentificadores();
29 ListIterator<Identificador_Tipo> li = i.listIterator();
31 elemento = (Identificador_Tipo) li.next();
32 nombre = elemento.getNombre();
34 if(t.ambitomodulo.getDeclaracion(nombre) == null &&
35 mods.Declaracion(nombre, importaciones) == null){
36 //identificador de tipo no declarado
37 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+elemento.getLinea()+"): identificador '" + nombre + "' no declarado");
42 AST resolver_acceso_simple(String numero){
43 int no = Integer.parseInt(numero);
44 //nombre y ambito contenedor del acceso
45 Lista_Accesos acsr = t.accesossinresolver;
46 Acceso acc = t.accesossinresolver.getAcceso(no);
47 String nom = acc.getNombre();
48 Ambito amb = acc.getContenedor();
51 AST dec = #(#[ERROR, "error"]);
52 //comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
53 //Hace falta mirar en los modulos, para el crear
54 if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null ){
55 if (mods.Declaracion(nom, importaciones) != null){
56 dec = mods.Declaracion(nom, importaciones);
58 //acceso simple no declarado
60 if(!leas.contains(numero)){
61 //System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
62 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+acc.getLinea()+"): acceso simple '" + nom + "' no declarado");
67 dec = sim.getDeclaracion(); //referencia adelantada
72 AST resolver_acceso_objeto(AST arbol, AST ident){
74 raiz = arbol.getFirstChild().getText();
75 accs = ident.getText();
77 AST as = arbol.getFirstChild();
79 Hashtable<String,String> xx = declaraciones;
80 String tipo = declaraciones.get(as.getText());
81 AST arbol2 = declaracion_tipo(#(#[IDENT, tipo]));
83 System.out.println("DEBUG: Acceso a Clase No instanciable " + arbol.getFirstChild().getText());
84 String nombre = arbol.getFirstChild().getText();
85 arbol2 = mods.Declaracion_interna(nombre, nombre_modulo);
87 arbol2 = mods.Declaracion(arbol.getFirstChild().getText(), importaciones);
91 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
92 return #(#[ERROR,"error"]);
95 if (arbol2.getType() == ERROR)
96 arbol2 = mods.Declaracion(tipo, importaciones);
98 if (arbol2 == null || arbol2.getType() == ERROR){
99 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
100 return #(#[ERROR,"error"]);
104 arbol2 = arbol2.getFirstChild().getNextSibling().getNextSibling();
105 while(arbol2 != null){
106 if(arbol2.getType() == ATRIBUTO){
107 AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling();
108 if(arbol2.getFirstChild().getText().equals(ident.getText())){
109 if (visibilidad.getType() != OCULTO){
113 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible");
114 return #(#[ERROR,"error"]);
118 else if (arbol2.getType() == METODO){
119 AST visibilidad = arbol2.getFirstChild().getNextSibling().getNextSibling();
120 if(arbol2.getFirstChild().getFirstChild().getText().equals(ident.getText())){
121 if (visibilidad.getType() != OCULTO){
125 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no es accesible");
126 return #(#[ERROR,"error"]);
130 arbol2 = arbol2.getNextSibling();
132 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+((ArbolLineas)ident).getLinea()+"): acceso objeto '" + ident.getText() + "' no declarado");
133 return #(#[ERROR,"error"]);
136 void averiguar_importaciones() {
137 Ambito a = t.ambitomodulo;
138 Modulo mx = mods.get(a.getNombre());
139 importaciones = mx.getImportacion();
142 //con esta funcion se podrian poner la clases
143 //tipo: i:IDENT {#tipo = declaracion_tipo(#i);}
144 AST declaracion_tipo(AST ident){
145 AST tipo = #(#[ERROR, "error"]);
146 Ambito modulo = t.ambitomodulo;
147 Simbolo s = modulo.getDeclaracion(ident.getText());
149 ASTFactory f = new ASTFactory();
150 tipo = f.dupTree(s.getDeclaracion());
156 declaracion_modulo [String nombre, Tabla_Global tab, TablaModulos m, Hashtable d]:
158 nombre_modulo = nombre;
162 averiguar_importaciones();
163 resolver_identificadores_tipo();}
164 #(MODULO nombre_modulo definicion_modulo);
166 // =============================== del fichero anasem.g ============================
168 nombre_modulo : IDENT ;
176 importacion : #(IMPORTACION lista_ident);
177 lista_ident: (IDENT)+;
179 exportacion : #(EXPORTACION lista_declaraciones_clases);
181 implementacion : #(IMPLEMENTACION lista_declaraciones_clases);
183 lista_declaraciones_clases: (declaracion_clase)*
186 declaracion_clase : #(CLASE nombre_clase cualificador_clase definicion_clase)
189 cualificador_clase : INST | NO_INST ;
191 nombre_clase : IDENT ;
193 definicion_clase : declaraciones_elementos_clase
196 declaraciones_elementos_clase : (declaracion_elemento_clase)* ;
198 declaracion_elemento_clase :
199 #(METODO declaracion_metodo cualificador_elemento_clase)
200 | #(ATRIBUTO i:IDENT t:tipo cualificador_elemento_clase)
203 cualificador_elemento_clase: OCULTO | VISIBLE ;
205 declaracion_metodo : prototipo_metodo definicion_metodo;
207 prototipo_metodo: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros)
208 #(RESULTADO (tipo | VACIO)));
210 declaracion_parametros : (declaracion_parametro)* ;
212 declaracion_parametro : #(PARAMETRO IDENT tipo) ;
214 definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales) #(INSTRUCCIONES instrucciones))
217 declaracion_variables_locales : (declaracion_variable_local)* ;
219 declaracion_variable_local : #(VARIABLE_LOCAL i:IDENT t:tipo) ;
221 declaracion_error : ERROR;
223 instrucciones : (instruccion)* ;
225 instruccion : #(INSTRUCCION ( instruccion_simple | instruccion_compuesta))
228 instruccion_simple : llamada_metodo
235 instruccion_compuesta :
240 crear : #(CREAR expresion expresion);
241 escribir : #(ESCRIBIR expresion);
243 asignacion : #(ASIGNACION expresion expresion );
245 retorno: #(DEV expresion)
249 #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
252 lista_expresiones: (expresion)* ;
254 condicion: #(SI expresion #(INSTRUCCIONES instrucciones)
255 (#(INSTRUCCIONES instrucciones))?)
258 iteracion : #(MIENTRAS expresion #(INSTRUCCIONES
262 #(O expresion expresion)
263 | #(Y expresion expresion)
265 | #(op1:MAYOR expresion expresion)
266 | #(op2:MAYOR_IGUAL expresion expresion)
267 | #(op3:MENOR expresion expresion)
268 | #(op4:MENOR_IGUAL expresion expresion)
269 | #(op5:IGUAL expresion expresion)
270 | #(op6:DISTINTO expresion expresion)
271 | #(MAS expresion expresion)
272 | #(MENOS expresion expresion)
273 | #(MENOSUNARIO expresion)
274 | #(POR expresion expresion)
275 | #(DIVISION expresion expresion)
276 | #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
277 | #(ACCESO_TABLA acceso #(EXPRESIONES lista_expresiones_nv))
284 | #(ENTERO_A_REAL expresion)
285 | #(REAL_A_ENTERO expresion)
289 acceso : acceso_simple
290 | #(ACCESO_OBJETO as:acceso_simple acceso_objeto[#as])
293 acceso_objeto [AST arbol] : a:IDENT {#acceso_objeto = resolver_acceso_objeto(arbol, #a);};
295 acceso_simple : #(ACCESO_SIMPLE i:IDENT d:declaracion_acceso)
298 declaracion_acceso: declaracion_modulo[nombre_modulo, t, mods, declaraciones]
300 | declaracion_elemento_clase
301 | declaracion_parametro
302 | declaracion_variable_local
305 {#declaracion_acceso = resolver_acceso_simple(i.getText());
309 lista_expresiones_nv : (expresion)+;
312 tipo_predefinido_simple
313 | tipo_predefinido_compuesto
315 | i:IDENT {#tipo = declaracion_tipo(#i);}
318 tipo_predefinido_simple :
325 tipo_predefinido_compuesto : formacion;
327 formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros) tipo);
329 lista_enteros : (LIT_ENTERO)+ ;