+/*
+ *
+ * Referencia adelantada
+ * se intentan resolver los nombres, los que no se resuelvan se almacenan en al tabla de simbolos
+ * se recorren los no resueltos, y se le asigna el nombre correspondiente
+ * se recorre el ambito modulo, y se instalan las declaraciones en los no resueltos
+ *
+**/
+
header{
import java.util.*;
import antlr.*;
logFile log;
int margen = 0;
Pila_Ambitos pilaambitos = new Pila_Ambitos();
+ LinkedList<Simbolo_no_resuelto> no_resueltos = new LinkedList<Simbolo_no_resuelto>();
void ambito_abrir_programa(){
if(pilaambitos.vacia() == true){
void ambito_cerrar_programa(){
if(pilaambitos.vacia() == false && pilaambitos.ambito_actual().getTipo().equals("PROGRAMA"))
pilaambitos.desapilar_ambito();
+ //TODO referencia adelantada
+ Simbolo_no_resuelto snr;
+ while(no_resueltos.size() > 0){
+ snr = no_resueltos.remove(0);
+ System.out.println(snr.getNombre() + " - " + snr.getAmbito().getNombre());
+ }
}
AST crear_declaracion_modulo(AST nombre_modulo, AST definicion_modulo){
Simbolo simb = amb.getDeclaracion(tipo);
if (simb == null){
System.out.println(men); // el tipo no es un tipo clase
+ //TODO referencia adelanatada
+ no_resueltos.add(new Simbolo_no_resuelto(tipo, pilaambitos.ambito_actual()));
return #(#[ERROR,"error"]); //#(#[ERROR,"error"]);
}
AST C = simb.getDeclaracion();
+
return C;
}
//comprueba que existe la clase programa y el metodo inicio en esta
public void comprobarPrograma(AST modulo){
boolean programa=false;
- AST clase = modulo.getFirstChild().getNextSibling().getNextSibling().getFirstChild();
+ AST clase = modulo.getFirstChild().getNextSibling();
+ while (!clase.getText().equals("exportacion")){
+ clase = clase.getNextSibling();
+ }
+ clase = clase.getFirstChild();
String nombre = clase.getFirstChild().getText();
while(true){
if(nombre.equals("Programa") && !programa){
;
nombre_modulo : MODULO! IDENT ;
-/*
-definicion_modulo :
- lista_declaraciones_clases;
-*/
+
definicion_modulo :
- importacion
+ (importacion)?
(exportacion)+
(implementacion)?
;
lista_ident: IDENT (COMA! IDENT)*;
-importacion! :
- (IMPORTACION DOS_PUNTOS l:lista_ident)?
- {#importacion = #(#[IMPORTACION, "importacion"], #l);}
+importacion :
+ IMPORTACION^ DOS_PUNTOS! l:lista_ident
;
exportacion :
{## = #(#[ENTERO_A_REAL],#e1);};
real_a_entero!: REAL_A_ENTERO PARENTESIS_ABIERTO e1:expresion PARENTESIS_CERRADO
-{## = #(#[REAL_A_ENTERO],#e1);};
\ No newline at end of file
+{## = #(#[REAL_A_ENTERO],#e1);};