private Boolean llamadaACalcular(Ambito ambitoPregunta, Object nuevoVal) { Simbolo s = (Simbolo)ambitoPregunta.getSimbolo("respuesta"); if (s != null) { Variable v = (Variable)s; String primerVal = (v.valor.ToString()); Ambito aux = ambitoPregunta.Anterior; ambitoPregunta.Anterior = null; Llamada l = new Llamada("calcular", linea, columna, clase); LLamadaFuncion ll = new LLamadaFuncion(clase, linea, columna, l); ll.Ejecutar(ambitoPregunta); ambitoPregunta.Anterior = aux; if (v.valor.ToString().Equals(primerVal)) { /*SI EL VALOR NO CAMBIO!*/ return(false); } return(true); } return(false); }
public object Ejecutar(Ambito ambito) { try { Simbolo s = (Simbolo)ambito.getSimbolo(this.identificador.ToLower()); if (s != null) { if (s is Variable) { Variable v = (Variable)s; Object valor = v.valor; if (valor is Objeto) { Objeto ob = (Objeto)valor; List <Object> valores = getValoresParams(ambito); if (ob.idClase.ToLower().Equals("pregunta")) { Ambito ambitoPregunta = ob.ambito; // obtengo el ambito de la pregunta /*obtendre el constructor de la pregunta para poder setear los parametros que hagan falta*/ ClaveFuncion clave = new ClaveFuncion(this.identificador.ToLower(), "vacio", getNodosParametros(ambito)); Constructor constructor = (Constructor)ambitoPregunta.getConstructor(clave); if (constructor != null) { Variable instruc = (Variable)ambitoPregunta.getSimbolo("instr"); List <Instruccion> declaraciones = (List <Instruccion>)instruc.valor;/*ya tengo las instrucciones que hacen la ejecucion de delcaraciones*/ if (existePropiedad("etiqueta", ambitoPregunta)) { /*EN CASO QUE LA PROPIEDAD YA EXISTA EN LA PREGUNTA: RESETEO EL AMBITO*/ ambitoPregunta = new Ambito(ambitoPregunta.Anterior, ambitoPregunta.idAmbito, ambitoPregunta.archivo); ambitoPregunta.agregarConstructor(clave, constructor); ambitoPregunta.agregarVariableAlAmbito("instr", instruc); } /*aqui ya setee los parametros que venian en la pregunta en el ambito global ahora voy a ejecutar las declaraciones sobre este ambito*/ ambitoPregunta = constructor.seteaParametrosLocales(ambitoPregunta, valores); ejecutaLasDeclaracionesPregunta(ambitoPregunta, declaraciones); /*carga todo lo de la pregunta*/ Pregunta p = new Pregunta(ambitoPregunta, this.identificador.ToLower(), this.numero); // formo la pregunta Nota n = new Nota(p); n.ShowDialog(); if (llamaMostar) { Ambito aux = ambitoPregunta.Anterior; ambitoPregunta.Anterior = null; LLamadaFuncion l = new LLamadaFuncion(clase, linea, columna, new Llamada("mostrar", linea, columna, clase)); l.Ejecutar(ambitoPregunta); ambitoPregunta.Anterior = aux; } ob.ambito = ambitoPregunta; /*ASIGNO EL NUEVO AMBITO A OB*/ if (n.salir != null) { return(n.salir); } } else { TError error = new TError("Semantico", "Para el simbolo: \"" + identificador + "\" No existe una pregunta de tipo Nota que rebiba los parametros especificados | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } } else { TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Pregunta, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } } else { TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Nota, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } } else { TError error = new TError("Semantico", "El simbolo: \"" + identificador + "\" No es un objeto de tipo Nota, por lo que no es aplicable la instrucccion | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } } else { TError error = new TError("Semantico", "La referencia a la pregunta de tipo Nota: \"" + identificador + "\" es Nulo, no existe en este ambito | Clase: " + clase + " | Archivo: " + ambito.archivo, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } } catch (Exception e) { TError error = new TError("Ejecucion", "Error al ejecutar la Instrccion Nota() | Clase: " + clase + " | Archivo: " + ambito.archivo + " | Mensaje: " + e.Message, linea, columna, false); Estatico.ColocaError(error); Estatico.errores.Add(error); } return(new Nulo()); }