예제 #1
0
        public override string ToString()
        {
            FunctionAttribute funcAttrib = (FunctionAttribute)Attribute.GetCustomAttribute(this.GetType(), typeof(FunctionAttribute));

            return(funcAttrib.FunctionName);
        }
예제 #2
0
        public void RegisterFunction(Type funcType)
        {
            FunctionAttribute funcAttrib = (FunctionAttribute)Attribute.GetCustomAttribute(funcType, typeof(FunctionAttribute));

            functionList.Add(funcAttrib.FunctionName.ToUpper(), funcType);
        }
예제 #3
0
        public object Exec()
        {
            double tempDouble;
            object ret = "";
            int    i   = 0;
            double a   = 0;
            double b   = 0;
            bool   a1  = true;
            bool   b1  = true;
            string tok = string.Empty;

            //Go though the tokens
            al = new Stack <object>();
            int x = 0;

            while (i < Tokens.Count)
            {
                tok = Tokens[i].sToken;

                switch (Tokens[i].sType)
                {
                case RPNTokenType.NONE:
                    break;

                case RPNTokenType.BOOL:
                    if (tok.ToLower().Equals("true"))
                    {
                        al.Push(true);
                        break;
                    }
                    else
                    {
                        al.Push(false);
                        break;
                    }
                    break;

                case RPNTokenType.ALPHA:
                    if (vars.TryGetValue(tok, out RPNArguments arg))
                    {
                        a = arg.value;
                        al.Push(a);
                    }
                    else
                    {
                        throw new Exception($"Value [{tok}] not exists");
                    }
                    break;

                case RPNTokenType.NUMBER:
                    tempDouble = 0;
                    RPNUtils.TryToDouble(tok, out tempDouble);
                    al.Push(tempDouble);
                    break;

                case RPNTokenType.STRING:
                    al.Push(tok.Substring(1, tok.Length - 2));
                    break;

                case RPNTokenType.FUNCTION:

                    if (Environment != null)
                    {
#if DEBUG
                        String argumentList = "";
#endif

                        String funcName = Tokens[i].sToken;
                        funcName = funcName.Substring(0, funcName.Length - 1);


                        var func = Environment.FindFunction(funcName);
                        if (func != null)
                        {
                            FunctionAttribute funcAttrib = (FunctionAttribute)Attribute.GetCustomAttribute(func.GetType(), typeof(FunctionAttribute));
                            List <object>     arguments  = new List <object>();



                            if (funcAttrib.ParamTypes != null && funcAttrib.ParamTypes.Length > 0)
                            {
                                foreach (var paramType in funcAttrib.ParamTypes)
                                {
                                    object obj = al.Pop();
                                    func.Params.Add(obj);
#if DEBUG
                                    argumentList += " ";
                                    argumentList += obj.ToString();
#endif
                                }
                            }

                            object retObject = func.Calc();

                            al.Push(retObject);
#if DEBUG
                            Console.WriteLine($"Function , {funcName}({argumentList})  = {retObject.ToString()}");
#endif

                            //   al.Push(r);
                        }
                    }
                    break;

                case RPNTokenType.OPERAND:
                    object r = 0;

                    switch (Tokens[i].Operation)
                    {
                    case RPNOperandType.JUSTPLUS:
                        a = Convert.ToDouble(al.Pop());
                        r = +a;
#if DEBUG
                        Console.WriteLine($"JustPlus , {r}  = {a.ToString()}");
#endif

                        break;

                    case RPNOperandType.PLUS:
                        a = Convert.ToDouble(al.Pop());
                        var b11 = al.Pop();
                        if (b11 is DateTime)
                        {
                            DateTime dDateTime = (DateTime)b11;
                            r = dDateTime.AddHours(a);
                        }
                        else
                        {
                            b = Convert.ToDouble(b11);
                            r = a + b;
                        }

#if DEBUG
                        Console.WriteLine($"{b.ToString()} + {a.ToString()} = {r.ToString()}");
#endif
                        break;

                    case RPNOperandType.JUSTMINUS:
                        a = Convert.ToDouble(al.Pop());
                        r = -a;
                        break;

                    case RPNOperandType.MINUS:
                        var t = al.Pop();
                        a = Convert.ToDouble(t);
                        var b12 = al.Pop();
                        if (b12 is DateTime)
                        {
                            DateTime dDateTime = (DateTime)b12;
                            r = dDateTime.AddHours(-a);
                        }
                        else
                        {
                            b = Convert.ToDouble(b12);
                            r = b - a;
                        }
#if DEBUG
                        Console.WriteLine($"{b} - {a} = {r}");
#endif

                        break;

                    case RPNOperandType.MULITIPLY:
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = a * b;
#if DEBUG
                        Console.WriteLine($"{b} * {a} = {r}");
#endif

                        break;

                    case RPNOperandType.DIVIDE:
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b / a);

#if DEBUG
                        Console.WriteLine($"{b} / {a} = {r}");
#endif
                        break;

                    case RPNOperandType.EXPONENTIATION:
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = Math.Pow(b, a);
#if DEBUG
                        Console.WriteLine($"{b} ^ {a} = {r}");
#endif
                        break;

                    case RPNOperandType.DIV:          // "/="
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b / a);
#if DEBUG
                        Console.WriteLine($"{b} /= {a} = {r}");
#endif
                        break;

                    case RPNOperandType.MOD:          //"%=",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b %= a);
#if DEBUG
                        Console.WriteLine($"{b} %= {a} = {r}");
#endif
                        break;

                    case RPNOperandType.LESS:          //"<",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b < a);
#if DEBUG
                        Console.WriteLine($"{b} < {a} = {r}");
#endif
                        break;

                    case RPNOperandType.GREATER:          //">",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b > a);
#if DEBUG
                        Console.WriteLine($"{b} > {a} = {r}");
#endif
                        break;

                    case RPNOperandType.LESSOREQUAL:          //"<=",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b <= a);
#if DEBUG
                        Console.WriteLine($"{b} <= {a} = {r}");
#endif
                        break;

                    case RPNOperandType.GREATEOREQUAL:          //">=",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b >= a);
#if DEBUG
                        Console.WriteLine($"{b} >={a} = {r}");
#endif
                        break;

                    case RPNOperandType.NOTEQUAL:          //"!=",
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b != a);
#if DEBUG
                        Console.WriteLine($"{b} !={a} = {r}");
#endif
                        break;

                    case RPNOperandType.EQUAL:          //"=="
                        a = Convert.ToDouble(al.Pop());
                        b = Convert.ToDouble(al.Pop());
                        r = (b == a);
#if DEBUG
                        Console.WriteLine($"{b} =={a} = {r}");
#endif
                        break;

                    case RPNOperandType.OR:          //"||",
                        a1 = Convert.ToBoolean(al.Pop());
                        b1 = Convert.ToBoolean(al.Pop());
                        r  = (b1 || a1);
#if DEBUG
                        Console.WriteLine($"{b1} || {a1} = {r}");
#endif
                        break;


                    case RPNOperandType.AND:          //"&&",

                        a1 = Convert.ToBoolean(al.Pop());
                        b1 = Convert.ToBoolean(al.Pop());
                        r  = (b1 && a1);
#if DEBUG
                        Console.WriteLine($"{b1} && {a1} = {r}");
#endif
                        break;

                    case RPNOperandType.NOT:          //"!",
                        a1 = Convert.ToBoolean(al.Pop());
                        r  = (!a1);
#if DEBUG
                        Console.WriteLine($" !{a1} = {r}");
#endif
                        break;
                    }
                    al.Push(r);
                    break;
                }
                i++;
            }

            while (x < al.Count)
            {
                ret = al.Pop();
            }

            return(ret);
        }