private bool IsChained(BinaryExpr expression) { if (!expression.Op.Equals(BinaryExpr.Opcode.And)) { return(false); } var lhs = expression.E0 as BinaryExpr; var rhs = expression.E1 as BinaryExpr; if (lhs == null || rhs == null) { return(false); } return(BinaryExpr.IsEqualityOp(lhs.Op) && BinaryExpr.IsEqualityOp(rhs.Op)); }
protected Expression EvaluateExpression(ExpressionTree expt, ProofState state) { Contract.Requires(expt != null); if (expt.IsLeaf()) { return(EvaluateLeaf(expt, state) as LiteralExpr); } var bexp = (BinaryExpr)expt.Data; if (BinaryExpr.IsEqualityOp(bexp.Op)) { bool boolVal = EvaluateEqualityExpression(expt, state); return(new LiteralExpr(new Token(), boolVal)); } var lhs = EvaluateExpression(expt.LChild, state) as LiteralExpr; var rhs = EvaluateExpression(expt.RChild, state) as LiteralExpr; // for now asume lhs and rhs are integers var l = (BigInteger)lhs?.Value; var r = (BigInteger)rhs?.Value; BigInteger res = 0; switch (bexp.Op) { case BinaryExpr.Opcode.Sub: res = BigInteger.Subtract(l, r); break; case BinaryExpr.Opcode.Add: res = BigInteger.Add(l, r); break; case BinaryExpr.Opcode.Mul: res = BigInteger.Multiply(l, r); break; case BinaryExpr.Opcode.Div: res = BigInteger.Divide(l, r); break; } return(new LiteralExpr(lhs.tok, res)); }