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