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