/// <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()); }
/// <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)); } }
/// <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); }
/// <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()); }