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