Ejemplo n.º 1
0
        /*
         * Metodo de la implementacion
         * @ts tabla de simbolos global
         * @user usuario que ejecuta la accion
         * @baseD base de datos donde estamos ejecutando todo
         * @mensajes linkedlist con la salida deseada
         */
        public object ejecutar(TablaDeSimbolos ts, Ambito ambito, TablaDeSimbolos tsT)
        {
            Mensaje         ms        = new Mensaje();
            TablaDeSimbolos newAmbito = new TablaDeSimbolos();

            foreach (Simbolo s in ambito.tablaPadre)
            {
                newAmbito.AddLast(s);
            }

            if (tamanioTotalParametros() == valores.Count())
            {
                int index = 0;
                //-------------------------------------------- CREACION Y ASIGNACION DE PARAMETROS --------------------------------------------------------------
                for (int i = 0; i < parametros.Count(); i++)
                {
                    LinkedList <InstruccionCQL> parametro = parametros.ElementAt(i).lista;

                    for (int j = 0; j < parametro.Count(); j++)
                    {
                        Declaracion d = (Declaracion)parametro.ElementAt(j);
                        d.parametro = true;
                        object rd = d.ejecutar(newAmbito, ambito, tsT);
                        if (rd == null)
                        {
                            return(null);
                        }
                        Asignacion a = new Asignacion(d.id, l, c, valores.ElementAt(index), "ASIGNACION");
                        a.tPadre = ts;
                        object ra = a.ejecutar(newAmbito, ambito, tsT);
                        if (ra == null)
                        {
                            return(null);
                        }
                        index++;
                    }
                }
                //--------------------------------------------------- INSTRUCCIONES DEL PROCEDURE ----------------------------------------------
                foreach (InstruccionCQL ins in cuerpo)
                {
                    object r = ins.ejecutar(newAmbito, ambito, tsT);
                    if (r == null)
                    {
                        return(null);
                    }
                    else if (r.GetType() == typeof(Retorno))
                    {
                        object re = ((Retorno)r).valor;
                        if (re != null)
                        {
                            LinkedList <object> temp;
                            if (re.GetType() == typeof(LinkedList <object>))
                            {
                                temp = (LinkedList <object>)re;
                            }
                            else
                            {
                                temp = new LinkedList <object>();
                                temp.AddLast(re);
                            }
                            string idGenerado = idOut(temp);
                            if (idGenerado == null)
                            {
                                return(null);
                            }
                            if (idGenerado.Equals(identificadorRetornos))
                            {
                                return(temp);
                            }
                            else
                            {
                                ambito.listadoExcepciones.AddLast(new Excepcion("numberreturnsexception", "La cantidad de valores retornados no concuerda con el valor de parametros se esperaba: " + identificadorRetornos + " se obtuvo " + idGenerado));
                                ambito.mensajes.AddLast(ms.error("La cantidad de valores retornados no concuerda con el valor de parametros se esperaba: " + identificadorRetornos + " se obtuvo " + idGenerado, l, c, "Semantico"));
                                return(null);
                            }
                        }
                        return(null);
                    }
                }
                if (identificadorRetornos.Equals(""))
                {
                    return("");
                }
                else
                {
                    ambito.listadoExcepciones.AddLast(new Excepcion("numberreturnsexception", "Se necesita retornar valores de tipo: " + identificadorRetornos));
                    ambito.mensajes.AddLast(ms.error("Se necesita retornar valores de tipo: " + identificadorRetornos, l, c, "Semantico"));
                    return(null);
                }
            }
            else
            {
                ambito.mensajes.AddLast(ms.error("La cantidad de valores no concuerda con la cantidad de parametros", l, c, "Semantico"));
            }

            return(null);
        }
Ejemplo n.º 2
0
        public override object ejecutar(Entorno ent)
        {
            //insertamos a la pila de ciclos
            MasterClass.Display.AddFirst(MasterClass.TipoCiclo.Ciclo);

            //creamos un nuevo entorno y ejecutamos la instruccion inicial
            Entorno entIntermedio = new Entorno(ent);

            this.InsInicial.ejecutar(entIntermedio);

            //ahora obtenemos el valor del valorFinal
            Expresion valorFinal = this.valorFinal.getValor(entIntermedio);

            //mandamos a buscar la variable que acabamos de asignar
            Variable variable = entIntermedio.buscar(this.nombreVarAsignacion, this.linea, this.columna, "La variable");

            //pasamos las variables a un tipo integer
            int valorInicial     = int.Parse(variable.valor.ToString());
            int valorCondicional = int.Parse(valorFinal.valor.ToString());

            //Bifurcacion Up_to  vs  Down_to
            if (this.up_to)
            {
                //validamos que el valor sea menor o igual que el valor final
                while (valorInicial <= valorCondicional)
                {
                    //MessageBox.Show("To "+valorInicial +" , "+valorCondicional);

                    //creamos un nuevo entorno para ejecutar las instrucciones del bloque
                    Entorno ent3     = new Entorno(entIntermedio);
                    Object  retornar = this.instrucciones.ejecutar(ent3);

                    if (retornar != null)
                    {
                        if (typeof(Break).IsInstanceOfType(retornar))
                        {
                            //si viene un break se detiene el flujo del ciclo
                            break;
                        }
                        else if (typeof(Continue).IsInstanceOfType(retornar))
                        {
                            //aqui solo se debe continuar el ciclo
                            //continue;
                        }
                        else if (typeof(Primitivo).IsInstanceOfType(retornar))
                        {
                            //Aqui devolvemos el valor del retorno
                            return(retornar);
                        }
                    }

                    Tipo      tempTipo = new Tipo(Tipo.enumTipo.entero);
                    Primitivo temp     = new Primitivo(tempTipo, valorInicial + 1);

                    //aumentamos el valor de la variable - Creamos una asignacion con un +1
                    Instruccion cheat = new Asignacion(this.nombreVarAsignacion, temp, this.linea, this.columna);
                    cheat.ejecutar(ent3);

                    //evaluamos de nuevo el valor inicial
                    Variable variable2 = ent3.buscar(this.nombreVarAsignacion, this.linea, this.columna, "La variable");
                    valorInicial = int.Parse(variable2.valor.ToString());
                    //MessageBox.Show("Saliendo" + valorInicial + " , " + valorCondicional);
                }
            }
            else
            {
                //validamos que el valor sea menor o igual que el valor final
                while (valorInicial >= valorCondicional)
                {
                    //MessageBox.Show("Downto "+valorInicial + " , " + valorCondicional);
                    //creamos un nuevo entorno para ejecutar las instrucciones del bloque
                    Entorno ent3    = new Entorno(entIntermedio);
                    Object  retorno = this.instrucciones.ejecutar(ent3);

                    if (retorno != null)
                    {
                    }
                    Tipo      tempTipo = new Tipo(Tipo.enumTipo.entero);
                    Primitivo temp     = new Primitivo(tempTipo, valorInicial - 1);

                    //aumentamos el valor de la variable - Creamos una asignacion con un +1
                    Instruccion cheat = new Asignacion(this.nombreVarAsignacion, temp, this.linea, this.columna);
                    cheat.ejecutar(ent3);

                    //evaluamos de nuevo el valor inicial
                    Variable variable2 = ent3.buscar(this.nombreVarAsignacion, this.linea, this.columna, "La variable");
                    valorInicial = int.Parse(variable2.valor.ToString());
                    //MessageBox.Show("Saliendo" + valorInicial + " , " + valorCondicional);
                }
            }

            MasterClass.Display.RemoveFirst();
            return(null);
        }