Skip to content

Commit 6b1df87

Browse files
committed
[refactor] translate \fresh in JMLTranslator
Conflicts: system/src/de/uka/ilkd/key/speclang/jml/translation/JMLTranslator.java system/src/de/uka/ilkd/key/speclang/jml/translation/jmlparser.g
1 parent b5cbe61 commit 6b1df87

File tree

2 files changed

+50
-27
lines changed

2 files changed

+50
-27
lines changed

system/src/de/uka/ilkd/key/speclang/jml/translation/JMLTranslator.java

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import de.uka.ilkd.key.collection.ImmutableSLList;
2525
import de.uka.ilkd.key.java.Label;
2626
import de.uka.ilkd.key.java.Services;
27+
import de.uka.ilkd.key.java.TypeConverter;
2728
import de.uka.ilkd.key.java.abstraction.ArrayType;
2829
import de.uka.ilkd.key.java.abstraction.KeYJavaType;
2930
import de.uka.ilkd.key.java.abstraction.PrimitiveType;
@@ -73,7 +74,8 @@ public static enum JMLKeyWord {
7374
INV_FOR ("\\invariant_for"),
7475
CAST ("cast"),
7576
CONDITIONAL ("conditional"),
76-
77+
FRESH ("\\fresh"),
78+
7779
// clauses
7880
ACCESSIBLE ("accessible"),
7981
ASSIGNABLE ("assignable"),
@@ -824,6 +826,51 @@ public Object translate(SLTranslationExceptionManager excManager,
824826
}
825827
});
826828

829+
translationMethods.put(JMLKeyWord.FRESH,
830+
new JMLTranslationMethod() {
831+
832+
@Override
833+
public SLExpression translate(
834+
SLTranslationExceptionManager excManager,
835+
Object... params)
836+
throws SLTranslationException {
837+
checkParameters(params,
838+
ImmutableList.class,
839+
Services.class);
840+
final ImmutableList<SLExpression> list = (ImmutableList) params[0];
841+
final Map<LocationVariable,Term> atPres = (Map) params[1];
842+
final Services services = (Services) params[2];
843+
844+
if(atPres == null || atPres.get(TB.getBaseHeap(services)) == null) {
845+
throw excManager.createException("\\fresh not allowed in this context");
846+
}
847+
848+
Term t = TB.tt();
849+
final Sort objectSort = services.getJavaInfo().objectSort();
850+
final TypeConverter tc = services.getTypeConverter();
851+
for(SLExpression expr: list) {
852+
if(!expr.isTerm()) {
853+
throw excManager.createException("Expected a term, but found: " + expr);
854+
} else if(expr.getTerm().sort().extendsTrans(objectSort)) {
855+
t = TB.and(t,
856+
TB.equals(TB.select(services,
857+
tc.getBooleanLDT().targetSort(),
858+
atPres.get(TB.getBaseHeap(services)),
859+
expr.getTerm(),
860+
TB.func(tc.getHeapLDT().getCreated())),
861+
TB.FALSE(services)));
862+
} else if(expr.getTerm().sort().extendsTrans(tc.getLocSetLDT().targetSort())) {
863+
t = TB.and(t, TB.subset(services,
864+
expr.getTerm(),
865+
TB.freshLocs(services, atPres.get(TB.getBaseHeap(services)))));
866+
} else {
867+
throw excManager.createException("Wrong type: " + expr);
868+
}
869+
}
870+
return new SLExpression(t);
871+
}
872+
});
873+
827874
// operators
828875
translationMethods.put(JMLKeyWord.EQUIVALENCE,
829876
new JMLEqualityTranslationMethod() {

system/src/de/uka/ilkd/key/speclang/jml/translation/jmlparser.g

Lines changed: 2 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,32 +1525,8 @@ jmlprimary returns [SLExpression result=null] throws SLTranslationException
15251525

15261526
| FRESH LPAREN list=expressionlist RPAREN
15271527
{
1528-
if(atPres == null || atPres.get(getBaseHeap()) == null) {
1529-
raiseError("\\fresh not allowed in this context");
1530-
}
1531-
t = TB.tt();
1532-
final Sort objectSort = services.getJavaInfo().objectSort();
1533-
for(SLExpression expr: list) {
1534-
if(!expr.isTerm()) {
1535-
raiseError("Expected a term, but found: " + expr);
1536-
} else if(expr.getTerm().sort().extendsTrans(objectSort)) {
1537-
t = TB.and(t,
1538-
TB.equals(TB.select(services,
1539-
booleanLDT.targetSort(),
1540-
atPres.get(getBaseHeap()),
1541-
expr.getTerm(),
1542-
TB.func(heapLDT.getCreated())),
1543-
TB.FALSE(services)));
1544-
} else if(expr.getTerm().sort().extendsTrans(locSetLDT.targetSort())) {
1545-
t = TB.and(t, TB.subset(services,
1546-
expr.getTerm(),
1547-
TB.freshLocs(services, atPres.get(getBaseHeap()))));
1548-
} else {
1549-
raiseError("Wrong type: " + expr);
1550-
}
1551-
}
1552-
result = new SLExpression(t);
1553-
}
1528+
result = translator.translate("\\fresh", SLExpression.class, list, atPres, services);
1529+
}
15541530

15551531
| REACH LPAREN t=storeref COMMA e1=expression COMMA e2=expression (COMMA e3=expression)? RPAREN
15561532
{

0 commit comments

Comments
 (0)