private static IntValue EvaluateBinaryOperation(BinaryOperator oper, IntValue left, IntValue right) { switch (oper) { case BinaryOperator.Mult: return(new IntValue(checked (left.Value * right.Value))); case BinaryOperator.Div: return(new IntValue(left.Value / right.Value)); case BinaryOperator.Modulo: return(new IntValue(left.Value % right.Value)); case BinaryOperator.Add: return(new IntValue(checked (left.Value + right.Value))); case BinaryOperator.Sub: return(new IntValue(checked (left.Value - right.Value))); case BinaryOperator.ShiftLeft: return(new IntValue(checked ((int)left.Value << (int)right.Value))); case BinaryOperator.ShiftRight: return(new IntValue(checked ((int)left.Value >> (int)right.Value))); case BinaryOperator.Less: return(new IntValue(left.Value < right.Value ? 1 : 0)); case BinaryOperator.Greater: return(new IntValue(left.Value > right.Value ? 1 : 0)); case BinaryOperator.LessOrEqual: return(new IntValue(left.Value <= right.Value ? 1 : 0)); case BinaryOperator.GreaterOrEqual: return(new IntValue(left.Value >= right.Value ? 1 : 0)); case BinaryOperator.Equal: return(new IntValue(left.Value == right.Value ? 1 : 0)); case BinaryOperator.NotEqual: return(new IntValue(left.Value != right.Value ? 1 : 0)); case BinaryOperator.BinAnd: return(new IntValue(left.Value & right.Value)); case BinaryOperator.BinOr: return(new IntValue(left.Value | right.Value)); case BinaryOperator.LogAnd: return(new IntValue(left.Value != 0 && right.Value != 0 ? 1 : 0)); case BinaryOperator.LogOr: return(new IntValue(left.Value != 0 || right.Value != 0 ? 1 : 0)); default: throw new Exception(); } }
private static NodeValue EvaluateBinaryOperation(BinaryOperator oper, StringValue left, IntValue right) { switch (oper) { case BinaryOperator.Mult: return(new StringValue(string.Concat(Enumerable.Repeat(left.Value, (int)right.Value)))); default: throw new InvalidBinaryOperationException(); } }