3 import antlr.ASTFactory;
7 class ResNom extends TreeParser;
16 LinkedList<String> leas = new LinkedList<String>();
19 AST importaciones = null;
21 void resolver_identificadores_tipo(){
22 Identificador_Tipo elemento;
24 LinkedList<Identificador_Tipo> i;
25 i = t.identtiposinresolver.getIdentificadores();
26 ListIterator<Identificador_Tipo> li = i.listIterator();
28 elemento = (Identificador_Tipo) li.next();
29 nombre = elemento.getNombre();
31 if(t.ambitomodulo.getDeclaracion(nombre) == null &&
32 mods.Declaracion(nombre, importaciones) == null){
33 //identificador de tipo no declarado
34 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+elemento.getLinea()+"): identificador '" + nombre + "' no declarado");
39 AST resolver_acceso_simple(String numero){
40 int no = Integer.parseInt(numero);
41 //nombre y ambito contenedor del acceso
42 Lista_Accesos acsr = t.accesossinresolver;
43 Acceso acc = t.accesossinresolver.getAcceso(no);
44 String nom = acc.getNombre();
45 Ambito amb = acc.getContenedor();
48 AST dec = #(#[ERROR, "error"]);
49 //comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
50 //Hace falta mirar en los modulos, para el crear
51 if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null ){
52 if (mods.Declaracion(nom, importaciones) != null){
53 dec = mods.Declaracion(nom, importaciones);
55 //acceso simple no declarado
57 if(!leas.contains(numero)){
58 //System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
59 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+acc.getLinea()+"): acceso simple '" + nom + "' no declarado");
64 dec = sim.getDeclaracion(); //referencia adelantada
70 void averiguar_importaciones() {
71 Ambito a = t.ambitomodulo;
72 Modulo mx = mods.get(a.getNombre());
73 importaciones = mx.getImportacion();
76 //con esta funcion se podrian poner la clases
77 //tipo: i:IDENT {#tipo = declaracion_tipo(#i);}
78 AST declaracion_tipo(AST ident){
79 AST tipo = #(#[ERROR, "error"]);
80 Ambito modulo = t.ambitomodulo;
81 Simbolo s = modulo.getDeclaracion(ident.getText());
83 ASTFactory f = new ASTFactory();
84 tipo = f.dupTree(s.getDeclaracion());
90 declaracion_modulo [Tabla_Global tab, TablaModulos m]:
93 averiguar_importaciones();
94 resolver_identificadores_tipo();}
95 #(MODULO nombre_modulo definicion_modulo);
97 // =============================== del fichero anasem.g ============================
99 nombre_modulo : IDENT ;
107 importacion : #(IMPORTACION lista_ident);
108 lista_ident: (IDENT)+;
110 exportacion : #(EXPORTACION lista_declaraciones_clases);
112 implementacion : #(IMPLEMENTACION lista_declaraciones_clases);
114 lista_declaraciones_clases: (declaracion_clase)*
117 declaracion_clase : #(CLASE nombre_clase cualificador_clase definicion_clase)
120 cualificador_clase : INST | NO_INST ;
122 nombre_clase : IDENT ;
124 definicion_clase : declaraciones_elementos_clase
127 declaraciones_elementos_clase : (declaracion_elemento_clase)* ;
129 declaracion_elemento_clase :
130 #(METODO declaracion_metodo cualificador_elemento_clase)
131 | #(ATRIBUTO IDENT tipo cualificador_elemento_clase)
134 cualificador_elemento_clase: OCULTO | VISIBLE ;
136 declaracion_metodo : prototipo_metodo definicion_metodo;
138 prototipo_metodo: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros)
139 #(RESULTADO (tipo | VACIO)));
141 declaracion_parametros : (declaracion_parametro)* ;
143 declaracion_parametro : #(PARAMETRO IDENT tipo) ;
145 definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales) #(INSTRUCCIONES instrucciones))
148 declaracion_variables_locales : (declaracion_variable_local)* ;
150 declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) ;
152 declaracion_error : ERROR;
154 instrucciones : (instruccion)* ;
156 instruccion : #(INSTRUCCION ( instruccion_simple | instruccion_compuesta))
159 instruccion_simple : llamada_metodo
166 instruccion_compuesta :
171 crear : #(CREAR expresion expresion);
172 escribir : #(ESCRIBIR expresion);
174 asignacion : #(ASIGNACION expresion expresion );
176 retorno: #(DEV expresion)
180 #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
183 lista_expresiones: (expresion)* ;
185 condicion: #(SI expresion #(INSTRUCCIONES instrucciones)
186 (#(INSTRUCCIONES instrucciones))?)
189 iteracion : #(MIENTRAS expresion #(INSTRUCCIONES
193 #(O expresion expresion)
194 | #(Y expresion expresion)
196 | #(op1:MAYOR expresion expresion)
197 | #(op2:MAYOR_IGUAL expresion expresion)
198 | #(op3:MENOR expresion expresion)
199 | #(op4:MENOR_IGUAL expresion expresion)
200 | #(op5:IGUAL expresion expresion)
201 | #(op6:DISTINTO expresion expresion)
202 | #(MAS expresion expresion)
203 | #(MENOS expresion expresion)
204 | #(MENOSUNARIO expresion)
205 | #(POR expresion expresion)
206 | #(DIVISION expresion expresion)
207 | #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
208 | #(ACCESO_TABLA acceso #(EXPRESIONES lista_expresiones_nv))
215 | #(ENTERO_A_REAL expresion)
216 | #(REAL_A_ENTERO expresion)
220 acceso : acceso_simple
221 | #(ACCESO_OBJETO acceso_simple a:IDENT);
223 acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso)
226 declaracion_acceso: declaracion_modulo[t, mods]
228 | declaracion_elemento_clase
229 | declaracion_parametro
230 | declaracion_variable_local
233 {#declaracion_acceso = resolver_acceso_simple(i.getText());}
236 lista_expresiones_nv : (expresion)+;
239 tipo_predefinido_simple
240 | tipo_predefinido_compuesto
245 tipo_predefinido_simple :
252 tipo_predefinido_compuesto : formacion;
254 formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros) tipo);
256 lista_enteros : (LIT_ENTERO)+ ;