private Operand Compute(Operand leftValue, string oper, Operand rightValue = null) { if (rightValue as object == null) { switch (oper) { case "+": return +leftValue; case "-": return -leftValue; case "!": return !leftValue; case "~": return ~leftValue; default: throw new Exception("invalid unary operator "+ oper); } } else { switch (oper) { case "+": return leftValue + rightValue; case "-": return leftValue - rightValue; case "*": return leftValue * rightValue; case "/": return leftValue / rightValue; case "%": return leftValue % rightValue; case ">>": return leftValue.RightShift(rightValue); case "<<": return leftValue.LeftShift(rightValue); case "&": return leftValue.BitwiseOr(rightValue); case "|": return leftValue.BitwiseOr(rightValue); case "^": return leftValue.Xor(rightValue); case "&&": return leftValue.LogicalAnd(rightValue); case "||": return leftValue.LogicalOr(rightValue); case ">": return leftValue.Gt(rightValue); case "<": return leftValue.Lt(rightValue); case ">=": return leftValue.Ge(rightValue); case "<=": return leftValue.Le(rightValue); case "==": return leftValue.Eq(rightValue); case "!=": return leftValue.Ne(rightValue); case "^^": throw new Exception("operator " + oper + "not implemented"); default: throw new Exception("invalid operator " +oper); } } }
public Operand LogicalXor(Operand other) { return(this.LogicalAnd(other.LogicalNot()).LogicalOr(other.LogicalAnd(this.LogicalNot()))); }