001    // -*- mode: java -*-
002    /* Copyright 2000, 2001, Compaq Computer Corporation */
003    
004    /* IF THIS IS A JAVA FILE, DO NOT EDIT IT!  
005    
006       Most Java files in this directory which are part of the Javafe AST
007       are automatically generated using the astgen comment (see
008       ESCTools/Javafe/astgen) from the input file 'hierarchy.h'.  If you
009       wish to modify AST classes or introduce new ones, modify
010       'hierarchy.j.'
011     */
012    
013    package javafe.ast;
014    
015    import javafe.util.Assert;
016    import javafe.util.Location;
017    import javafe.util.ErrorSet;
018    
019    // Convention: unless otherwise noted, integer fields named "loc" refer
020    // to the location of the first character of the syntactic unit
021    
022    
023    /**
024     * Represents various kinds of binary expressions (eg +,-,|,%=, etc).
025     * The tag is one of the binary operator tags or assignment operator
026     * tags defined in OperatorTags.
027     */
028    
029    public class BinaryExpr extends Expr
030    {
031      /*@ invariant (op == TagConstants.OR || op == TagConstants.AND
032           || op == TagConstants.BITOR || op == TagConstants.BITXOR
033           || op == TagConstants.BITAND
034           || op == TagConstants.NE || op == TagConstants.EQ
035           || op == TagConstants.GE || op == TagConstants.GT
036           || op == TagConstants.LE || op == TagConstants.LT
037           || op == TagConstants.LSHIFT || op == TagConstants.RSHIFT
038           || op == TagConstants.URSHIFT || op == TagConstants.ADD
039           || op == TagConstants.SUB || op == TagConstants.DIV
040           || op == TagConstants.MOD || op == TagConstants.STAR
041           || op == TagConstants.ASSIGN || op == TagConstants.ASGMUL
042           || op == TagConstants.ASGDIV || op == TagConstants.ASGREM
043           || op == TagConstants.ASGADD || op == TagConstants.ASGSUB
044           || op == TagConstants.ASGLSHIFT || op == TagConstants.ASGRSHIFT
045           || op == TagConstants.ASGURSHIFT || op == TagConstants.ASGBITAND); */
046      public int op;
047    
048    
049      public /*@ non_null @*/ Expr left;
050    
051      public /*@ non_null @*/ Expr right;
052    
053      //@ invariant locOp != javafe.util.Location.NULL;
054      public int locOp;
055    
056    
057      public final int getTag() { return op; }
058    
059      private void postCheck() {
060        boolean goodtag =
061          (op == TagConstants.OR || op == TagConstants.AND
062           || op == TagConstants.BITOR || op == TagConstants.BITXOR
063           || op == TagConstants.BITAND
064           || op == TagConstants.NE || op == TagConstants.EQ
065           || op == TagConstants.GE || op == TagConstants.GT
066           || op == TagConstants.LE || op == TagConstants.LT
067           || op == TagConstants.LSHIFT || op == TagConstants.RSHIFT
068           || op == TagConstants.URSHIFT || op == TagConstants.ADD
069           || op == TagConstants.SUB || op == TagConstants.DIV
070           || op == TagConstants.MOD || op == TagConstants.STAR
071           || op == TagConstants.ASSIGN || op == TagConstants.ASGMUL
072           || op == TagConstants.ASGDIV || op == TagConstants.ASGREM
073           || op == TagConstants.ASGADD || op == TagConstants.ASGSUB
074           || op == TagConstants.ASGLSHIFT || op == TagConstants.ASGRSHIFT
075           || op == TagConstants.ASGURSHIFT || op == TagConstants.ASGBITAND
076           || op == TagConstants.ASGBITOR || op == TagConstants.ASGBITXOR);
077        Assert.notFalse(goodtag);
078      }
079      //@ public represents startLoc <- left.getStartLoc();
080      public /*@ pure @*/ int getStartLoc() { return left.getStartLoc(); }
081      //@ also public normal_behavior
082      //@ ensures \result == right.getEndLoc();
083      public /*@ pure @*/ int getEndLoc() { return right.getEndLoc(); }
084    
085      /*@ requires (op == TagConstants.OR || op == TagConstants.AND
086           || op == TagConstants.BITOR || op == TagConstants.BITXOR
087           || op == TagConstants.BITAND
088           || op == TagConstants.NE || op == TagConstants.EQ
089           || op == TagConstants.GE || op == TagConstants.GT
090           || op == TagConstants.LE || op == TagConstants.LT
091           || op == TagConstants.LSHIFT || op == TagConstants.RSHIFT
092           || op == TagConstants.URSHIFT || op == TagConstants.ADD
093           || op == TagConstants.SUB || op == TagConstants.DIV
094           || op == TagConstants.MOD || op == TagConstants.STAR
095           || op == TagConstants.ASSIGN || op == TagConstants.ASGMUL
096           || op == TagConstants.ASGDIV || op == TagConstants.ASGREM
097           || op == TagConstants.ASGADD || op == TagConstants.ASGSUB
098           || op == TagConstants.ASGLSHIFT || op == TagConstants.ASGRSHIFT
099           || op == TagConstants.ASGURSHIFT || op == TagConstants.ASGBITAND); */
100      //
101      //@ requires locOp != javafe.util.Location.NULL;
102      public static /*@non_null*/ BinaryExpr make(int op, 
103                                    /*@ non_null @*/ Expr left,
104                                    /*@ non_null @*/ Expr right, 
105                                    int locOp) {
106         BinaryExpr result = new BinaryExpr(
107                                 op,
108                                 left,
109                                 right,
110                                 locOp);
111         return result;
112      }
113    
114    
115    // Generated boilerplate constructors:
116    
117      //@ ensures this.op == op;
118      //@ ensures this.left == left;
119      //@ ensures this.right == right;
120      //@ ensures this.locOp == locOp;
121      protected BinaryExpr(int op, /*@ non_null @*/ Expr left, /*@ non_null @*/ Expr right, int locOp) {
122         super();
123         this.op = op;
124         this.left = left;
125         this.right = right;
126         this.locOp = locOp;
127      }
128    
129    // Generated boilerplate methods:
130    
131      public final int childCount() {
132         return 2;
133      }
134    
135      public final Object childAt(int index) {
136              /*throws IndexOutOfBoundsException*/
137         if (index < 0)
138            throw new IndexOutOfBoundsException("AST child index " + index);
139         int indexPre = index;
140    
141         int sz;
142    
143         if (index == 0) return this.left;
144         else index--;
145    
146         if (index == 0) return this.right;
147         else index--;
148    
149         throw new IndexOutOfBoundsException("AST child index " + indexPre);
150      }   //@ nowarn Exception;
151    
152      public final /*@non_null*/String toString() {
153         return "[BinaryExpr"
154            + " op = " + this.op
155            + " left = " + this.left
156            + " right = " + this.right
157            + " locOp = " + this.locOp
158            + "]";
159      }
160    
161      public final void accept(Visitor v) { v.visitBinaryExpr(this); }
162    
163      public final Object accept(VisitorArgResult v, Object o) {return v.visitBinaryExpr(this, o); }
164    
165      public void check() {
166         super.check();
167         this.left.check();
168         this.right.check();
169         postCheck();
170      }
171    
172    }