コード例 #1
0
    public Object visitExprBinary(ExprBinary exp) {
      switch (exp.getOp()) {
        case ExprBinary.BINOP_GE:
        case ExprBinary.BINOP_GT:
        case ExprBinary.BINOP_LE:
        case ExprBinary.BINOP_LT:
          {
            Type oldType = type;
            Type tleft = getType(exp.getLeft());
            Type tright = getType(exp.getRight());
            Type tt = tright.leastCommonPromotion(tleft, nres);
            type = tt; // TypePrimitive.inttype;
            Expression left = doExpression(exp.getLeft());
            Expression right = doExpression(exp.getRight());
            type = oldType;
            if (left == exp.getLeft() && right == exp.getRight()) return exp;
            else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias());
          }
        case ExprBinary.BINOP_LSHIFT:
        case ExprBinary.BINOP_RSHIFT:
          {
            Expression left = doExpression(exp.getLeft());
            Type oldType = type;
            type = TypePrimitive.inttype;
            Expression right = doExpression(exp.getRight());
            type = oldType;
            if (left == exp.getLeft() && right == exp.getRight()) return exp;
            else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias());
          }
        case ExprBinary.BINOP_NEQ:
        case ExprBinary.BINOP_EQ:
          {
            Type tleft = stv.getType(exp.getLeft());
            Type tright = stv.getType(exp.getRight());
            Type tboth = tleft.leastCommonPromotion(tright, nres);
            Type oldType = type;
            type = tboth;
            Expression left = doExpression(exp.getLeft());
            Expression right = doExpression(exp.getRight());
            type = oldType;
            if (left == exp.getLeft() && right == exp.getRight()) return exp;
            else return new ExprBinary(exp, exp.getOp(), left, right, exp.getAlias());
          }

        default:
          return super.visitExprBinary(exp);
      }
    }