public static void asginar(Simbolo ladoIzq, Object ladoDer)
        {
            ZContenedor derecho = desenvolver(ladoDer);

            if (ladoIzq.obtenerInstanciaTipo() == derecho.Origen)
            {
                ladoIzq.definirValor(derecho);
                return;
            }

            if (ladoIzq.obtenerInstanciaTipo() is TeDeULista && derecho.Origen == TiposPrimitivos.tipoListaVacia)
            {
                ladoIzq.definirValor(new ZLista(new List <ZContenedor>(), ladoIzq.obtenerInstanciaTipo()));
                return;
            }


            if (derecho.Origen == TiposPrimitivos.tipoNulo)
            {
                ladoIzq.definirValor(TiposPrimitivos.instanicaNulo);
                return;
            }


            if (isNumeric(ladoIzq))
            {
                casteoImplicitoNumero(ladoIzq, derecho);
                return;
            }



//            throw new SemanticError("se intenta asignar algo que no es del mismo tipo");
            throw new SemanticError($"No se puede asignar valor de tipo '{derecho.Origen.Nombre}' en variable de tipo '{ladoIzq.obtenerInstanciaTipo().Nombre}'");
        }
        public static void casteoImplicitoNumero(Simbolo algo1, ZContenedor d2)
        {
            if (algo1.obtenerInstanciaTipo() == TiposPrimitivos.tipoNumero && d2 is ZDecimal n2)
            {
                algo1.definirValor(new ZNumero((int)n2.obtenerValor()));
                return;
            }

            if (algo1.obtenerInstanciaTipo() == TiposPrimitivos.tipoDicimal && d2 is ZNumero n3)
            {
                algo1.definirValor(new ZDecimal(n3.obtenerValor()));
                return;
            }

            throw new SemanticError($"No se puede asignar valor de tipo '{d2.Origen.Nombre}' en variable de tipo '{algo1.obtenerInstanciaTipo().Nombre}'");
        }
        public static void AsignarValorInicial(Simbolo sim)
        {
            if (sim.obtenerInstanciaTipo() == TiposPrimitivos.tipoBool)
            {
                sim.definirValor(new ZBool(false));
                return;
            }

            if (sim.obtenerInstanciaTipo() == TiposPrimitivos.tipoNumero)
            {
                sim.definirValor(new ZNumero(0));
                return;
            }

            if (sim.obtenerInstanciaTipo() == TiposPrimitivos.tipoDicimal)
            {
                sim.definirValor(new ZDecimal(0.0));
                return;
            }

            sim.definirValor(TiposPrimitivos.instanicaNulo);
        }