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