Пример #1
0
 public ExpressionEval.BinaryOp Dequeue()
 {
     if (this._oplist.Count == 0)
     {
         return((ExpressionEval.BinaryOp)null);
     }
     ExpressionEval.BinaryOp binaryOp = (ExpressionEval.BinaryOp) this._oplist[0];
     this._oplist.RemoveAt(0);
     return(binaryOp);
 }
Пример #2
0
        private object EvaluateList()
        {
            ArrayList expressionlist = (ArrayList)this._expressionlist.Clone();

            for (int index = 0; index < expressionlist.Count; ++index)
            {
                if (expressionlist[index] is ExpressionEval.UnaryOp)
                {
                    expressionlist[index] = ExpressionEval.PerformUnaryOp((ExpressionEval.UnaryOp)expressionlist[index], expressionlist[index + 1]);
                    expressionlist.RemoveAt(index + 1);
                }
            }
            ExpressionEval.BinaryOpQueue binaryOpQueue = new ExpressionEval.BinaryOpQueue(expressionlist);
            string str    = "";
            int    index1 = 1;

            while (index1 < expressionlist.Count)
            {
                if (expressionlist[index1] is ExpressionEval.BinaryOp)
                {
                    if (index1 + 1 == expressionlist.Count)
                    {
                        throw new ArgumentException("Expression cannot end in a binary operation: [" + expressionlist[index1].ToString() + "]");
                    }
                }
                else
                {
                    str += string.Format("\n{0} [?] {1}", expressionlist[index1 - 1] is string?(object)("\"" + expressionlist[index1 - 1] + "\"") : expressionlist[index1 - 1], expressionlist[index1] is string?(object)("\"" + expressionlist[index1] + "\"") : expressionlist[index1]);
                    --index1;
                }
                index1 += 2;
            }
            if (str != "")
            {
                throw new ArgumentException("Missing binary operator: " + str);
            }
            for (ExpressionEval.BinaryOp binaryOp = binaryOpQueue.Dequeue(); binaryOp != null; binaryOp = binaryOpQueue.Dequeue())
            {
                int index2 = expressionlist.IndexOf((object)binaryOp);
                expressionlist[index2 - 1] = ExpressionEval.PerformBinaryOp((ExpressionEval.BinaryOp)expressionlist[index2], expressionlist[index2 - 1], expressionlist[index2 + 1]);
                expressionlist.RemoveAt(index2);
                expressionlist.RemoveAt(index2);
            }
            return(!(expressionlist[0] is IExpression) ? expressionlist[0] : ((IExpression)expressionlist[0]).Evaluate());
        }
Пример #3
0
            public void Enqueue(ExpressionEval.BinaryOp op)
            {
                if (op == null)
                {
                    return;
                }
                bool flag = false;

                for (int index = 0; index < this._oplist.Count && !flag; ++index)
                {
                    if (((ExpressionEval.BinaryOp) this._oplist[index]).Precedence > op.Precedence)
                    {
                        this._oplist.Insert(index, (object)op);
                        flag = true;
                    }
                }
                if (flag)
                {
                    return;
                }
                this._oplist.Add((object)op);
            }
