コード例 #1
0
        /// <summary>
        /// Static version of the Expression Evaluator
        /// </summary>
        /// <param name="expression">expression to be evaluated</param>
        /// <param name="handler">attach a custom function handler</param>
        /// <returns></returns>
        public static object Evaluate(string expression, AdditionalFunctionEventHandler handler)
        {
            ExpressionEval expr = new ExpressionEval(expression);

            expr.AdditionalFunctionEventHandler += handler;
            return(expr.Evaluate());
        }
コード例 #2
0
        /// <summary>
        /// Executes the function based upon the name of the function
        /// </summary>
        /// <param name="name">name of the function to execute</param>
        /// <param name="p">parameter list</param>
        /// <returns>returned value of executed function</returns>
        //[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity")]
        private object ExecuteFunction(string name, object[] p)
        {
            object[] parameters = null;
            if (p != null)
            {
                parameters = (object[])p.Clone();
                for (int x = 0; x < parameters.Length; x++)
                {
                    if (parameters[x] is IExpression)
                    {
                        parameters[x] = ((IExpression)parameters[x]).Evaluate();
                    }
                }
            }
            switch (name.ToLower(CultureInfo.CurrentCulture))
            {
            // Math functions
            case "sin":     return(Math.Sin(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "cos":     return(Math.Cos(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "tan":     return(Math.Tan(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "sec":     return(1 / Math.Cos(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "csc":     return(1 / Math.Sin(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "cot":     return(1 / Math.Tan(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "asin":    return(Math.Asin(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "acos":    return(Math.Acos(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "atan":    return(Math.Atan(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "sinh":    return(Math.Sinh(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "cosh":    return(Math.Cosh(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "tanh":    return(Math.Tanh(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "abs":     return(Math.Abs(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "sqrt":    return(Math.Sqrt(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "ciel":    return(Math.Ceiling(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "floor":   return(Math.Floor(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "exp":     return(Math.Exp(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "log10":   return(Math.Log10(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "log":     return((parameters.Length > 1) ?
                                   Math.Log(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], CultureInfo.CurrentCulture)) :
                                   Math.Log(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            case "max":     return(Math.Max(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], CultureInfo.CurrentCulture)));

            case "min":     return(Math.Min(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], CultureInfo.CurrentCulture)));

            case "pow":     return(Math.Pow(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture), Convert.ToDouble(parameters[1], CultureInfo.CurrentCulture)));

            case "round":   return((parameters.Length > 1) ?
                                   Math.Round(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture), Convert.ToInt32(parameters[1], CultureInfo.CurrentCulture)) :
                                   Math.Round(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture)));

            //case "trunc":   return Math.Truncate(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture));
            case "e":       return(Math.E);

            case "pi":      return(Math.PI);

            //DateTime functions
            case "now":     return(DateTime.Now);

            case "today":   return(DateTime.Today);

            case "mindate": return(DateTime.MinValue);

            case "maxdate": return(DateTime.MaxValue);

            case "monthname": return((new DateTime(2000, Convert.ToInt32(parameters[0]), 1)).ToString("MMMM"));

            case "adddays": return(Convert.ToDateTime(parameters[0]).AddDays(Convert.ToInt32(parameters[1])));

            case "addmonths": return(Convert.ToDateTime(parameters[0]).AddMonths(Convert.ToInt32(parameters[1])));

            case "addyears": return(Convert.ToDateTime(parameters[0]).AddYears(Convert.ToInt32(parameters[1])));

            case "addhours": return(Convert.ToDateTime(parameters[0]).AddHours(Convert.ToInt32(parameters[1])));

            case "addminutes": return(Convert.ToDateTime(parameters[0]).AddMinutes(Convert.ToInt32(parameters[1])));

            case "addseconds": return(Convert.ToDateTime(parameters[0]).AddSeconds(Convert.ToInt32(parameters[1])));

            //Formatting Functions
            case "fmtnum":  return(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture).ToString("" + parameters[1], CultureInfo.CurrentCulture));

            case "fmtdate": return(Convert.ToDateTime(parameters[0], CultureInfo.CurrentCulture).ToString("" + parameters[1], CultureInfo.CurrentCulture));

            //Numerical Expression Evaluation
            case "expr":
            {
                ExpressionEval eval = new ExpressionEval("" + parameters[0]);
                eval.AdditionalFunctionEventHandler += this.AdditionalFunctionEventHandler;
                eval._variables = this._variables;
                return(eval.Evaluate());
            }

            //Casting Functions
            case "cdbl":    return(Convert.ToDouble(parameters[0], CultureInfo.CurrentCulture));

            case "cint":    return(Convert.ToInt32(parameters[0], CultureInfo.CurrentCulture));

            case "clong":   return(Convert.ToInt64(parameters[0], CultureInfo.CurrentCulture));

            case "cuint":   return(Convert.ToUInt32(parameters[0], CultureInfo.CurrentCulture));

            case "culong":  return(Convert.ToUInt64(parameters[0], CultureInfo.CurrentCulture));

            case "cdatetime": return(Convert.ToDateTime(parameters[0], CultureInfo.CurrentCulture));

            case "str":     return(parameters[0].ToString());

            //Logical Functions
            case "iif":     return(Iif(parameters));

            case "case":    return(Case(parameters));

            //security fucntions
            case "currentuserid": return(WindowsIdentity.GetCurrent().Name.ToLower());

            default:        return(AdditionalFunctionHelper(name, parameters));
            }
        }
コード例 #3
0
        /// <summary>
        /// Execute JVP Assembly Code
        /// </summary>
        /// <param name="casmcode">Assembly Code</param>
        /// <param name="data">Data to be processed</param>
        /// <returns>possible processed data</returns>
        public object ExecuteASM(string asmcode, object data)
        {
            object RETURN = null;

            try
            {
                string[] Instructions = Splitter.Split(asmcode.Replace("\r\n", "")); // all instructions
                Variables.Add("data", data);
                foreach (string ins in Instructions)
                {
                    if (ins != string.Empty && ins != null)
                    {
                        string opcode  = ins.Substring(0, 4);
                        string operand = ins.Remove(0, 5);
                        switch (opcode)
                        {
                        case "DEVI":
                            Expr.SetVariable(operand.Split(',')[0], ConvertVal(operand.Split(',')[1], operand.Split(',')[2]));
                            break;

                        case "DGVI":

                            Variables.Add(operand.Split(',')[0], ConvertVal(operand.Split(',')[1], operand.Split(',')[2]));
                            break;

                        case "FILL":
                            if (Variables.ContainsKey(operand.Split(',')[0]))
                            {
                                Variables[operand.Split(',')[0]] = ConvertVal(operand.Split(',')[1], operand.Split(',')[2]);
                            }
                            break;

                        case "PUSH":
                            if (Variables.ContainsKey(operand.Split(',')[0]))
                            {
                                stack.Add(Variables[operand.Split(',')[0]]);
                            }
                            else
                            {
                                stack.Add(ConvertVal(operand.Split(',')[0], operand.Split(',')[1]));
                            }
                            break;

                        case "CALL":
                            Functions.Add(CreateFunction(operand));
                            break;

                        case "POPV":
                            if (Variables.ContainsKey(operand))
                            {
                                if (stack.Contains(Variables[operand]))
                                {
                                    stack.Remove(Variables[operand]);
                                }
                            }
                            else
                            {
                                stack.Remove(operand);
                            }
                            break;

                        case "PRET":
                            string[] pret = operand.Split(',');
                            if (Variables.ContainsKey(pret[0]))
                            {
                                RETURN = Variables[pret[0]];
                            }
                            else
                            {
                                RETURN = ConvertVal(pret[0], pret[1]);
                            }
                            break;

                        case "SAYT":
                            string[] pvs = operand.Split(',');
                            string   pa  = "";
                            foreach (string pv in pvs)
                            {
                                if (Variables.ContainsKey(pv))
                                {
                                    pa = pa + " " + Variables[pv].ToString();
                                }
                                else
                                {
                                    pa = pa + " " + pv;
                                }
                            }
                            JVPCore.SendSignal("SPEECH", pa);
                            break;

                        case "MSGB":
                            string[] avs = operand.Split(',');
                            string   sa  = "";
                            foreach (string xv in avs)
                            {
                                if (Variables.ContainsKey(xv))
                                {
                                    sa = sa + " " + Variables[xv].ToString();
                                }
                                else
                                {
                                    sa = sa + " " + xv;
                                }
                            }
                            System.Windows.Forms.MessageBox.Show(sa);
                            break;

                        case "SDNG":
                            string[] savs = operand.Split(',');

                            if (Variables.ContainsKey(savs[1]))
                            {
                                JVPCore.SendSignal(savs[0], Variables[savs[1]].ToString());
                            }
                            else
                            {
                                JVPCore.SendSignal(savs[0], savs[1]);
                            }


                            break;

                        case "EVAL":
                            // evaluate expression and assign variable if exist
                            if (Variables.ContainsKey(operand.Split(',')[0]))
                            {
                                Expr.Expression = operand.Split(',')[1];
                                if (operand.Split(',')[2] == "Int32")
                                {
                                    Variables[operand.Split(',')[0]] = Expr.EvaluateInt();
                                }
                                else if (operand.Split(',')[2] == "Bool")
                                {
                                    Variables[operand.Split(',')[0]] = Expr.EvaluateBool();
                                }
                                else if (operand.Split(',')[2] == "Double")
                                {
                                    Variables[operand.Split(',')[0]] = Expr.EvaluateDouble();
                                }
                                else if (operand.Split(',')[2] == "Int64")
                                {
                                    Variables[operand.Split(',')[0]] = Expr.EvaluateLong();
                                }
                                else
                                {
                                    Variables[operand.Split(',')[0]] = Expr.Evaluate();
                                }
                            }
                            else
                            {
                                Expr.Expression = operand.Split(',')[1];
                                RETURN          = Expr.Evaluate();
                            }
                            break;
                        }
                    }
                }
                if (Functions.Count != 0)
                {
                    foreach (Function fn in Functions)
                    {
                        if (RETURN == null)
                        {
                            RETURN = fn.Invoke();
                        }
                        else
                        {
                            fn.Invoke();
                        }
                    }
                }
            }
            catch
            {
                // Log.LogEvent("Execution Failed ASM " + asmcode, Application.StartupPath + @"\Logs\JVPEVENTS.txt");
                return(null);
            }
            finally
            {
                Variables.Clear();
                stack.Clear();
                Functions.Clear();
            }
            return(RETURN);
        }
コード例 #4
0
        /// <summary>
        /// Static version of the Expression Evaluator
        /// </summary>
        /// <param name="expression">expression to be evaluated</param>
        /// <returns></returns>
        public static object Evaluate(string expressionString)
        {
            ExpressionEval expression = new ExpressionEval(expressionString);

            return(expression.Evaluate());
        }