예제 #1
0
        public override object Execute(Ambit ambit)
        {
            Identifier buscar = new Identifier();

            //BUSCA LA VARIABLE SI NO HA SIDO DECLARADA
            if (!ambit.Ambit_name_inmediato.Equals("Function") && !ambit.Ambit_name_inmediato.Equals("Procedure"))
            {
                buscar = ambit.getVariable(id);
            }
            //SIGFINICA QUE ES UNA DECLARACION EN FUNCION
            else
            {
                buscar = ambit.getVariableFunctionInAmbit(id);
            }

            if (buscar.IsNull)
            {
                try
                {
                    Returned val = this.value.Execute(ambit);

                    //VERIFICA QUE NO HAYA ERROR
                    if (val.getDataType == DataType.ERROR)
                    {
                        return(null);
                    }


                    if (this.type == DataType.CONST)
                    {
                        ambit.save(this.id, val.Value, val.getDataType, true, true, "Constante");
                        return(val.Value);
                    }
                    else
                    {
                        if (val.getDataType == this.type)
                        {
                            ambit.save(this.id, val.Value, val.getDataType, false, isAssigned, "Variable");
                            return(val.Value);
                        }
                        else
                        {
                            set_error("El tipo " + val.getDataType + " no es asignable con " + this.type.ToString(), row, column);
                            return(null);
                        }
                    }
                }
                catch (Exception)
                {
                }
            }
            else
            {
                set_error("La variable '" + id + "' ya fue declarada", row, column);
                return(null);
            }
            return(0);
        }
 //METODO PARA SINTETIZAR VALORES
 public void sintetizar_referencia(Ambit ambit, Function funcion_llamada)
 {
     if (funcion_llamada.Parametros_referencia.Count > 0)
     {
         foreach (SimboloReferencia simbolo in funcion_llamada.Parametros_referencia)
         {
             var variable = ambit.getVariableFunctionInAmbit(simbolo.Actual);
             ambit.setVariableInAmbit(simbolo.Padre, variable.Value, variable.DataType, false, "Variable");
         }
         funcion_llamada.Parametros_referencia.Clear();
     }
 }