예제 #1
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());
        }