/* * 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); }
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); }