Пример #1
0
        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());
 }