public virtual ZContenedor ejecutarFuncion(List <ZContenedor> argumentos) { ZContenedor ambitoFuncion = new ZContenedor(ambitoCapturado, null); ambitoFuncion.enFuncion = true; //los argumentos ya estan desembueltos for (int i = 0; i < nodosDeclararParametro.Count; i++) { Simbolo sim = (Simbolo)nodosDeclararParametro[i].ejecutarSinposicion(ambitoFuncion); sim.definirValor(argumentos[i]); } var result = Utilidades.ejecutarSentencias(listaInstrucciones, ambitoFuncion); //las funciones siempre tienn que retornar algo if (!(result is Retorno r)) { throw new SemanticError("Error la funcion no devuelve nignun valor"); } if (tipoRetorno == r.Tipo || r.Tipo == TiposPrimitivos.tipoNulo) { return(r.Valor); //valor es un Z o sea un z valor } throw new SemanticError("Error la funcion, no es del mismo tipo con el que se retorna"); }
public override object ejecutarSinposicion(ZContenedor e) { foreach (NodoAsignar nodo in filas) { if (nodo.Exp2 is NodoFila n2) { Simbolo algo = (Simbolo)nodo.Exp1.ejecutar(e); ZInstancia ins = algo.obtenerInstanciaTipo().crearInstancia(e); n2.ejecutar(ins); algo.definirValor(ins); } if (!(nodo.Exp2 is NodoFila)) { nodo.ejecutar(e); } } return(null); }