Creo que ya tengo la resolución de nombres, sin importación de módulos aún, pero...
[PL2.git] / ResNom.g
1 header{
2         import java.util.*; 
3         import antlr.ASTFactory;
4         
5 }
6
7 class ResNom extends TreeParser;
8
9 options{
10         buildAST = true;
11         importVocab=Analex;
12         importVocab=Anasint;
13 }
14
15 {
16         Tabla_Global t;
17         
18         void resolver_identificadores_tipo(){
19                 Identificador_Tipo elemento;
20                 String nombre;
21                 LinkedList<Identificador_Tipo> i;
22                 i = t.identtiposinresolver.getIdentificadores();
23                 ListIterator<Identificador_Tipo> li = i.listIterator();
24                 while(li.hasNext()){
25                         elemento = (Identificador_Tipo) li.next();
26                         nombre = elemento.getNombre();
27                         if(t.ambitomodulo.getDeclaracion(nombre) == null){
28                                 //identificador de tipo no declarado
29                                 System.out.println("ERROR RN: identificador " + nombre + " no declarado");
30                         }
31                 }
32         }
33         
34         AST resolver_acceso_simple(String numero){
35                 int no = Integer.parseInt(numero);
36                 //nombre y ambito contenedor del acceso
37                 Acceso acc = t.accesossinresolver.getAcceso(no);
38                 String nom = acc.getNombre();
39                 Ambito amb = acc.getContenedor();
40                 
41                 Simbolo sim;
42                 AST dec = #(#[ERROR, "error"]);
43                 //comprobar si se ha declarado, buscando en la tabla de ambitos y declaraciones
44                 if((sim = t.tablaambitos.buscar_simbolo(amb, nom)) == null){
45                         //acceso simple no declarado
46                         System.out.println("ERROR RN: acceso simple " + nom + " no declarado");
47                 }
48                 else {
49                         dec = sim.getDeclaracion(); //referencia adelantada
50                 }
51                 
52                 return dec;
53         }
54         
55         AST declaracion_tipo(AST ident){
56                 AST tipo = #(#[ERROR, "error"]);
57                 Ambito modulo = t.ambitomodulo;
58                 Simbolo s = modulo.getDeclaracion(ident.getText());
59                 if (s != null){
60                         ASTFactory f = new ASTFactory();
61                         tipo = f.dupTree(s.getDeclaracion());
62                 }
63                 return tipo;
64         }
65 }
66
67 declaracion_modulo [Tabla_Global tab]:
68 {t = tab;
69         resolver_identificadores_tipo();}
70         #(MODULO nombre_modulo definicion_modulo);
71
72 // =============================== del fichero anasem.g ============================
73
74 nombre_modulo : IDENT ;
75
76 definicion_modulo:
77         (importacion)?
78         (exportacion)+
79         (implementacion)?
80 ;
81
82 importacion : #(IMPORTACION lista_ident);
83 lista_ident: (IDENT)+;
84
85 exportacion : #(EXPORTACION lista_declaraciones_clases);
86
87 implementacion : #(IMPLEMENTACION lista_declaraciones_clases);
88
89 lista_declaraciones_clases: (declaracion_clase)*
90 ;
91
92 declaracion_clase : #(CLASE nombre_clase cualificador_clase definicion_clase)
93 ;
94
95 cualificador_clase : INST | NO_INST ;
96
97 nombre_clase : IDENT ;
98
99 definicion_clase : declaraciones_elementos_clase
100 ;
101
102 declaraciones_elementos_clase : (declaracion_elemento_clase)* ;
103
104 declaracion_elemento_clase :
105 #(METODO declaracion_metodo cualificador_elemento_clase)
106 | #(ATRIBUTO IDENT tipo cualificador_elemento_clase)
107 ;
108
109 cualificador_elemento_clase: OCULTO | VISIBLE ;
110
111 declaracion_metodo : prototipo_metodo definicion_metodo;
112
113 prototipo_metodo: #(PROTOTIPO IDENT #(PARAMETROS declaracion_parametros)
114 #(RESULTADO (tipo | VACIO)));
115
116 declaracion_parametros : (declaracion_parametro)* ;
117
118 declaracion_parametro : #(PARAMETRO IDENT tipo) ;
119
120 definicion_metodo: #(DEFINICION #(VARIABLES_LOCALES declaracion_variables_locales) #(INSTRUCCIONES instrucciones))
121 ;
122
123 declaracion_variables_locales : (declaracion_variable_local)* ;
124
125 declaracion_variable_local : #(VARIABLE_LOCAL IDENT tipo) ;
126
127 declaracion_error : ERROR;
128
129 instrucciones : (instruccion)* ;
130
131 instruccion : #(INSTRUCCION ( instruccion_simple | instruccion_compuesta))
132 ;
133
134 instruccion_simple : llamada_metodo
135 | crear
136 | escribir 
137 | asignacion
138 | retorno
139 ;
140
141 instruccion_compuesta  :
142 condicion
143 | iteracion 
144 ;
145
146 crear : #(CREAR expresion expresion);
147 escribir : #(ESCRIBIR expresion);
148
149 asignacion : #(ASIGNACION expresion expresion );
150
151 retorno: #(DEV expresion)
152 ;
153
154 llamada_metodo :
155 #(LLAMADA acceso #(EXPRESIONES lista_expresiones)) 
156 ;
157
158 lista_expresiones: (expresion)* ;
159
160 condicion: #(SI expresion #(INSTRUCCIONES instrucciones)
161 (#(INSTRUCCIONES instrucciones))?)
162 ;
163
164 iteracion : #(MIENTRAS expresion #(INSTRUCCIONES
165 instrucciones));
166
167 expresion:
168 #(O expresion expresion)
169 | #(Y expresion expresion)
170 | #(NO expresion)
171 | #(op1:MAYOR expresion expresion)
172 | #(op2:MAYOR_IGUAL expresion expresion)
173 | #(op3:MENOR expresion expresion)
174 | #(op4:MENOR_IGUAL expresion expresion)
175 | #(op5:IGUAL expresion expresion)
176 | #(op6:DISTINTO expresion expresion)
177 | #(MAS expresion expresion)
178 | #(MENOS expresion expresion)
179 | #(MENOSUNARIO expresion)
180 | #(POR expresion expresion)
181 | #(DIVISION expresion expresion)
182 | #(LLAMADA acceso #(EXPRESIONES lista_expresiones))
183 | #(ACCESO_TABLA acceso #(EXPRESIONES lista_expresiones_nv))
184 | acceso
185 | LIT_ENTERO
186 | LIT_REAL 
187 | LIT_CAR 
188 | CIERTO 
189 | FALSO 
190 | #(ENTERO_A_REAL expresion)
191 | #(REAL_A_ENTERO expresion)
192 | ERROR
193 ;
194
195 acceso : acceso_simple
196 | #(ACCESO_OBJETO acceso_simple a:IDENT);
197
198 acceso_simple : #(ACCESO_SIMPLE IDENT d:declaracion_acceso)
199 ;
200
201 declaracion_acceso: declaracion_modulo[t]
202 | declaracion_clase
203 | declaracion_elemento_clase
204 | declaracion_parametro
205 | declaracion_variable_local
206 | declaracion_error
207 | i:LIT_ENTERO
208 {#declaracion_acceso = resolver_acceso_simple(i.getText());}
209 ;
210
211 lista_expresiones_nv : (expresion)+;
212
213 tipo :
214 tipo_predefinido_simple
215 | tipo_predefinido_compuesto
216 | declaracion_error
217 | i:IDENT {#tipo = declaracion_tipo(#i);}
218 ;
219
220 tipo_predefinido_simple :
221 ENTERO
222 | REAL
223 | LOGICO
224 | CARACTER
225 ;
226
227 tipo_predefinido_compuesto : formacion;
228
229 formacion : #(FORMACION #(LISTA_ENTEROS lista_enteros)
230 (tipo_predefinido_simple | IDENT));
231
232 lista_enteros : (LIT_ENTERO)+ ;