Beispiel #1
0
        public override AstNode Visit(BinaryOperation node)
        {
            // Process the left expression.
            Expression left = node.GetLeftExpression();
            left = (Expression)left.Accept(this);
            node.SetLeftExpression(left);

            // Process the right expression.
            Expression right = node.GetRightExpression();
            right = (Expression)right.Accept(this);
            node.SetRightExpression(node);

            // Get the node type.
            IChelaType nodeType = node.GetNodeType();
            if(!nodeType.IsConstant())
                return node;

            // Perform left constant coercion.
            ConstantValue leftConstant = (ConstantValue)left.GetNodeValue();
            IChelaType leftType = left.GetNodeType();
            IChelaType leftCoercion = node.GetCoercionType();
            if(leftType != leftCoercion)
                leftConstant = leftConstant.Cast(leftCoercion);

            // Perform right constant coercion.
            ConstantValue rightConstant = (ConstantValue)right.GetNodeValue();
            IChelaType rightType = right.GetNodeType();
            IChelaType rightCoercion = node.GetSecondCoercion();
            if(rightType != rightCoercion)
                rightConstant = rightConstant.Cast(rightCoercion);

            // Perform the constant operation.
            ConstantValue res = null;
            switch(node.GetOperation())
            {
            case BinaryOperation.OpAdd:
                res = leftConstant + rightConstant;
                break;
            case BinaryOperation.OpSub:
                res = leftConstant - rightConstant;
                break;
            case BinaryOperation.OpMul:
                res = leftConstant * rightConstant;
                break;
            case BinaryOperation.OpDiv:
                res = leftConstant / rightConstant;
                break;
            case BinaryOperation.OpMod:
                res = leftConstant % rightConstant;
                break;
            case BinaryOperation.OpEQ:
                res = ConstantValue.Equals(leftConstant, rightConstant);
                break;
            case BinaryOperation.OpNEQ:
                res = ConstantValue.NotEquals(leftConstant, rightConstant);
                break;
            case BinaryOperation.OpLT:
                res = leftConstant < rightConstant;
                break;
            case BinaryOperation.OpLEQ:
                res = leftConstant <= rightConstant;
                break;
            case BinaryOperation.OpGT:
                res = leftConstant > rightConstant;
                break;
            case BinaryOperation.OpGEQ:
                res = leftConstant >= rightConstant;
                break;
            case BinaryOperation.OpBitAnd:
                res = leftConstant & rightConstant;
                break;
            case BinaryOperation.OpBitOr:
                res = leftConstant | rightConstant;
                break;
            case BinaryOperation.OpBitXor:
                res = leftConstant ^ rightConstant;
                break;
            case BinaryOperation.OpBitLeft:
                res = ConstantValue.BitLeft(leftConstant, rightConstant);
                break;
            case BinaryOperation.OpBitRight:
                res = ConstantValue.BitRight(leftConstant, rightConstant);
                break;
            case BinaryOperation.OpLAnd:
                res = new ConstantValue(leftConstant.GetBoolValue() && rightConstant.GetBoolValue());
                break;
            case BinaryOperation.OpLOr:
                res = new ConstantValue(leftConstant.GetBoolValue() || rightConstant.GetBoolValue());
                break;
            default:
                throw new System.NotImplementedException();
            }

            // Return the result node.
            return res.ToAstNode(node.GetPosition());
        }