Expr rightexpr;
Expr leftexpr;
Opcode opcode;
- boolean negate;
+ boolean negate=false;
- public Updates(Expr lexpr, Expr rexpr, Opcode op) {
+ public String toString() {
+ if (type==EXPR)
+ return leftexpr.name()+opcode.toString()+rightexpr.name();
+ else if (type==POSITION)
+ return leftexpr.name()+opcode.toString()+"Position("+String.valueOf(rightposition)+")";
+ else if (type==ABSTRACT) {
+ if (negate) return "!"+leftexpr.name();
+ else return leftexpr.name();
+ } else throw new Error("Unrecognized type");
+ }
+
+ public Updates(Expr lexpr, Expr rexpr, Opcode op, boolean negate) {
+ if (!lexpr.isValue())
+ System.out.println("Building invalid update");
leftexpr=lexpr;
type=Updates.EXPR;
- opcode=Opcode.EQ;
- /* Get rid of everything but NE */
- if (op==Opcode.GT) {
- rightexpr=new OpExpr(Opcode.ADD,rexpr,new IntegerLiteralExpr(1));
- } else if (op==Opcode.GE) {
- rightexpr=rexpr;
- } else if (op==Opcode.LT) {
- rightexpr=new OpExpr(Opcode.SUB,rexpr,new IntegerLiteralExpr(1));
- } else if (op==Opcode.LE) {
- rightexpr=rexpr;
- } else if (op==Opcode.EQ) {
- rightexpr=rexpr;
- } else if (op==Opcode.NE) {
- opcode=Opcode.NE;
+ if (negate) {
+ /* remove negation through opcode translation */
+ if (op==Opcode.GT)
+ op=Opcode.LE;
+ else if (op==Opcode.GE)
+ op=Opcode.LT;
+ else if (op==Opcode.EQ)
+ op=Opcode.NE;
+ else if (op==Opcode.NE)
+ op=Opcode.EQ;
+ else if (op==Opcode.LT)
+ op=Opcode.GE;
+ else if (op==Opcode.LE)
+ op=Opcode.GT;
}
+ opcode=op;
+ rightexpr=rexpr;
}
boolean isGlobal() {
else return false;
}
+ VarDescriptor getVar() {
+ if (isGlobal()) {
+ return ((VarExpr)leftexpr).getVar();
+ } else if (isField()) {
+ Expr e=leftexpr;
+ for(;e instanceof DotExpr;e=((DotExpr)e).getExpr()) ;
+ return ((VarExpr)e).getVar();
+ } else {
+ System.out.println(toString());
+ throw new Error("Unrecognized Update");
+ }
+ }
+
Descriptor getDescriptor() {
if (isGlobal()) {
return ((VarExpr)leftexpr).getVar();
} else if (isField()) {
return ((DotExpr)leftexpr).getField();
- } else throw New Error("Unrecognized Update");
+ } else {
+ System.out.println(toString());
+ throw new Error("Unrecognized Update");
+ }
}
boolean isField() {
return false;
}
+ boolean isExpr() {
+ return type==Updates.EXPR;
+ }
+
Opcode getOpcode() {
return opcode;
}
public Updates(Expr lexpr, Expr rexpr) {
+ if (!lexpr.isValue())
+ System.out.println("Building invalid update");
leftexpr=lexpr;
rightexpr=rexpr;
type=Updates.EXPR;
}
public Updates(Expr lexpr, int rpos) {
+ if (!lexpr.isValue())
+ System.out.println("Building invalid update");
leftexpr=lexpr;
rightposition=rpos;
type=Updates.POSITION;
- opcode=null;
+ opcode=Opcode.EQ;
+ }
+
+ boolean isAbstract() {
+ return type==Updates.ABSTRACT;
}
+
public Updates(Expr lexpr,boolean negates) {
leftexpr=lexpr;
type=Updates.ABSTRACT;