コード例 #1
0
        public override Resultado ejecutar(Contexto ctx, int nivel)
        {
            //Obiene nombre de la variable, el valor, si es incremento o decremento y el cuerpo de la funcion
            String        nombreVar  = instruccion.ChildNodes[0].Token.Text;
            String        tipoVar    = Constantes.T_NUM;
            Resultado     ValorVar   = new Expresion(instruccion.ChildNodes[1].ChildNodes[0]).resolver(ctx);
            ParseTreeNode NodoCuerpo = instruccion.ChildNodes[4];
            String        inc_dec    = instruccion.ChildNodes[3].ToString();
            //si el valor de la variable no es el mismo a number se sale
            String castValue = "";

            switch (tipoVar)
            {
            case Constantes.T_BOOL:
                castValue = "" + Convert.ToInt32(Convert.ToBoolean(ValorVar.Valor));
                break;

            case Constantes.T_NUM:
                castValue = ValorVar.Valor;
                break;

            default:
                return(FabricarResultado.creaFail());
            }
            // Creo variablew
            Variable var = new Variable(nombreVar, castValue, tipoVar, nivel);

            //si existe, es error entonces
            if (ctx.existeVariable(nombreVar))
            {
                return(FabricarResultado.creaFail());
            }
            ctx.setVariable(var);
            Resultado exec = null;

            while (true)
            {
                Resultado condicionPara = new Expresion(instruccion.ChildNodes[2].ChildNodes[0]).resolver(ctx);
                if (condicionPara.Tipo != Constantes.T_BOOL)
                {
                    ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "La condicion no retorna un valor booleando", Interprete.archivo);
                    return(FabricarResultado.creaFail());
                }

                bool cond = condicionPara.Boleano;

                if (!cond)
                {
                    exec = FabricarResultado.creaOk();
                    break;
                }

                Cuerpo cuerpo = new Cuerpo(NodoCuerpo, true);
                exec = cuerpo.ejecutar(ctx, nivel + 1);
                if (exec.esContinuar())
                {
                    continue;
                }
                if (exec.esDetener())
                {
                    exec = FabricarResultado.creaOk();
                    break;
                }
                if (exec.esRetorno())
                {
                    break;
                }

                Variable asigTemp = ctx.getVariable(nombreVar);
                if (asigTemp != null)
                {
                    if (asigTemp.Tipo == Constantes.T_NUM)
                    {
                        double valor = Convert.ToDouble(asigTemp.Valor);
                        if (inc_dec == Constantes.INCREMENTO)
                        {
                            valor++;
                        }
                        else
                        {
                            valor--;
                        }
                        asigTemp.Valor = valor.ToString();
                    }
                    ctx.ActualizarValor(nombreVar, asigTemp);
                }
                ctx.limpiarContexto(nivel + 1);
            }

            ctx.limpiarContexto(nivel + 1);
            ctx.limpiarContexto(nivel);

            return(exec);
        }
コード例 #2
0
        public Resultado ejecutar(Contexto ctx, int nivel)
        {
            String nombreVar = instruccion.ChildNodes[0].Token.Text;

            if (!existeVariable(ctx, nombreVar))
            {
                return(FabricarResultado.creaFail());
            }
            Resultado res  = new Expresion(instruccion.ChildNodes[1].ChildNodes[0]).resolver(ctx);
            String    tipo = res.Tipo;

            if (tipo == Constantes.T_ERROR)
            {
                ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "No se puedo resolver la expresion", Interprete.archivo);
                return(FabricarResultado.creaFail());
                //error en la expresion
            }
            Variable destino = obtenerVariable(ctx, nombreVar);
            String   tipoVar = destino.Tipo;
            String   casteo  = Constantes.ValidarTipos(tipoVar, tipo, Constantes.MT_ASIG);
            String   valor   = null;

            if (casteo == Constantes.T_ERROR)
            {
                ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "No se puede asignar ese tipo de dato", Interprete.archivo);
                //no se puede asignar ese tipo
            }
            else
            {
                String tmp = "";
                switch (tipoVar)
                {
                case Constantes.T_STR:
                    switch (tipo)
                    {
                    case Constantes.T_BOOL:
                        tmp = "" + Convert.ToInt32(Convert.ToBoolean(res.Valor));
                        break;

                    default:
                        tmp = res.Valor;
                        break;
                    }
                    break;

                case Constantes.T_NUM:
                    switch (tipo)
                    {
                    case Constantes.T_BOOL:
                        tmp = "" + Convert.ToInt32(Convert.ToBoolean(res.Valor));
                        break;

                    case Constantes.T_NUM:
                        tmp = res.Valor;
                        break;

                    default:

                        ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "error de casteo", Interprete.archivo);
                        //error por si llegara a pasar aunque no lo creo
                        break;
                    }
                    break;

                case Constantes.T_BOOL:
                    switch (tipo)
                    {
                    case Constantes.T_BOOL:
                        tmp = res.Valor;
                        break;

                    default:
                        ListaErrores.getInstance().setErrorSemantico(instruccion.Token.Location.Line, instruccion.Token.Location.Line, "error de casteo", Interprete.archivo);
                        //error por si llegara a pasar aunque no lo creo
                        break;
                    }
                    break;
                }
                valor = tmp;
            }
            destino.Valor = valor;

            ctx.ActualizarValor(nombreVar, destino);
            return(FabricarResultado.creaOk());
        }