Пример #4
0
        private static object DoSpecialOperator(ExpressionEval.BinaryOp op, object v1, object v2)
        {
            if (v1 is string || v2 is string)
            {
                string str  = string.Concat(v1);
                string strB = string.Concat(v2);
                switch (op.Op)
                {
                case "!=":
                    return((object)(str != strB));

                case "+":
                    return((object)(str + strB));

                case "-":
                    throw new ArgumentException("Operator '-' invalid for strings.");

                case "<":
                    return((object)(str.CompareTo(strB) < 0));

                case "<=":
                    return((object)(bool)(str.CompareTo(strB) < 0 ? true : (str == strB ? true : false)));

                case "=":
                case "==":
                    return((object)(str == strB));

                case ">":
                    return((object)(str.CompareTo(strB) > 0));

                case ">=":
                    return((object)(bool)(str.CompareTo(strB) > 0 ? true : (str == strB ? true : false)));
                }
            }
            if (v1 is DateTime || v2 is DateTime)
            {
                DateTime dateTime1 = Convert.ToDateTime(v1, (IFormatProvider)CultureInfo.CurrentCulture);
                DateTime dateTime2 = Convert.ToDateTime(v2, (IFormatProvider)CultureInfo.CurrentCulture);
                switch (op.Op)
                {
                case "!=":
                    return((object)(dateTime1 != dateTime2));

                case "+":
                    throw new ArgumentException("Operator '+' invalid for dates.");

                case "-":
                    return((object)(dateTime1 - dateTime2));

                case "<":
                    return((object)(dateTime1 < dateTime2));

                case "<=":
                    return((object)(dateTime1 <= dateTime2));

                case "=":
                case "==":
                    return((object)(dateTime1 == dateTime2));

                case ">":
                    return((object)(dateTime1 > dateTime2));

                case ">=":
                    return((object)(dateTime1 >= dateTime2));
                }
            }
            double num1 = Convert.ToDouble(v1, (IFormatProvider)CultureInfo.CurrentCulture);
            double num2 = Convert.ToDouble(v2, (IFormatProvider)CultureInfo.CurrentCulture);

            switch (op.Op)
            {
            case "!=":
                return((object)(num1 != num2));

            case "+":
                return((object)(num1 + num2));

            case "-":
                return((object)(num1 - num2));

            case "<":
                return((object)(num1 < num2));

            case "<=":
                return((object)(num1 <= num2));

            case "=":
            case "==":
                return((object)(num1 == num2));

            case ">":
                return((object)(num1 > num2));

            case ">=":
                return((object)(num1 >= num2));

            default:
                throw new ArgumentException("Operator '" + op.Op + "' not specified.");
            }
        }
Пример #5
0
        private static object PerformBinaryOp(ExpressionEval.BinaryOp op, object v1, object v2)
        {
            IExpression expression1 = v1 as IExpression;

            if (expression1 != null)
            {
                v1 = expression1.Evaluate();
            }
            IExpression expression2 = v2 as IExpression;

            if (expression2 != null)
            {
                v2 = expression2.Evaluate();
            }
            switch (op.Op)
            {
            case "!=":
            case "+":
            case "-":
            case "<":
            case "<=":
            case "=":
            case "==":
            case ">":
            case ">=":
                return(ExpressionEval.DoSpecialOperator(op, v1, v2));

            case "%":
                return((object)(Convert.ToInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) % Convert.ToInt64(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "&":
                return((object)(ulong)((long)Convert.ToUInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) & (long)Convert.ToUInt64(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "&&":
                return((object)(bool)(!Convert.ToBoolean(v1, (IFormatProvider)CultureInfo.CurrentCulture) ? false : (Convert.ToBoolean(v2, (IFormatProvider)CultureInfo.CurrentCulture) ? true : false)));

            case "*":
                return((object)(Convert.ToDouble(v1, (IFormatProvider)CultureInfo.CurrentCulture) * Convert.ToDouble(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "/":
                return((object)(Convert.ToDouble(v1, (IFormatProvider)CultureInfo.CurrentCulture) / Convert.ToDouble(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "<<":
                return((object)(Convert.ToInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) << Convert.ToInt32(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case ">>":
                return((object)(Convert.ToInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) >> Convert.ToInt32(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "^":
                return((object)(ulong)((long)Convert.ToUInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) ^ (long)Convert.ToUInt64(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "|":
                return((object)(ulong)((long)Convert.ToUInt64(v1, (IFormatProvider)CultureInfo.CurrentCulture) | (long)Convert.ToUInt64(v2, (IFormatProvider)CultureInfo.CurrentCulture)));

            case "||":
                return((object)(bool)(Convert.ToBoolean(v1, (IFormatProvider)CultureInfo.CurrentCulture) ? true : (Convert.ToBoolean(v2, (IFormatProvider)CultureInfo.CurrentCulture) ? true : false)));

            default:
                throw new ArgumentException("Binary Operator " + op.Op + "not defined.");
            }
        }