private void CapturarInformacion(Analizador an, Hashtable clasesPreanalizadas) { List <ClasePreAnalizada> clases = an.clases; Progreso.Value = 80; System.Threading.Thread.Sleep(200); foreach (ClasePreAnalizada a in clases) { if (!clasesPreanalizadas.Contains(a.id)) { Clase aux = a.obtenerClase(); clasesPreanalizadas.Add(a.id, a);//METO LAS CLASES AL HASHTABLE PARA LUEGO LAS PREANALIZADAS LLEVARLAS A ANALIZARLAS Estatico.clasesDisponibles.addClass(aux); } else { Estatico.errores.Add(new TError("Advertencia", "Se encontro una nueva definicion de la clase: " + a.id + " En el archivo: " + a.archivoOringen + ", Por lo que Se descarto", 0, 0, true)); } } if (Estatico.NumeroErroes() > 0)//SI HAY ERRORES REVISAR { MessageBox.Show("Existen: " + Estatico.NumeroErroes() + " en La cadena! Revisalos en el reporte", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } else { //EN ESTE PUNTO YA TENGO LAS CLASES CON SU AST..... AHORA DEBERIA DE EMPEZAR LA EJECUCION DEL PROGRAMA Clase inicio = Estatico.clasesDisponibles.getFirstClassWithMain(); if (inicio != null) { Ambito am = new Ambito(null, inicio.idClase.ToLower(), inicio.ArchivoOrigen); am = (Ambito)inicio.Ejecutar(am); inicio.ejecutaMain(am); //am.ImprimeAmbito(); } } }
public object getValor(Ambito ambito) { try { Clase obj = Estatico.clasesDisponibles.getClase(this.tipo); if (obj != null) { //TENGO QUE COMPILAR LA CLASE PRIMERO /// List <Object> valores = getValoresParams(ambito); /// Ambito auxiliar = new Ambito(null, obj.idClase, obj.ArchivoOrigen); auxiliar = (Ambito)obj.Ejecutar(auxiliar); ///////////////////////////////////// ClaveFuncion clave = new ClaveFuncion(obj.idClase.ToLower(), "vacio", getNodosParametros(ambito)); //////////////////////////////////////////////// /// TOMO EL CONSTRUCCTOR Constructor c = auxiliar.getConstructor(clave); ///////////////////////////////////////////////// if (c != null) { /// SETEANDO LOS PARAMETROS /// 1) CREO EL CONSTRUCTOR LOCAL Ambito local = new Ambito(auxiliar, this.clase.ToLower(), ambito.archivo); /// 2) SETEO SUS PARAMETROS //local = c.seteaParametrosLocales(local, getValoresParams(ambito)); local = c.seteaParametrosLocales(local, valores); /// EJECUCION DEL CONSTRUCTOR EN SI c.Ejecutar(local); /// 3) LE PASO EL AMBITO AUXILIAR DE LA CLASE AL OBJETO Objeto objeto = new Objeto(obj.idClase.ToLower(), auxiliar); this.valorAux = obj.idClase.ToLower(); /// 4) LO RETORNO return(objeto); } else if (c == null && this.parametros.Count == 0)//CLASE SIN CONSTRUCTOR { /// 1) CREO EL AMBITO LOCAL Ambito local = new Ambito(auxiliar, this.clase.ToLower(), ambito.archivo); Objeto objeto = new Objeto(obj.idClase.ToLower(), auxiliar); this.valorAux = obj.idClase.ToLower(); return(objeto); } else { TError error = new TError("Semantico", "Error Constructor: " + clave.mensajeError + " | Clase: " + this.clase + " | Archivo: " + ambito.archivo, this.linea, this.columna, false); Estatico.errores.Add(error); Estatico.ColocaError(error); } return(null); } else { TError error = new TError("Semantico", "No existe una clase: \"" + this.tipo + "\" Para realizar una Instancia, En Clase: " + this.clase + " | Archivo: " + ambito.archivo, this.linea, this.columna, false); Estatico.errores.Add(error); Estatico.ColocaError(error); } } catch (Exception e) { TError error = new TError("Ejecucion", "Error al Crear un Objeto en Clase: " + this.clase + " | Archivo: " + ambito.archivo + " | Error: " + e.Message, this.linea, this.columna, false); Estatico.errores.Add(error); Estatico.ColocaError(error); } return(new Nulo()); }