예제 #1
0
        /// <summary>
        /// Auto incrementa o decrementa una variable
        /// </summary>
        /// <param name="name"></param>
        /// <param name="value"></param>
        internal void AutoSum(string name, double val)
        {
            ScopeMember member = GetVar(name);

            if (member != null && member.IsVar)
            {
                member.Value = Calc.Add(member.Value, val);
            }
        }
예제 #2
0
        /// <summary>
        /// Corre una funcion y retorna su valor
        /// </summary>
        /// <param name="fnct"></param>
        /// <returns></returns>
        internal object Raise(ParseTreeNode fnct, Scope param_scope)
        {
            object result = null;

            //func_name( param_list ) ;
            if (fnct.ChildNodes.Count == 2)
            {
                String        func_name = fnct.ChildNodes[0].FindTokenAndGetText();
                ParseTreeNode pars      = fnct.ChildNodes[1];
                int           parSize   = pars.ChildNodes.Count;

                if (func_name.Equals("DibujarAST") && parSize == 1 && ProgramBuiltIns.DrawAST(pars))
                {
                    return(null);
                }

                if (func_name.Equals("DibujarEXP") && parSize == 1 && ProgramBuiltIns.DrawEXP(pars))
                {
                    return(null);
                }

                List <Parameter> parameters = CreateParams(pars);

                if (func_name.Equals("Mostrar") && parSize >= 1 && parameters[0].Type == ParameterType.String)
                {
                    ProgramBuiltIns.Log(pars, param_scope, fnct);
                }
                else
                {
                    //Si se encuentra la funcion, los parametros son agregados a ella adentro de la funcion
                    ScopeMember funct = GetFunction(func_name, parameters);

                    if (funct != null)
                    {
                        Program.Uncertainty = funct.Uncertainty;
                        Program.ImagePath   = funct.ImagePath;

                        result = funct.Raise();

                        //check result validity
                        if (result == null && funct.Type != "Vacio")
                        {
                            Logger.AddError(fnct, "No se devolvio ningun valor de la funcion [" + funct.Name + "] de tipo [" + funct.Type + "].");
                        }
                    }

                    else
                    {
                        Logger.AddError(fnct, string.Format("No se encontró la función [{0}].", func_name));
                    }
                }
            }

            return(result);
        }
예제 #3
0
        /// <summary>
        /// Agregar variable
        /// </summary>
        /// <param name="type"></param>
        /// <param name="name"></param>
        /// <param name="value"></param>
        public void AddVar(string type, string name, object value)
        {
            if (!ExistInCurrentScope(name))
            {
                ScopeMember var = new ScopeMember(type, name, value);

                Vars.Add(var);
            }
            else
            {
                Logger.AddWarning(string.Format("Variable [{0} {1} = {2}] declarada anteriormente. No se modifico el valor inicial.", type, name, value));
            }
        }
예제 #4
0
        /// <summary>
        /// Obtiene la variable, buscándola en todos los ambitos que hay
        /// </summary>
        /// <param name="var_name"></param>
        /// <returns></returns>
        internal ScopeMember GetVar(string var_name)
        {
            var scope = this;

            do
            {
                ScopeMember val = scope.GetVarInCurrentScope(var_name);

                if (val != null)
                {
                    return(val);
                }

                scope = scope.Parent;
            }while (scope != null);

            return(Program.Global.GetVarInCurrentScope(var_name));
        }
예제 #5
0
        /// <summary>
        /// Asigna un valor a una variable ya existente
        /// </summary>
        /// <param name="node"></param>
        internal void AsignVar(ParseTreeNode node)
        {
            if (node.ChildNodes.Count == 2)
            {
                string name = node.ChildNodes[0].FindTokenAndGetText();

                ScopeMember member = GetVar(name);

                if (member != null && member.IsVar)
                {
                    member.Value = Solve(node.ChildNodes[1]);
                }
            }
            else
            {
                Logger.AddError(node, "Variable no encontrada. ¿Esta seguro que la inicializó?");
            }
        }
예제 #6
0
 /// <summary>
 /// Agrega una funcion al scope
 /// </summary>
 /// <param name="funct"></param>
 internal void AddFunct(ScopeMember funct)
 {
     Functions.Add(funct);
 }