Skip to content

Commit aed9efd

Browse files
authored
Decouple Z3 From Expressions (#60)
1 parent d3c2dbb commit aed9efd

File tree

15 files changed

+196
-101
lines changed

15 files changed

+196
-101
lines changed

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/AliasInvocation.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.ArrayList;
54
import java.util.List;
65
import java.util.stream.Collectors;
7-
import liquidjava.smt.TranslatorToZ3;
6+
7+
import liquidjava.rj_language.visitors.ExpressionVisitor;
88

99
public class AliasInvocation extends Expression {
1010
String name;
@@ -24,12 +24,8 @@ public List<Expression> getArgs() {
2424
}
2525

2626
@Override
27-
public Expr<?> eval(TranslatorToZ3 ctx) throws Exception {
28-
Expr<?>[] argsExpr = new Expr[getArgs().size()];
29-
for (int i = 0; i < argsExpr.length; i++) {
30-
argsExpr[i] = getArgs().get(i).eval(ctx);
31-
}
32-
return ctx.makeFunctionInvocation(name, argsExpr);
27+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
28+
return visitor.visitAliasInvocation(this);
3329
}
3430

3531
@Override

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/BinaryExpression.java

Lines changed: 4 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class BinaryExpression extends Expression {
88

@@ -40,45 +40,8 @@ public boolean isArithmeticOperation() {
4040
}
4141

4242
@Override
43-
public Expr<?> eval(TranslatorToZ3 ctx) throws Exception {
44-
Expr<?> ee1 = getFirstOperand().eval(ctx);
45-
Expr<?> ee2 = getSecondOperand().eval(ctx);
46-
return evalBinaryOp(ctx, ee1, ee2);
47-
}
48-
49-
private Expr<?> evalBinaryOp(TranslatorToZ3 ctx, Expr<?> e1, Expr<?> e2) {
50-
switch (op) {
51-
case "&&":
52-
return ctx.makeAnd(e1, e2);
53-
case "||":
54-
return ctx.makeOr(e1, e2);
55-
case "-->":
56-
return ctx.makeImplies(e1, e2);
57-
case "==":
58-
return ctx.makeEquals(e1, e2);
59-
case "!=":
60-
return ctx.mkNot(ctx.makeEquals(e1, e2));
61-
case ">=":
62-
return ctx.makeGtEq(e1, e2);
63-
case ">":
64-
return ctx.makeGt(e1, e2);
65-
case "<=":
66-
return ctx.makeLtEq(e1, e2);
67-
case "<":
68-
return ctx.makeLt(e1, e2);
69-
case "+":
70-
return ctx.makeAdd(e1, e2);
71-
case "-":
72-
return ctx.makeSub(e1, e2);
73-
case "*":
74-
return ctx.makeMul(e1, e2);
75-
case "/":
76-
return ctx.makeDiv(e1, e2);
77-
case "%":
78-
return ctx.makeMod(e1, e2);
79-
default: // last case %
80-
throw new RuntimeException("Operation " + op + "not supported by z3");
81-
}
43+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
44+
return visitor.visitBinaryExpression(this);
8245
}
8346

8447
@Override

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/Expression.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
import liquidjava.processor.context.Context;
1010
import liquidjava.processor.facade.AliasDTO;
1111
import liquidjava.rj_language.ast.typing.TypeInfer;
12-
import liquidjava.smt.TranslatorToZ3;
12+
import liquidjava.rj_language.visitors.ExpressionVisitor;
1313
import liquidjava.utils.Utils;
1414
import spoon.reflect.factory.Factory;
1515

1616
public abstract class Expression {
1717

18-
public abstract Expr<?> eval(TranslatorToZ3 ctx) throws Exception;
18+
public abstract <T> T accept(ExpressionVisitor<T> visitor) throws Exception;
1919

2020
public abstract void getVariableNames(List<String> toAdd);
2121

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/FunctionInvocation.java

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.ArrayList;
54
import java.util.List;
65
import java.util.stream.Collectors;
7-
import liquidjava.smt.TranslatorToZ3;
6+
7+
import liquidjava.rj_language.visitors.ExpressionVisitor;
88
import liquidjava.utils.Utils;
99

1010
public class FunctionInvocation extends Expression {
@@ -30,12 +30,8 @@ public void setChild(int index, Expression element) {
3030
}
3131

3232
@Override
33-
public Expr<?> eval(TranslatorToZ3 ctx) throws Exception {
34-
Expr<?>[] argsExpr = new Expr[getArgs().size()];
35-
for (int i = 0; i < argsExpr.length; i++) {
36-
argsExpr[i] = getArgs().get(i).eval(ctx);
37-
}
38-
return ctx.makeFunctionInvocation(name, argsExpr);
33+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
34+
return visitor.visitFunctionInvocation(this);
3935
}
4036

4137
@Override

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/GroupExpression.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class GroupExpression extends Expression {
88

@@ -15,8 +15,8 @@ public Expression getExpression() {
1515
}
1616

1717
@Override
18-
public Expr<?> eval(TranslatorToZ3 ctx) throws Exception {
19-
return getExpression().eval(ctx);
18+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
19+
return visitor.visitGroupExpression(this);
2020
}
2121

2222
public String toString() {

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/Ite.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class Ite extends Expression {
88

@@ -25,8 +25,8 @@ public Expression getElse() {
2525
}
2626

2727
@Override
28-
public Expr<?> eval(TranslatorToZ3 ctx) throws Exception {
29-
return ctx.makeIte(getCondition().eval(ctx), getThen().eval(ctx), getElse().eval(ctx));
28+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
29+
return visitor.visitIte(this);
3030
}
3131

3232
@Override

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/LiteralBoolean.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class LiteralBoolean extends Expression {
88

@@ -16,8 +16,9 @@ public LiteralBoolean(String value) {
1616
this.value = Boolean.parseBoolean(value);
1717
}
1818

19-
public Expr<?> eval(TranslatorToZ3 ctx) {
20-
return ctx.makeBooleanLiteral(value);
19+
@Override
20+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
21+
return visitor.visitLiteralBoolean(this);
2122
}
2223

2324
public String toString() {

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/LiteralInt.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class LiteralInt extends Expression {
88

@@ -17,8 +17,8 @@ public LiteralInt(String v) {
1717
}
1818

1919
@Override
20-
public Expr<?> eval(TranslatorToZ3 ctx) {
21-
return ctx.makeIntegerLiteral(value);
20+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
21+
return visitor.visitLiteralInt(this);
2222
}
2323

2424
public String toString() {

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/LiteralReal.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class LiteralReal extends Expression {
88

@@ -17,8 +17,8 @@ public LiteralReal(String v) {
1717
}
1818

1919
@Override
20-
public Expr<?> eval(TranslatorToZ3 ctx) {
21-
return ctx.makeDoubleLiteral(value);
20+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
21+
return visitor.visitLiteralReal(this);
2222
}
2323

2424
public String toString() {

liquidjava-verifier/src/main/java/liquidjava/rj_language/ast/LiteralString.java

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package liquidjava.rj_language.ast;
22

3-
import com.microsoft.z3.Expr;
43
import java.util.List;
5-
import liquidjava.smt.TranslatorToZ3;
4+
5+
import liquidjava.rj_language.visitors.ExpressionVisitor;
66

77
public class LiteralString extends Expression {
88
private String value;
@@ -12,8 +12,8 @@ public LiteralString(String v) {
1212
}
1313

1414
@Override
15-
public Expr<?> eval(TranslatorToZ3 ctx) {
16-
return ctx.makeString(value);
15+
public <T> T accept(ExpressionVisitor<T> visitor) throws Exception {
16+
return visitor.visitLiteralString(this);
1717
}
1818

1919
public String toString() {
@@ -23,13 +23,11 @@ public String toString() {
2323
@Override
2424
public void getVariableNames(List<String> toAdd) {
2525
// end leaf
26-
2726
}
2827

2928
@Override
3029
public void getStateInvocations(List<String> toAdd, List<String> all) {
3130
// end leaf
32-
3331
}
3432

3533
@Override

0 commit comments

Comments
 (0)