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 }