1using System;
2using System.CodeDom.Compiler;
3using System.Reflection;
4using System.Collections;
5using Microsoft.JScript;
6using System.Text.RegularExpressions;
7
8namespace REISys.BHCMIS.UDS.Utilities
9{
10 public class Evaluator
11 {
12 public static int EvalToInteger(string statement)
13 {
14 string s = EvalToString(statement);
15 return int.Parse(s.ToString());
16 }
17
18 public static double ComputeResult(string expression,Hashtable Values)
19 {
20 string newExpression = expression;
21
22
23
24 string[] strarray = Regex.Split(expression, @"[\+\-\%\*()\[\]\{\}]");
25 foreach (string str in strarray)
26 {
27 if (str != "")
28 {
29 newExpression = newExpression.Replace(str, Values[str].ToString());
30 }
31
32 }
33 return EvalToDouble(newExpression);
34 }
35
36 public static double EvalToDouble(string statement)
37 {
38 string s = EvalToString(statement);
39 return double.Parse(s);
40 }
41
42 public static string EvalToString(string statement)
43 {
44 object o = EvalToObject(statement);
45 return o.ToString();
46 }
47
48 public static object EvalToObject(string statement)
49 {
50 return _evaluatorType.InvokeMember(
51 "Eval",
52 BindingFlags.InvokeMethod,
53 null,
54 _evaluator,
55 new object[] { statement }
56 );
57 }
58
59 static Evaluator()
60 {
61 ICodeCompiler compiler;
62 compiler = new JScriptCodeProvider().CreateCompiler();
63
64 CompilerParameters parameters;
65 parameters = new CompilerParameters();
66 parameters.GenerateInMemory = true;
67
68 CompilerResults results;
69 results = compiler.CompileAssemblyFromSource(parameters, _jscriptSource);
70
71 Assembly assembly = results.CompiledAssembly;
72 _evaluatorType = assembly.GetType("Evaluator.Evaluator");
73
74 _evaluator = Activator.CreateInstance(_evaluatorType);
75 }
76
77 private static object _evaluator = null;
78 private static Type _evaluatorType = null;
79 private static readonly string _jscriptSource =
80
81 @"package Evaluator
82 {
83 class Evaluator
84 {
85 public function Eval(expr : String) : String
86 {
87 return eval(expr);
88 }
89 }
90 }";
91 }
92}
93
94