コード例 #1
0
        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");
        }
コード例 #2
0
        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);
        }