コード例 #1
0
 public virtual T Visit(ComparisonBinaryExpression node)
 {
     Visit((BinaryExpression)node);
     traverse(node.left);
     traverse(node.right);
     return(DefaultReturnValue());
 }
コード例 #2
0
 public override bool Visit(ComparisonBinaryExpression node)
 {
     Visit((BinaryExpression)node);
     TraversePrint(node.left);
     TraversePrint(node.right);
     return(true);
 }
コード例 #3
0
ファイル: ConstantFolding.cs プロジェクト: chuacw/multidelphi
        public override bool Visit(ComparisonBinaryExpression node)
        {
            Visit(node.left);
            Visit(node.right);

            if (node.left.Value == null || node.right == null)
            {
                return(false);
            }

            // resulting value is always bool
            if (node.Type is IntegerType)
            {
                node.Value = new IntegralValue(Fold <long>(node));
            }
            if (node.Type is CharType)
            {
                node.Value = new IntegralValue(Fold <char>(node));
            }
            if (node.Type is BoolType)
            {
                node.Value = new IntegralValue(Fold <bool>(node));
            }
            else if (node.Type is RealType)
            {
                node.Value = new IntegralValue(Fold <double>(node));
            }
            else if (node.Type is RealType)
            {
                node.Value = new IntegralValue(Fold <double>(node));
            }

            return(true);
        }
コード例 #4
0
        public override Value Visit(ComparisonBinaryExpression node)
        {
            Visit((BinaryExpression)node);
            Value l = traverse(node.left);
            Value r = traverse(node.right);

            if (l.IsNull || r.IsNull)
            {
                return(Value.Null);
            }

            // LogicalBinaryOp values for comparison operands match LLVMIntPredicate values
            return(builder.BuildICmp(l, (LLVMIntPredicate)node.op, r));
        }
コード例 #5
0
ファイル: ConstantFolding.cs プロジェクト: chuacw/multidelphi
        bool Fold <T>(ComparisonBinaryExpression n) where T : struct
        {
            T vleft  = n.left.Value.Val <T>();
            T vright = n.right.Value.Val <T>();

            switch (n.op)
            {
            case ComparisonBinaryOp.EQ:
                return(Operator.Equal(vleft, vright));

            case ComparisonBinaryOp.GE:
                return(Operator.GreaterThanOrEqual(vleft, vright));

            case ComparisonBinaryOp.GT:
                return(Operator.GreaterThan(vleft, vright));

            case ComparisonBinaryOp.LE:
                return(Operator.LessThanOrEqual(vleft, vright));

            case ComparisonBinaryOp.LT:
                return(Operator.LessThan(vleft, vright));

            case ComparisonBinaryOp.NE:
                return(Operator.NotEqual(vleft, vright));

            // TODO
            case ComparisonBinaryOp.SGE:
                return(Operator.GreaterThanOrEqual(vleft, vright));

            case ComparisonBinaryOp.SGT:
                return(Operator.GreaterThan(vleft, vright));

            case ComparisonBinaryOp.SLE:
                return(Operator.LessThanOrEqual(vleft, vright));

            case ComparisonBinaryOp.SLT:
                return(Operator.LessThan(vleft, vright));

            default:
                throw new SemanticException("Invalid operator " + n.op + " in comparison binary expr");
            }
        }