3 import antlr.ASTFactory;
6 class ResNom extends TreeParser;
15 LinkedList<String> leas = new LinkedList<String>();
18 AST importaciones = null;
20 void resolver_identificadores_tipo(){
21 Identificador_Tipo elemento;
23 LinkedList<Identificador_Tipo> i;
24 i = t.identtiposinresolver.getIdentificadores();
25 ListIterator<Identificador_Tipo> li = i.listIterator();
27 elemento = (Identificador_Tipo) li.next();
28 nombre = elemento.getNombre();
30 if(t.ambitomodulo.getDeclaracion(nombre) == null &&
31 mods.Declaracion(nombre, importaciones) == null){
32 //identificador de tipo no declarado
33 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+elemento.getLinea()+"): identificador '" + nombre + "' no declarado");
38 AST resolver_acceso_simple(String numero){
39 int no = Integer.parseInt(numero);
40 //nombre y ambito contenedor del acceso
41 Lista_Accesos acsr = t.accesossinresolver;
42 Acceso acc = t.accesossinresolver.getAcceso(no);
43 String nom = acc.getNombre();
44 Ambito amb = acc.getContenedor();
47 AST dec = #(#[ERROR, "error"]);
48 //comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
49 //Hace falta mirar en los modulos, para el crear
50 if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null ){
51 if (mods.Declaracion(nom, importaciones) != null){
52 dec = mods.Declaracion(nom, importaciones);
54 //acceso simple no declarado
56 if(!leas.contains(numero)){
57 //System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
58 System.out.println("ERROR RN :"+t.ambitomodulo.getNombre()+".mod ("+acc.getLinea()+"): acceso simple '" + nom + "' no declarado");
63 dec = sim.getDeclaracion(); //referencia adelantada
69 void averiguar_importaciones() {
70 Ambito a = t.ambitomodulo;
71 Modulo mx = mods.get(a.getNombre());
72 importaciones = mx.getImportacion();
75 //con esta funcion se podrian poner la clases
76 //tipo: i:IDENT {#tipo = declaracion_tipo(#i);}
77 AST declaracion_tipo(AST ident){
78 AST tipo = #(#[ERROR, "error"]);
79 Ambito modulo = t.ambitomodulo;
80 Simbolo s = modulo.getDeclaracion(ident.getText());
82 ASTFactory f = new ASTFactory();
83 tipo = f.dupTree(s.getDeclaracion());
89 declaracion_modulo [Tabla_Global tab, TablaModulos m]:
92 averiguar_importaciones();
93 resolver_identificadores_tipo();}
94 #(MODULO nombre_modulo definicion_modulo);
96 // =============================== del fichero anasem.g ============================
98 nombre_modulo : IDENT ;
106 importacion : #(IMPORTACION lista_ident);
107 lista_ident: (IDENT)+;
109 exportacion : #(EXPORTACION lista_declaraciones_clases);
111 implementacion : #(IMPLEMENTACION lista_declaraciones_clases);
113 lista_declaraciones_clases: (declaracion_clase)*
116 declaracion_clase : #(CLASE nombre_clase cualificador_clase definicion_clase)
119 cualificador_clase : INST | NO_INST ;
121 nombre_clase : IDENT ;
123 definicion_clase : declaraciones_elementos_clase
126 declaraciones_elementos_clase : (declaracion_elemento_clase)* ;
128 declaracion_elemento_clase :
129 #(METODO declaracion_metodo cualificador_elemento_clase)
130 | #(ATRIBUTO IDENT tipo cualificador_elemento_clase)
133 cualificador_elemento_clase: OCULTO | VISIBLE ;
135 declaracion_metodo : prototipo_metodo definicion_metodo;
137 prototipo_metodo: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros)
138 #(RESULTADO (tipo | VACIO)));
140 declaracion_parametros : (declaracion_parametro)* ;
142 declaracion_parametro : #(PARAMETRO IDENT tipo) ;
144 definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales) #(INSTRUCCIONES instrucciones))
147 declaracion_variables_locales : (declaracion_variable_local)* ;
149 declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) ;
151 declaracion_error : ERROR;
153 instrucciones : (instruccion)* ;
155 instruccion : #(INSTRUCCION ( instruccion_simple | instruccion_compuesta))
158 instruccion_simple : llamada_metodo
165 instruccion_compuesta :
170 crear : #(CREAR expresion expresion);
171 escribir : #(ESCRIBIR expresion);
173 asignacion : #(ASIGNACION expresion expresion );
175 retorno: #(DEV expresion)
179 #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
182 lista_expresiones: (expresion)* ;
184 condicion: #(SI expresion #(INSTRUCCIONES instrucciones)
185 (#(INSTRUCCIONES instrucciones))?)
188 iteracion : #(MIENTRAS expresion #(INSTRUCCIONES
192 #(O expresion expresion)
193 | #(Y expresion expresion)
195 | #(op1:MAYOR expresion expresion)
196 | #(op2:MAYOR_IGUAL expresion expresion)
197 | #(op3:MENOR expresion expresion)
198 | #(op4:MENOR_IGUAL expresion expresion)
199 | #(op5:IGUAL expresion expresion)
200 | #(op6:DISTINTO expresion expresion)
201 | #(MAS expresion expresion)
202 | #(MENOS expresion expresion)
203 | #(MENOSUNARIO expresion)
204 | #(POR expresion expresion)
205 | #(DIVISION expresion expresion)
206 | #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
207 | #(ACCESO_TABLA acceso #(EXPRESIONES lista_expresiones_nv))
214 | #(ENTERO_A_REAL expresion)
215 | #(REAL_A_ENTERO expresion)
219 acceso : acceso_simple
220 | #(ACCESO_OBJETO acceso_simple a:IDENT);
222 acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso)
225 declaracion_acceso: declaracion_modulo[t, mods]
227 | declaracion_elemento_clase
228 | declaracion_parametro
229 | declaracion_variable_local
232 {#declaracion_acceso = resolver_acceso_simple(i.getText());}
235 lista_expresiones_nv : (expresion)+;
238 tipo_predefinido_simple
239 | tipo_predefinido_compuesto
241 | i:IDENT {#tipo = declaracion_tipo(#i);}
244 tipo_predefinido_simple :
251 tipo_predefinido_compuesto : formacion;
253 formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros) tipo);
255 lista_enteros : (LIT_ENTERO)+ ;