diff --git a/build.gradle b/build.gradle index 24f66e2bc24719026909713ddf3a8f4c1c133131..5b7abb90cfca99441b7f6e763917304110c42ed0 100644 --- a/build.gradle +++ b/build.gradle @@ -36,7 +36,7 @@ project(':de.prob.core') { } - def parser_version = '2.4.21-SNAPSHOT' + def parser_version = '2.4.22-SNAPSHOT' dependencies { compile group: "de.prob", name: "answerparser", version: parser_version , changing: true diff --git a/de.prob.core/.classpath b/de.prob.core/.classpath index 4fb87835bb61211c6f13c42745fc6dcf2a166ef5..5004b8808efadf10e19fa4e2470fc73ccdd87d92 100644 --- a/de.prob.core/.classpath +++ b/de.prob.core/.classpath @@ -4,17 +4,17 @@ <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/> <classpathentry kind="src" path="src"/> <classpathentry kind="output" path="bin"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.21-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/answerparser-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/bparser-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/cliparser-2.4.22-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-codec-1.6.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/commons-lang-2.6.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/jsr305-1.3.9.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/theorymapping-2.4.21-SNAPSHOT.jar"/> - <classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.21-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/ltlparser-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/parserbase-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/prologlib-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/theorymapping-2.4.22-SNAPSHOT.jar"/> + <classpathentry exported="true" kind="lib" path="lib/dependencies/unicode-2.4.22-SNAPSHOT.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/xmlpull-1.1.3.1.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/xpp3_min-1.1.4c.jar"/> <classpathentry exported="true" kind="lib" path="lib/dependencies/xstream-1.4.3.jar"/> diff --git a/de.prob.core/META-INF/MANIFEST.MF b/de.prob.core/META-INF/MANIFEST.MF index 47a9e11897f2221bbb4a5bd469bd580c3a108d1f..f909299e5350c0dd7344b7c0f9de8f1aaa2ec559 100644 --- a/de.prob.core/META-INF/MANIFEST.MF +++ b/de.prob.core/META-INF/MANIFEST.MF @@ -118,14 +118,14 @@ Bundle-Activator: de.prob.core.internal.Activator Eclipse-BuddyPolicy: registered Bundle-RequiredExecutionEnvironment: JavaSE-1.6 Bundle-ClassPath: ., - lib/dependencies/unicode-2.4.21-SNAPSHOT.jar, - lib/dependencies/theorymapping-2.4.21-SNAPSHOT.jar, - lib/dependencies/prologlib-2.4.21-SNAPSHOT.jar, - lib/dependencies/parserbase-2.4.21-SNAPSHOT.jar, - lib/dependencies/ltlparser-2.4.21-SNAPSHOT.jar, - lib/dependencies/cliparser-2.4.21-SNAPSHOT.jar, - lib/dependencies/bparser-2.4.21-SNAPSHOT.jar, - lib/dependencies/answerparser-2.4.21-SNAPSHOT.jar, + lib/dependencies/unicode-2.4.22-SNAPSHOT.jar, + lib/dependencies/theorymapping-2.4.22-SNAPSHOT.jar, + lib/dependencies/prologlib-2.4.22-SNAPSHOT.jar, + lib/dependencies/parserbase-2.4.22-SNAPSHOT.jar, + lib/dependencies/ltlparser-2.4.22-SNAPSHOT.jar, + lib/dependencies/cliparser-2.4.22-SNAPSHOT.jar, + lib/dependencies/bparser-2.4.22-SNAPSHOT.jar, + lib/dependencies/answerparser-2.4.22-SNAPSHOT.jar, lib/dependencies/jgrapht-0.8.3.jar, lib/dependencies/commons-codec-1.6.jar, lib/dependencies/commons-lang-2.6.jar, diff --git a/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java b/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java deleted file mode 100644 index e8a27f81a6032b317c658c82321e8a64e6b5362d..0000000000000000000000000000000000000000 --- a/de.prob.core/src/de/prob/eventb/translator/AssignmentVisitor.java +++ /dev/null @@ -1,129 +0,0 @@ -/** - * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, - * Heinrich Heine Universitaet Duesseldorf - * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) - * */ - -package de.prob.eventb.translator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - -import org.eventb.core.ast.BecomesEqualTo; -import org.eventb.core.ast.BecomesMemberOf; -import org.eventb.core.ast.BecomesSuchThat; -import org.eventb.core.ast.Expression; -import org.eventb.core.ast.FreeIdentifier; -import org.eventb.core.ast.ISimpleVisitor; -import org.eventb.core.ast.Predicate; - -import de.be4.classicalb.core.parser.node.AAssignSubstitution; -import de.be4.classicalb.core.parser.node.ABecomesElementOfSubstitution; -import de.be4.classicalb.core.parser.node.ABecomesSuchSubstitution; -import de.be4.classicalb.core.parser.node.AIdentifierExpression; -import de.be4.classicalb.core.parser.node.PExpression; -import de.be4.classicalb.core.parser.node.PSubstitution; -import de.be4.classicalb.core.parser.node.TIdentifierLiteral; -import de.prob.eventb.translator.internal.SimpleVisitorAdapter; -import de.prob.eventb.translator.internal.TranslationVisitor; - -/** - * @deprecated Use {@link TranslationVisitor} instead - */ -@Deprecated -public class AssignmentVisitor extends SimpleVisitorAdapter implements - ISimpleVisitor { - - private PSubstitution sub; - private boolean substitutonSet = false; - - public PSubstitution getSubstitution() { - return sub; - } - - public void setSub(final PSubstitution sub) { - if (substitutonSet) { - throw new AssertionError("The Visitor must not be used twice!"); - } - substitutonSet = true; - this.sub = sub; - } - - @Override - public void visitBecomesEqualTo(final BecomesEqualTo assignment) { - final FreeIdentifier[] identifiers = assignment - .getAssignedIdentifiers(); - final Expression[] expressions = assignment.getExpressions(); - final AAssignSubstitution assignSubstitution = new AAssignSubstitution(); - assignSubstitution - .setLhsExpression(createListOfIdentifiers(identifiers)); - assignSubstitution - .setRhsExpressions(createListOfExpressions(expressions)); - setSub(assignSubstitution); - } - - private List<PExpression> createListOfExpressions( - final Expression[] expressions) { - final List<PExpression> list = new ArrayList<PExpression>(); - for (Expression e : expressions) { - final ExpressionVisitor visitor = new ExpressionVisitor( - new LinkedList<String>()); - e.accept(visitor); - list.add(visitor.getExpression()); - } - return list; - } - - private List<PExpression> createListOfIdentifiers( - final FreeIdentifier[] identifiers) { - final List<PExpression> res = new ArrayList<PExpression>( - identifiers.length); - for (FreeIdentifier freeIdentifier : identifiers) { - final List<TIdentifierLiteral> list = Arrays - .asList(new TIdentifierLiteral[] { new TIdentifierLiteral( - freeIdentifier.getName()) }); - final AIdentifierExpression expression = new AIdentifierExpression(); - expression.setIdentifier(list); - res.add(expression); - } - return res; - } - - @Override - public void visitBecomesMemberOf(final BecomesMemberOf assignment) { - final ABecomesElementOfSubstitution becomesElementOfSubstitution = new ABecomesElementOfSubstitution(); - final FreeIdentifier[] identifiers = assignment - .getAssignedIdentifiers(); - final Expression set = assignment.getSet(); - - final ExpressionVisitor visitor = new ExpressionVisitor( - new LinkedList<String>()); - set.accept(visitor); - - becomesElementOfSubstitution - .setIdentifiers(createListOfIdentifiers(identifiers)); - becomesElementOfSubstitution.setSet(visitor.getExpression()); - setSub(becomesElementOfSubstitution); - } - - @Override - public void visitBecomesSuchThat(final BecomesSuchThat assignment) { - final FreeIdentifier[] identifiers = assignment - .getAssignedIdentifiers(); - LinkedList<String> list = new LinkedList<String>(); - for (FreeIdentifier f : identifiers) { - list.addFirst(f.getName() + "'"); - } - final Predicate predicate = assignment.getCondition(); - final PredicateVisitor visitor = new PredicateVisitor(list); - predicate.accept(visitor); - final ABecomesSuchSubstitution becomesSuchSubstitution = new ABecomesSuchSubstitution(); - becomesSuchSubstitution - .setIdentifiers(createListOfIdentifiers(identifiers)); - becomesSuchSubstitution.setPredicate(visitor.getPredicate()); - setSub(becomesSuchSubstitution); - - } -} diff --git a/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java b/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java deleted file mode 100644 index 810f101003238e6cabb94e4f3504956201f535f0..0000000000000000000000000000000000000000 --- a/de.prob.core/src/de/prob/eventb/translator/ExpressionVisitor.java +++ /dev/null @@ -1,738 +0,0 @@ -/** - * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich - * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 - * (http://www.eclipse.org/org/documents/epl-v10.html) - * */ - -package de.prob.eventb.translator; // NOPMD -// high coupling is ok, we only use the AST nodes - -import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; - -import org.eventb.core.ast.AssociativeExpression; -import org.eventb.core.ast.AtomicExpression; -import org.eventb.core.ast.BinaryExpression; -import org.eventb.core.ast.BoolExpression; -import org.eventb.core.ast.BoundIdentDecl; -import org.eventb.core.ast.BoundIdentifier; -import org.eventb.core.ast.Expression; -import org.eventb.core.ast.ExtendedExpression; -import org.eventb.core.ast.Formula; -import org.eventb.core.ast.FreeIdentifier; -import org.eventb.core.ast.ISimpleVisitor; -import org.eventb.core.ast.IntegerLiteral; -import org.eventb.core.ast.Predicate; -import org.eventb.core.ast.QuantifiedExpression; -import org.eventb.core.ast.SetExtension; -import org.eventb.core.ast.UnaryExpression; -import org.eventb.core.ast.extension.IExpressionExtension; - -import de.be4.classicalb.core.parser.node.AAddExpression; -import de.be4.classicalb.core.parser.node.ABoolSetExpression; -import de.be4.classicalb.core.parser.node.ABooleanFalseExpression; -import de.be4.classicalb.core.parser.node.ABooleanTrueExpression; -import de.be4.classicalb.core.parser.node.ACardExpression; -import de.be4.classicalb.core.parser.node.ACartesianProductExpression; -import de.be4.classicalb.core.parser.node.ACompositionExpression; -import de.be4.classicalb.core.parser.node.AConvertBoolExpression; -import de.be4.classicalb.core.parser.node.ACoupleExpression; -import de.be4.classicalb.core.parser.node.ADirectProductExpression; -import de.be4.classicalb.core.parser.node.ADivExpression; -import de.be4.classicalb.core.parser.node.ADomainExpression; -import de.be4.classicalb.core.parser.node.ADomainRestrictionExpression; -import de.be4.classicalb.core.parser.node.ADomainSubtractionExpression; -import de.be4.classicalb.core.parser.node.AEmptySetExpression; -import de.be4.classicalb.core.parser.node.AEventBComprehensionSetExpression; -import de.be4.classicalb.core.parser.node.AEventBFirstProjectionExpression; -import de.be4.classicalb.core.parser.node.AEventBFirstProjectionV2Expression; -import de.be4.classicalb.core.parser.node.AEventBIdentityExpression; -import de.be4.classicalb.core.parser.node.AEventBSecondProjectionExpression; -import de.be4.classicalb.core.parser.node.AEventBSecondProjectionV2Expression; -import de.be4.classicalb.core.parser.node.AExtendedExprExpression; -import de.be4.classicalb.core.parser.node.AFunctionExpression; -import de.be4.classicalb.core.parser.node.AGeneralIntersectionExpression; -import de.be4.classicalb.core.parser.node.AGeneralUnionExpression; -import de.be4.classicalb.core.parser.node.AIdentifierExpression; -import de.be4.classicalb.core.parser.node.AIdentityExpression; -import de.be4.classicalb.core.parser.node.AImageExpression; -import de.be4.classicalb.core.parser.node.AIntegerExpression; -import de.be4.classicalb.core.parser.node.AIntegerSetExpression; -import de.be4.classicalb.core.parser.node.AIntersectionExpression; -import de.be4.classicalb.core.parser.node.AIntervalExpression; -import de.be4.classicalb.core.parser.node.AMaxExpression; -import de.be4.classicalb.core.parser.node.AMinExpression; -import de.be4.classicalb.core.parser.node.AMinusExpression; -import de.be4.classicalb.core.parser.node.AModuloExpression; -import de.be4.classicalb.core.parser.node.AMultiplicationExpression; -import de.be4.classicalb.core.parser.node.ANatural1SetExpression; -import de.be4.classicalb.core.parser.node.ANaturalSetExpression; -import de.be4.classicalb.core.parser.node.AOverwriteExpression; -import de.be4.classicalb.core.parser.node.AParallelProductExpression; -import de.be4.classicalb.core.parser.node.APartialFunctionExpression; -import de.be4.classicalb.core.parser.node.APartialInjectionExpression; -import de.be4.classicalb.core.parser.node.APartialSurjectionExpression; -import de.be4.classicalb.core.parser.node.APow1SubsetExpression; -import de.be4.classicalb.core.parser.node.APowSubsetExpression; -import de.be4.classicalb.core.parser.node.APowerOfExpression; -import de.be4.classicalb.core.parser.node.APredecessorExpression; -import de.be4.classicalb.core.parser.node.AQuantifiedIntersectionExpression; -import de.be4.classicalb.core.parser.node.AQuantifiedUnionExpression; -import de.be4.classicalb.core.parser.node.ARangeExpression; -import de.be4.classicalb.core.parser.node.ARangeRestrictionExpression; -import de.be4.classicalb.core.parser.node.ARangeSubtractionExpression; -import de.be4.classicalb.core.parser.node.ARelationsExpression; -import de.be4.classicalb.core.parser.node.AReverseExpression; -import de.be4.classicalb.core.parser.node.ARingExpression; -import de.be4.classicalb.core.parser.node.ASetExtensionExpression; -import de.be4.classicalb.core.parser.node.ASetSubtractionExpression; -import de.be4.classicalb.core.parser.node.ASuccessorExpression; -import de.be4.classicalb.core.parser.node.ASurjectionRelationExpression; -import de.be4.classicalb.core.parser.node.ATotalBijectionExpression; -import de.be4.classicalb.core.parser.node.ATotalFunctionExpression; -import de.be4.classicalb.core.parser.node.ATotalInjectionExpression; -import de.be4.classicalb.core.parser.node.ATotalRelationExpression; -import de.be4.classicalb.core.parser.node.ATotalSurjectionExpression; -import de.be4.classicalb.core.parser.node.ATotalSurjectionRelationExpression; -import de.be4.classicalb.core.parser.node.AUnaryMinusExpression; -import de.be4.classicalb.core.parser.node.AUnionExpression; -import de.be4.classicalb.core.parser.node.PExpression; -import de.be4.classicalb.core.parser.node.PPredicate; -import de.be4.classicalb.core.parser.node.TIdentifierLiteral; -import de.be4.classicalb.core.parser.node.TIntegerLiteral; -import de.prob.eventb.translator.internal.SimpleVisitorAdapter; -import de.prob.eventb.translator.internal.TranslationVisitor; - -// Complexity is actually quite low for a visitor ;-) -/** - * @deprecated Use {@link TranslationVisitor} instead - */ -@Deprecated -public class ExpressionVisitor extends SimpleVisitorAdapter implements // NOPMD - // by bendisposto - ISimpleVisitor { - - private PExpression e; - private final LinkedList<String> bounds; // NOPMD bendisposto - // we need some abilities of the linked list, using List is not an option - private boolean expressionSet = false; - - public ExpressionVisitor(final LinkedList<String> bounds) { // NOPMD - super(); - this.bounds = bounds; - } - - public PExpression getExpression() { - return e; - } - - public void setExpression(final PExpression e) { - if (expressionSet) { - throw new AssertionError("The Visitor must not be used twice!"); - } - expressionSet = true; - this.e = e; - } - - @Override - public void visitQuantifiedExpression(final QuantifiedExpression expression) { - // QUNION, QINTER, CSET - final int tag = expression.getTag(); - - final List<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>(); - - final BoundIdentDecl[] decls = expression.getBoundIdentDecls(); - for (final BoundIdentDecl boundIdentDecl : decls) { - final ExpressionVisitor visitor = new ExpressionVisitor(bounds); - boundIdentDecl.accept(visitor); - ev.add(visitor); - bounds.addFirst(boundIdentDecl.getName()); - } - - // Collect Subtrees in a list. - final LinkedList<PExpression> list = new LinkedList<PExpression>(); - for (final ExpressionVisitor visitor : ev) { - list.add(visitor.getExpression()); - } - - // Process internal Expression and Predicate - final Predicate predicate = expression.getPredicate(); - final PredicateVisitor predicateVisitor = new PredicateVisitor(bounds); - predicate.accept(predicateVisitor); - - final PPredicate pr = predicateVisitor.getPredicate(); - - final ExpressionVisitor expressionVisitor = new ExpressionVisitor( - bounds); - expression.getExpression().accept(expressionVisitor); - - final PExpression ex = expressionVisitor.getExpression(); - - switch (tag) { - case Formula.QUNION: - final AQuantifiedUnionExpression quantifiedUnionExpression = new AQuantifiedUnionExpression(); - quantifiedUnionExpression.setExpression(ex); - quantifiedUnionExpression.setPredicates(pr); - quantifiedUnionExpression.setIdentifiers(list); - setExpression(quantifiedUnionExpression); - break; - case Formula.QINTER: - final AQuantifiedIntersectionExpression quantifiedIntersectionExpression = new AQuantifiedIntersectionExpression(); - quantifiedIntersectionExpression.setExpression(ex); - quantifiedIntersectionExpression.setPredicates(pr); - quantifiedIntersectionExpression.setIdentifiers(list); - setExpression(quantifiedIntersectionExpression); - break; - case Formula.CSET: - final AEventBComprehensionSetExpression comprehensionSetExpression = new AEventBComprehensionSetExpression(); - comprehensionSetExpression.setExpression(ex); - comprehensionSetExpression.setPredicates(pr); - comprehensionSetExpression.setIdentifiers(list); - setExpression(comprehensionSetExpression); - break; - default: - break; - } - - for (int i = 0; i < decls.length; i++) { - bounds.remove(0); - } - } - - @Override - public void visitAssociativeExpression( - final AssociativeExpression expression) { - // BUNION, BINTER, BCOMP, FCOMP, OVR, PLUS, MUL - final Expression[] children = expression.getChildren(); - - final LinkedList<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>(); - - for (final Expression ex : children) { - final ExpressionVisitor e = new ExpressionVisitor(bounds); - ev.add(e); - ex.accept(e); - } - - final int tag = expression.getTag(); - switch (tag) { - case Formula.BUNION: - setExpression(recurseBUNION(ev)); - break; - case Formula.BINTER: - setExpression(recurseBINTER(ev)); - break; - case Formula.BCOMP: - setExpression(recurseBCOMP(ev)); - break; - case Formula.FCOMP: - setExpression(recurseFCOMP(ev)); - break; - case Formula.OVR: - setExpression(recurseOVR(ev)); - break; - case Formula.PLUS: - setExpression(recursePLUS(ev)); - break; - case Formula.MUL: - setExpression(recurseMUL(ev)); - break; - - default: - break; - } - super.visitAssociativeExpression(expression); - } - - private PExpression recurseFCOMP(final List<ExpressionVisitor> list) { - final ACompositionExpression r = new ACompositionExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseFCOMP(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recurseOVR(final List<ExpressionVisitor> list) { - final AOverwriteExpression r = new AOverwriteExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseOVR(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recursePLUS(final List<ExpressionVisitor> list) { - final AAddExpression r = new AAddExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recursePLUS(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recurseMUL(final List<ExpressionVisitor> list) { - final AMultiplicationExpression r = new AMultiplicationExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseMUL(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recurseBUNION(final List<ExpressionVisitor> list) { - final AUnionExpression r = new AUnionExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseBUNION(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recurseBINTER(final List<ExpressionVisitor> list) { - final AIntersectionExpression r = new AIntersectionExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseBINTER(list.subList(1, list.size()))); - } - return r; - } - - private PExpression recurseBCOMP(final List<ExpressionVisitor> list) { - final ARingExpression r = new ARingExpression(); - if (list.size() == 2) { - r.setLeft(list.get(0).getExpression()); - r.setRight(list.get(1).getExpression()); - } else { - r.setLeft(list.get(0).getExpression()); - r.setRight(recurseBCOMP(list.subList(1, list.size()))); - } - return r; - } - - @Override - // this long method is far easier to read than smaller ones - public void visitBinaryExpression(final BinaryExpression expression) { // NOPMD - final int tag = expression.getTag(); - final ExpressionVisitor visitorLeft = new ExpressionVisitor(bounds); - final ExpressionVisitor visitorRight = new ExpressionVisitor(bounds); - expression.getLeft().accept(visitorLeft); - expression.getRight().accept(visitorRight); - final PExpression exL = visitorLeft.getExpression(); - final PExpression exR = visitorRight.getExpression(); - - switch (tag) { - case Formula.MAPSTO: - final ACoupleExpression coupleExpression = new ACoupleExpression(); - coupleExpression.setList(Arrays - .asList(new PExpression[] { exL, exR })); - setExpression(coupleExpression); - break; - case Formula.REL: - final ARelationsExpression relationsExpression = new ARelationsExpression(); - relationsExpression.setLeft(exL); - relationsExpression.setRight(exR); - setExpression(relationsExpression); - break; - case Formula.TREL: - final ATotalRelationExpression totalRelationExpression = new ATotalRelationExpression(); - totalRelationExpression.setLeft(exL); - totalRelationExpression.setRight(exR); - setExpression(totalRelationExpression); - break; - case Formula.SREL: - final ASurjectionRelationExpression surjectionRelationExpression = new ASurjectionRelationExpression(); - surjectionRelationExpression.setLeft(exL); - surjectionRelationExpression.setRight(exR); - setExpression(surjectionRelationExpression); - break; - case Formula.STREL: - final ATotalSurjectionRelationExpression totalSurjectionRelationExpression = new ATotalSurjectionRelationExpression(); - totalSurjectionRelationExpression.setLeft(exL); - totalSurjectionRelationExpression.setRight(exR); - setExpression(totalSurjectionRelationExpression); - break; - case Formula.PFUN: - final APartialFunctionExpression partialFunctionExpression = new APartialFunctionExpression(); - partialFunctionExpression.setLeft(exL); - partialFunctionExpression.setRight(exR); - setExpression(partialFunctionExpression); - break; - case Formula.TFUN: - final ATotalFunctionExpression totalFunctionExpression = new ATotalFunctionExpression(); - totalFunctionExpression.setLeft(exL); - totalFunctionExpression.setRight(exR); - setExpression(totalFunctionExpression); - break; - case Formula.PINJ: - final APartialInjectionExpression partialInjectionExpression = new APartialInjectionExpression(); - partialInjectionExpression.setLeft(exL); - partialInjectionExpression.setRight(exR); - setExpression(partialInjectionExpression); - break; - case Formula.TINJ: - final ATotalInjectionExpression totalInjectionExpression = new ATotalInjectionExpression(); - totalInjectionExpression.setLeft(exL); - totalInjectionExpression.setRight(exR); - setExpression(totalInjectionExpression); - break; - case Formula.PSUR: - final APartialSurjectionExpression partialSurjectionExpression = new APartialSurjectionExpression(); - partialSurjectionExpression.setLeft(exL); - partialSurjectionExpression.setRight(exR); - setExpression(partialSurjectionExpression); - break; - case Formula.TSUR: - final ATotalSurjectionExpression totalSurjectionExpression = new ATotalSurjectionExpression(); - totalSurjectionExpression.setLeft(exL); - totalSurjectionExpression.setRight(exR); - setExpression(totalSurjectionExpression); - break; - case Formula.TBIJ: - final ATotalBijectionExpression totalBijectionExpression = new ATotalBijectionExpression(); - totalBijectionExpression.setLeft(exL); - totalBijectionExpression.setRight(exR); - setExpression(totalBijectionExpression); - break; - case Formula.SETMINUS: - final ASetSubtractionExpression setSubtractionExpression = new ASetSubtractionExpression(); - setSubtractionExpression.setLeft(exL); - setSubtractionExpression.setRight(exR); - setExpression(setSubtractionExpression); - break; - case Formula.CPROD: - final ACartesianProductExpression mulExpression = new ACartesianProductExpression(); - mulExpression.setLeft(exL); - mulExpression.setRight(exR); - setExpression(mulExpression); - break; - case Formula.DPROD: - final ADirectProductExpression directProductExpression = new ADirectProductExpression(); - directProductExpression.setLeft(exL); - directProductExpression.setRight(exR); - setExpression(directProductExpression); - break; - case Formula.PPROD: - final AParallelProductExpression parallelProductExpression = new AParallelProductExpression(); - parallelProductExpression.setLeft(exL); - parallelProductExpression.setRight(exR); - setExpression(parallelProductExpression); - break; - case Formula.DOMRES: - final ADomainRestrictionExpression domainRestrictionExpression = new ADomainRestrictionExpression(); - domainRestrictionExpression.setLeft(exL); - domainRestrictionExpression.setRight(exR); - setExpression(domainRestrictionExpression); - break; - case Formula.DOMSUB: - final ADomainSubtractionExpression domainSubtractionExpression = new ADomainSubtractionExpression(); - domainSubtractionExpression.setLeft(exL); - domainSubtractionExpression.setRight(exR); - setExpression(domainSubtractionExpression); - break; - case Formula.RANRES: - final ARangeRestrictionExpression rangeRestrictionExpression = new ARangeRestrictionExpression(); - rangeRestrictionExpression.setLeft(exL); - rangeRestrictionExpression.setRight(exR); - setExpression(rangeRestrictionExpression); - break; - case Formula.RANSUB: - final ARangeSubtractionExpression rangeSubtractionExpression = new ARangeSubtractionExpression(); - rangeSubtractionExpression.setLeft(exL); - rangeSubtractionExpression.setRight(exR); - setExpression(rangeSubtractionExpression); - break; - case Formula.UPTO: - final AIntervalExpression intervalExpression = new AIntervalExpression(); - intervalExpression.setLeftBorder(exL); - intervalExpression.setRightBorder(exR); - setExpression(intervalExpression); - break; - case Formula.MINUS: - final AMinusExpression minusExpression = new AMinusExpression(); - minusExpression.setLeft(exL); - minusExpression.setRight(exR); - setExpression(minusExpression); - break; - case Formula.DIV: - final ADivExpression divExpression = new ADivExpression(); - divExpression.setLeft(exL); - divExpression.setRight(exR); - setExpression(divExpression); - break; - case Formula.MOD: - final AModuloExpression moduloExpression = new AModuloExpression(); - moduloExpression.setLeft(exL); - moduloExpression.setRight(exR); - setExpression(moduloExpression); - break; - case Formula.EXPN: - final APowerOfExpression powerOfExpression = new APowerOfExpression(); - powerOfExpression.setLeft(exL); - powerOfExpression.setRight(exR); - setExpression(powerOfExpression); - break; - case Formula.FUNIMAGE: - final AFunctionExpression functionExpression = new AFunctionExpression(); - functionExpression.setIdentifier(exL); - functionExpression.setParameters(Arrays - .asList(new PExpression[] { exR })); - setExpression(functionExpression); - break; - case Formula.RELIMAGE: - final AImageExpression imageExpression = new AImageExpression(); - imageExpression.setLeft(exL); - imageExpression.setRight(exR); - setExpression(imageExpression); - break; - default: - throw new AssertionError("Uncovered Expression"); - } - - } - - @Override - public void visitAtomicExpression(final AtomicExpression expression) { // NOPMD - // by - // bendisposto - final int tag = expression.getTag(); - - switch (tag) { - case Formula.INTEGER: - setExpression(new AIntegerSetExpression()); - break; - case Formula.NATURAL: - setExpression(new ANaturalSetExpression()); - break; - case Formula.NATURAL1: - setExpression(new ANatural1SetExpression()); - break; - case Formula.BOOL: - setExpression(new ABoolSetExpression()); - break; - case Formula.TRUE: - setExpression(new ABooleanTrueExpression()); - break; - case Formula.FALSE: - setExpression(new ABooleanFalseExpression()); - break; - case Formula.EMPTYSET: - setExpression(new AEmptySetExpression()); - break; - case Formula.KPRED: - setExpression(new APredecessorExpression()); - break; - case Formula.KSUCC: - setExpression(new ASuccessorExpression()); - break; - case Formula.KPRJ1_GEN: // see task#215 - setExpression(new AEventBFirstProjectionV2Expression()); - break; - case Formula.KPRJ2_GEN: - setExpression(new AEventBSecondProjectionV2Expression()); - break; - case Formula.KID_GEN: - setExpression(new AEventBIdentityExpression()); - break; - default: - throw new AssertionError("Uncovered Expression " + expression); - } - } - - @Override - public void visitBoolExpression(final BoolExpression expression) { - final AConvertBoolExpression convertBoolExpression = new AConvertBoolExpression(); - final PredicateVisitor visitor = new PredicateVisitor(bounds); - expression.getPredicate().accept(visitor); - convertBoolExpression.setPredicate(visitor.getPredicate()); - setExpression(convertBoolExpression); - } - - @Override - public void visitBoundIdentDecl(final BoundIdentDecl boundIdentDecl) { - final List<TIdentifierLiteral> list = Arrays - .asList(new TIdentifierLiteral[] { new TIdentifierLiteral( - boundIdentDecl.getName()) }); - final AIdentifierExpression expression = new AIdentifierExpression(); - expression.setIdentifier(list); - setExpression(expression); - } - - @Override - public void visitBoundIdentifier(final BoundIdentifier identifierExpression) { - final List<TIdentifierLiteral> list = Arrays - .asList(new TIdentifierLiteral[] { new TIdentifierLiteral( - bounds.get(identifierExpression.getBoundIndex())) }); - final AIdentifierExpression expression = new AIdentifierExpression(); - expression.setIdentifier(list); - setExpression(expression); - } - - @Override - public void visitFreeIdentifier(final FreeIdentifier identifierExpression) { - final List<TIdentifierLiteral> list = Arrays - .asList(new TIdentifierLiteral[] { new TIdentifierLiteral( - identifierExpression.getName()) }); - final AIdentifierExpression expression = new AIdentifierExpression(); - expression.setIdentifier(list); - setExpression(expression); - } - - @Override - public void visitIntegerLiteral(final IntegerLiteral expression) { - final BigInteger value = expression.getValue(); - final AIntegerExpression integerExpression = new AIntegerExpression(); - integerExpression.setLiteral(new TIntegerLiteral(value.toString())); - setExpression(integerExpression); - } - - @Override - public void visitSetExtension(final SetExtension expression) { - final Expression[] members = expression.getMembers(); - final ASetExtensionExpression setExtensionExpression = new ASetExtensionExpression(); - final List<PExpression> list = new ArrayList<PExpression>(); - for (final Expression e : members) { - final ExpressionVisitor visitor = new ExpressionVisitor(bounds); - e.accept(visitor); - list.add(visitor.getExpression()); - } - setExtensionExpression.setExpressions(list); - setExpression(setExtensionExpression); - } - - @Override - public void visitExtendedExpression(ExtendedExpression expression) { - AExtendedExprExpression p = new AExtendedExprExpression(); - - IExpressionExtension extension = expression.getExtension(); - String symbol = extension.getSyntaxSymbol(); - - p.setIdentifier(new TIdentifierLiteral(symbol)); - Expression[] expressions = expression.getChildExpressions(); - List<PExpression> childExprs = new ArrayList<PExpression>(); - for (Expression e : expressions) { - ExpressionVisitor v = new ExpressionVisitor(bounds); - e.accept(v); - childExprs.add(v.getExpression()); - } - p.setExpressions(childExprs); - - Predicate[] childPredicates = expression.getChildPredicates(); - List<PPredicate> childPreds = new ArrayList<PPredicate>(); - for (Predicate pd : childPredicates) { - PredicateVisitor v = new PredicateVisitor(bounds); - pd.accept(v); - childPreds.add(v.getPredicate()); - } - p.setPredicates(childPreds); - - setExpression(p); - - } - - @Override - public void visitUnaryExpression(final UnaryExpression expression) { // NOPMD - // by - // bendisposto - final int tag = expression.getTag(); - final ExpressionVisitor visitor = new ExpressionVisitor(bounds); - expression.getChild().accept(visitor); - final PExpression exp = visitor.getExpression(); - - switch (tag) { - case Formula.KCARD: - final ACardExpression cardExpression = new ACardExpression(); - cardExpression.setExpression(exp); - setExpression(cardExpression); - break; - case Formula.POW: - final APowSubsetExpression powExpression = new APowSubsetExpression(); - powExpression.setExpression(exp); - setExpression(powExpression); - break; - case Formula.POW1: - final APow1SubsetExpression pow1Expression = new APow1SubsetExpression(); - pow1Expression.setExpression(exp); - setExpression(pow1Expression); - break; - case Formula.KUNION: - final AGeneralUnionExpression unionExpression = new AGeneralUnionExpression(); - unionExpression.setExpression(exp); - setExpression(unionExpression); - break; - case Formula.KINTER: - final AGeneralIntersectionExpression interExpression = new AGeneralIntersectionExpression(); - interExpression.setExpression(exp); - setExpression(interExpression); - break; - case Formula.KDOM: - final ADomainExpression domainExpression = new ADomainExpression(); - domainExpression.setExpression(exp); - setExpression(domainExpression); - break; - case Formula.KRAN: - final ARangeExpression rangeExpression = new ARangeExpression(); - rangeExpression.setExpression(exp); - setExpression(rangeExpression); - break; - case Formula.KPRJ1: - final AEventBFirstProjectionExpression firstProjectionExpression = new AEventBFirstProjectionExpression(); - firstProjectionExpression.setExpression(exp); - setExpression(firstProjectionExpression); - break; - case Formula.KPRJ2: - final AEventBSecondProjectionExpression secondProjectionExpression = new AEventBSecondProjectionExpression(); - secondProjectionExpression.setExpression(exp); - setExpression(secondProjectionExpression); - break; - case Formula.KID: - final AIdentityExpression identityExpression = new AIdentityExpression(); - identityExpression.setExpression(exp); - setExpression(identityExpression); - break; - case Formula.KMIN: - final AMinExpression minExpression = new AMinExpression(); - minExpression.setExpression(exp); - setExpression(minExpression); - break; - case Formula.KMAX: - final AMaxExpression maxExpression = new AMaxExpression(); - maxExpression.setExpression(exp); - setExpression(maxExpression); - break; - case Formula.CONVERSE: - final AReverseExpression reverseExpression = new AReverseExpression(); - reverseExpression.setExpression(exp); - setExpression(reverseExpression); - break; - case Formula.UNMINUS: - final AUnaryMinusExpression unaryExpression = new AUnaryMinusExpression(); - unaryExpression.setExpression(exp); - setExpression(unaryExpression); - break; - - default: - throw new AssertionError("Uncovered Expression"); - } - } -} diff --git a/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java b/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java deleted file mode 100644 index a4c8e75bb629b52048bf7b055cec3f68b2157ba6..0000000000000000000000000000000000000000 --- a/de.prob.core/src/de/prob/eventb/translator/PredicateVisitor.java +++ /dev/null @@ -1,453 +0,0 @@ -/** - * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, Heinrich - * Heine Universitaet Duesseldorf This software is licenced under EPL 1.0 - * (http://www.eclipse.org/org/documents/epl-v10.html) - * */ - -package de.prob.eventb.translator; // NOPMD -// High number of imports because it depends on AST - -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -import org.eventb.core.ast.AssociativePredicate; -import org.eventb.core.ast.BinaryPredicate; -import org.eventb.core.ast.BoundIdentDecl; -import org.eventb.core.ast.Expression; -import org.eventb.core.ast.ExtendedPredicate; -import org.eventb.core.ast.Formula; -import org.eventb.core.ast.ISimpleVisitor; -import org.eventb.core.ast.LiteralPredicate; -import org.eventb.core.ast.MultiplePredicate; -import org.eventb.core.ast.Predicate; -import org.eventb.core.ast.QuantifiedPredicate; -import org.eventb.core.ast.RelationalPredicate; -import org.eventb.core.ast.SimplePredicate; -import org.eventb.core.ast.UnaryPredicate; -import org.eventb.core.ast.extension.IPredicateExtension; - -import de.be4.classicalb.core.parser.node.AConjunctPredicate; -import de.be4.classicalb.core.parser.node.ADisjunctPredicate; -import de.be4.classicalb.core.parser.node.AEqualPredicate; -import de.be4.classicalb.core.parser.node.AEquivalencePredicate; -import de.be4.classicalb.core.parser.node.AExistsPredicate; -import de.be4.classicalb.core.parser.node.AExtendedPredPredicate; -import de.be4.classicalb.core.parser.node.AFalsityPredicate; -import de.be4.classicalb.core.parser.node.AFinitePredicate; -import de.be4.classicalb.core.parser.node.AForallPredicate; -import de.be4.classicalb.core.parser.node.AGreaterEqualPredicate; -import de.be4.classicalb.core.parser.node.AGreaterPredicate; -import de.be4.classicalb.core.parser.node.AImplicationPredicate; -import de.be4.classicalb.core.parser.node.ALessEqualPredicate; -import de.be4.classicalb.core.parser.node.ALessPredicate; -import de.be4.classicalb.core.parser.node.AMemberPredicate; -import de.be4.classicalb.core.parser.node.ANegationPredicate; -import de.be4.classicalb.core.parser.node.ANotEqualPredicate; -import de.be4.classicalb.core.parser.node.ANotMemberPredicate; -import de.be4.classicalb.core.parser.node.ANotSubsetPredicate; -import de.be4.classicalb.core.parser.node.ANotSubsetStrictPredicate; -import de.be4.classicalb.core.parser.node.APartitionPredicate; -import de.be4.classicalb.core.parser.node.ASubsetPredicate; -import de.be4.classicalb.core.parser.node.ASubsetStrictPredicate; -import de.be4.classicalb.core.parser.node.ATruthPredicate; -import de.be4.classicalb.core.parser.node.PExpression; -import de.be4.classicalb.core.parser.node.PPredicate; -import de.be4.classicalb.core.parser.node.TIdentifierLiteral; -import de.prob.eventb.translator.internal.SimpleVisitorAdapter; -import de.prob.eventb.translator.internal.TranslationVisitor; - -/** - * @deprecated Use {@link TranslationVisitor} instead - */ -@Deprecated -public class PredicateVisitor extends SimpleVisitorAdapter implements // NOPMD - ISimpleVisitor { - - private static final String UNCOVERED_PREDICATE = "Uncovered Predicate"; - - private PPredicate p; - - private final LinkedList<String> bounds; // NOPMD - // we need properties of linked lists, List is not an option - - private boolean predicateSet = false; - - public PPredicate getPredicate() { - return p; - } - - public void setPredicate(final PPredicate p) { - synchronized (bounds) { - if (predicateSet) { - throw new AssertionError("The Visitor must not be used twice!"); - } - predicateSet = true; - this.p = p; - } - // public ClassifiedPragma(String name, Node attachedTo, List<String> - // arguments, List<String> warnings, SourcePosition start, - // SourcePosition end) { - - // new ClassifiedPragma("discharged", p, proof, Collections.emptyList(), - // new SourcePosition(-1, -1), new SourcePosition(-1, -1)); - } - - public PredicateVisitor() { - this(null); - } - - public PredicateVisitor(LinkedList<String> bounds) { - super(); - if (bounds == null) { - this.bounds = new LinkedList<String>(); - } else { - this.bounds = bounds; - } - } - - @Override - public void visitQuantifiedPredicate(final QuantifiedPredicate predicate) { - final int tag = predicate.getTag(); - - // Add quantified identifiers to bound list and recursively create - // subtrees representing the identifiers - final List<ExpressionVisitor> ev = new LinkedList<ExpressionVisitor>(); - final BoundIdentDecl[] decls = predicate.getBoundIdentDecls(); - for (final BoundIdentDecl boundIdentDecl : decls) { - final ExpressionVisitor visitor = new ExpressionVisitor(bounds); - boundIdentDecl.accept(visitor); - ev.add(visitor); - bounds.addFirst(boundIdentDecl.getName()); - } - - // Collect Subtrees in a list - final LinkedList<PExpression> list = new LinkedList<PExpression>(); - for (final ExpressionVisitor visitor : ev) { - list.add(visitor.getExpression()); - } - - // Recursively analyze the predicate (important, bounds are already set) - final PredicateVisitor predicateVisitor = new PredicateVisitor(bounds); - predicate.getPredicate().accept(predicateVisitor); - - switch (tag) { - case Formula.EXISTS: - final AExistsPredicate existentialQuantificationPredicate = new AExistsPredicate(); - existentialQuantificationPredicate.setIdentifiers(list); - existentialQuantificationPredicate.setPredicate(predicateVisitor - .getPredicate()); - setPredicate(existentialQuantificationPredicate); - break; - case Formula.FORALL: - final AForallPredicate universalQuantificationPredicate = new AForallPredicate(); - universalQuantificationPredicate.setIdentifiers(list); - PPredicate pred = predicateVisitor.getPredicate(); - if (!(pred instanceof AImplicationPredicate)) { - pred = new AImplicationPredicate(new ATruthPredicate(), pred); - } - universalQuantificationPredicate.setImplication(pred); - setPredicate(universalQuantificationPredicate); - break; - - default: - throw new AssertionError(UNCOVERED_PREDICATE); - } - // remove quantified identifiers from bound list (leaving scope) - for (int i = 0; i < decls.length; i++) { - bounds.removeFirst(); - } - - } - - @Override - public void visitAssociativePredicate(final AssociativePredicate predicate) { - // {LAND, LOR, LEQV} - final int tag = predicate.getTag(); - final Predicate[] children = predicate.getChildren(); - if (children.length < 2) { - throw new AssertionError( - "Predicate must have at least 2 subpredicates."); - } - - final LinkedList<PredicateVisitor> pv = new LinkedList<PredicateVisitor>(); - - for (final Predicate pr : children) { - final PredicateVisitor p = new PredicateVisitor(bounds); - pv.add(p); - pr.accept(p); - } - - switch (tag) { - case Formula.LOR: - setPredicate(recurseOR(pv)); - break; - - case Formula.LAND: - setPredicate(recurseAND(pv)); - break; - case Formula.LEQV: - setPredicate(recurseEQV(pv)); - break; - - default: - throw new AssertionError(UNCOVERED_PREDICATE); - } - - } - - private PPredicate recurseOR(final List<PredicateVisitor> list) { - final ADisjunctPredicate r = new ADisjunctPredicate(); - if (list.size() == 2) { - r.setLeft(list.get(0).getPredicate()); - r.setRight(list.get(1).getPredicate()); - } else { - r.setLeft(list.get(0).getPredicate()); - r.setRight(recurseOR(list.subList(1, list.size()))); - } - return r; - } - - private PPredicate recurseAND(final List<PredicateVisitor> list) { - final AConjunctPredicate r = new AConjunctPredicate(); - if (list.size() == 2) { - r.setLeft(list.get(0).getPredicate()); - r.setRight(list.get(1).getPredicate()); - } else { - r.setLeft(list.get(0).getPredicate()); - r.setRight(recurseAND(list.subList(1, list.size()))); - } - return r; - } - - private PPredicate recurseEQV(final List<PredicateVisitor> list) { - final AEquivalencePredicate r = new AEquivalencePredicate(); - if (list.size() == 2) { - r.setLeft(list.get(0).getPredicate()); - r.setRight(list.get(1).getPredicate()); - } else { - r.setLeft(list.get(0).getPredicate()); - r.setRight(recurseEQV(list.subList(1, list.size()))); - } - return r; - } - - @Override - public void visitBinaryPredicate(final BinaryPredicate predicate) { - final int tag = predicate.getTag(); - - final PredicateVisitor subLeft = new PredicateVisitor(bounds); - predicate.getLeft().accept(subLeft); - final PredicateVisitor subRight = new PredicateVisitor(bounds); - predicate.getRight().accept(subRight); - - switch (tag) { - case Formula.LIMP: - final AImplicationPredicate limp = new AImplicationPredicate(); - limp.setLeft(subLeft.getPredicate()); - limp.setRight(subRight.getPredicate()); - setPredicate(limp); - break; - case Formula.LEQV: - final AEquivalencePredicate leqv = new AEquivalencePredicate(); - leqv.setLeft(subLeft.getPredicate()); - leqv.setRight(subRight.getPredicate()); - setPredicate(leqv); - break; - default: - throw new AssertionError(UNCOVERED_PREDICATE); - } - } - - @Override - public void visitLiteralPredicate(final LiteralPredicate predicate) { - final int tag = predicate.getTag(); - switch (tag) { - case Formula.BTRUE: - setPredicate(new ATruthPredicate()); - break; - case Formula.BFALSE: - setPredicate(new AFalsityPredicate()); - break; - - default: - throw new AssertionError(UNCOVERED_PREDICATE); - } - } - - @Override - public void visitRelationalPredicate(final RelationalPredicate predicate) { // NOPMD - // High complexity is ok - // EQUAL, NOTEQUAL, LT, LE, GT, GE, IN, NOTIN, SUBSET, - // NOTSUBSET, SUBSETEQ, NOTSUBSETEQ - final ExpressionVisitor subLeft = new ExpressionVisitor(bounds); - predicate.getLeft().accept(subLeft); - final ExpressionVisitor subRight = new ExpressionVisitor(bounds); - predicate.getRight().accept(subRight); - - final int tag = predicate.getTag(); - - switch (tag) { - case Formula.EQUAL: - final AEqualPredicate equalPredicate = new AEqualPredicate(); - equalPredicate.setLeft(subLeft.getExpression()); - equalPredicate.setRight(subRight.getExpression()); - setPredicate(equalPredicate); - break; - case Formula.NOTEQUAL: - final ANotEqualPredicate unequalPredicate = new ANotEqualPredicate(); - unequalPredicate.setLeft(subLeft.getExpression()); - unequalPredicate.setRight(subRight.getExpression()); - setPredicate(unequalPredicate); - break; - - case Formula.LT: - final ALessPredicate ltPredicate = new ALessPredicate(); - ltPredicate.setLeft(subLeft.getExpression()); - ltPredicate.setRight(subRight.getExpression()); - setPredicate(ltPredicate); - break; - case Formula.LE: - final ALessEqualPredicate lePredicate = new ALessEqualPredicate(); - lePredicate.setLeft(subLeft.getExpression()); - lePredicate.setRight(subRight.getExpression()); - setPredicate(lePredicate); - break; - case Formula.GT: - final AGreaterPredicate gtPredicate = new AGreaterPredicate(); - gtPredicate.setLeft(subLeft.getExpression()); - gtPredicate.setRight(subRight.getExpression()); - setPredicate(gtPredicate); - break; - case Formula.GE: - final AGreaterEqualPredicate gePredicate = new AGreaterEqualPredicate(); - gePredicate.setLeft(subLeft.getExpression()); - gePredicate.setRight(subRight.getExpression()); - setPredicate(gePredicate); - break; - - case Formula.IN: - final AMemberPredicate inPredicate = new AMemberPredicate(); - inPredicate.setLeft(subLeft.getExpression()); - inPredicate.setRight(subRight.getExpression()); - setPredicate(inPredicate); - break; - case Formula.NOTIN: - final ANotMemberPredicate ninPredicate = new ANotMemberPredicate(); - ninPredicate.setLeft(subLeft.getExpression()); - ninPredicate.setRight(subRight.getExpression()); - setPredicate(ninPredicate); - break; - case Formula.SUBSET: - final ASubsetStrictPredicate strictSubsetPredicate = new ASubsetStrictPredicate(); - strictSubsetPredicate.setLeft(subLeft.getExpression()); - strictSubsetPredicate.setRight(subRight.getExpression()); - setPredicate(strictSubsetPredicate); - break; - case Formula.NOTSUBSET: - final ANotSubsetStrictPredicate notStrictSubsetPredicate = new ANotSubsetStrictPredicate(); - notStrictSubsetPredicate.setLeft(subLeft.getExpression()); - notStrictSubsetPredicate.setRight(subRight.getExpression()); - setPredicate(notStrictSubsetPredicate); - break; - case Formula.SUBSETEQ: - final ASubsetPredicate subsetPredicate = new ASubsetPredicate(); - subsetPredicate.setLeft(subLeft.getExpression()); - subsetPredicate.setRight(subRight.getExpression()); - setPredicate(subsetPredicate); - break; - case Formula.NOTSUBSETEQ: - final ANotSubsetPredicate notSubsetPredicate = new ANotSubsetPredicate(); - notSubsetPredicate.setLeft(subLeft.getExpression()); - notSubsetPredicate.setRight(subRight.getExpression()); - setPredicate(notSubsetPredicate); - break; - - default: - throw new AssertionError(UNCOVERED_PREDICATE); - } - - } - - @Override - public void visitSimplePredicate(final SimplePredicate predicate) { - if (predicate.getTag() != Formula.KFINITE) { - throw new AssertionError(UNCOVERED_PREDICATE); - } - final AFinitePredicate finite = new AFinitePredicate(); - final ExpressionVisitor subEx = new ExpressionVisitor(bounds); - predicate.getExpression().accept(subEx); - finite.setSet(subEx.getExpression()); - setPredicate(finite); - } - - @Override - public void visitUnaryPredicate(final UnaryPredicate predicate) { - if (predicate.getTag() != Formula.NOT) { - throw new AssertionError(UNCOVERED_PREDICATE); - } - final ANegationPredicate negationPredicate = new ANegationPredicate(); - final PredicateVisitor sub = new PredicateVisitor(bounds); - predicate.getChild().accept(sub); - negationPredicate.setPredicate(sub.getPredicate()); - setPredicate(negationPredicate); - } - - @Override - public void visitMultiplePredicate(final MultiplePredicate predicate) { - final Expression[] subs = predicate.getChildren(); - final List<PExpression> expressions = new ArrayList<PExpression>( - subs.length); - for (Expression e : subs) { - final ExpressionVisitor sub = new ExpressionVisitor(bounds); - e.accept(sub); - expressions.add(sub.getExpression()); - } - - final PPredicate result; - if (predicate.getTag() == Formula.KPARTITION) { - if (expressions.size() > 0) { - PExpression set = expressions.remove(0); - result = new APartitionPredicate(set, expressions); - } else { - throw new AssertionError("to few arguments for PARTITION"); - } - } else { - throw new AssertionError(UNCOVERED_PREDICATE); - } - setPredicate(result); - } - - @Override - public void visitExtendedPredicate(ExtendedPredicate predicate) { - AExtendedPredPredicate p = new AExtendedPredPredicate(); - IPredicateExtension extension = predicate.getExtension(); - String symbol = extension.getSyntaxSymbol(); - - // FIXME THEORY-PLUGIN re-enable when the theory plugin was released - - // Theories.addOrigin(origin); - - p.setIdentifier(new TIdentifierLiteral(symbol)); - - Expression[] expressions = predicate.getChildExpressions(); - List<PExpression> childExprs = new ArrayList<PExpression>(); - for (Expression e : expressions) { - ExpressionVisitor v = new ExpressionVisitor(bounds); - e.accept(v); - childExprs.add(v.getExpression()); - } - p.setExpressions(childExprs); - - Predicate[] childPredicates = predicate.getChildPredicates(); - List<PPredicate> childPreds = new ArrayList<PPredicate>(); - for (Predicate pd : childPredicates) { - PredicateVisitor v = new PredicateVisitor(bounds); - pd.accept(v); - childPreds.add(v.getPredicate()); - } - p.setPredicates(childPreds); - setPredicate(p); - } - -} diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java b/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java deleted file mode 100644 index b6b186285f102b1336e76d5686360313ec31dfef..0000000000000000000000000000000000000000 --- a/de.prob.core/src/de/prob/eventb/translator/internal/SimpleVisitorAdapter.java +++ /dev/null @@ -1,157 +0,0 @@ -/** - * (c) 2009 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, - * Heinrich Heine Universitaet Duesseldorf - * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) - * */ - -package de.prob.eventb.translator.internal; - -import org.eventb.core.ast.AssociativeExpression; -import org.eventb.core.ast.AssociativePredicate; -import org.eventb.core.ast.AtomicExpression; -import org.eventb.core.ast.BecomesEqualTo; -import org.eventb.core.ast.BecomesMemberOf; -import org.eventb.core.ast.BecomesSuchThat; -import org.eventb.core.ast.BinaryExpression; -import org.eventb.core.ast.BinaryPredicate; -import org.eventb.core.ast.BoolExpression; -import org.eventb.core.ast.BoundIdentDecl; -import org.eventb.core.ast.BoundIdentifier; -import org.eventb.core.ast.ExtendedExpression; -import org.eventb.core.ast.ExtendedPredicate; -import org.eventb.core.ast.FreeIdentifier; -import org.eventb.core.ast.ISimpleVisitor; -import org.eventb.core.ast.IntegerLiteral; -import org.eventb.core.ast.LiteralPredicate; -import org.eventb.core.ast.MultiplePredicate; -import org.eventb.core.ast.QuantifiedExpression; -import org.eventb.core.ast.QuantifiedPredicate; -import org.eventb.core.ast.RelationalPredicate; -import org.eventb.core.ast.SetExtension; -import org.eventb.core.ast.SimplePredicate; -import org.eventb.core.ast.UnaryExpression; -import org.eventb.core.ast.UnaryPredicate; - -public class SimpleVisitorAdapter implements ISimpleVisitor { - - public void visitAssociativeExpression( - final AssociativeExpression expression) { - // Default implementation does nothing - } - - public void visitAssociativePredicate(final AssociativePredicate predicate) { - // Default implementation does nothing - - } - - public void visitAtomicExpression(final AtomicExpression expression) { - // Default implementation does nothing - - } - - public void visitBecomesEqualTo(final BecomesEqualTo assignment) { - - // Default implementation does nothing - } - - public void visitBecomesMemberOf(final BecomesMemberOf assignment) { - // Default implementation does nothing - - } - - public void visitBecomesSuchThat(final BecomesSuchThat assignment) { - // Default implementation does nothing - - } - - public void visitBinaryExpression(final BinaryExpression expression) { - - // Default implementation does nothing - } - - public void visitBinaryPredicate(final BinaryPredicate predicate) { - // Default implementation does nothing - - } - - public void visitBoolExpression(final BoolExpression expression) { - // Default implementation does nothing - - } - - public void visitBoundIdentDecl(final BoundIdentDecl boundIdentDecl) { - // Default implementation does nothing - - } - - public void visitBoundIdentifier(final BoundIdentifier identifierExpression) { - // Default implementation does nothing - - } - - public void visitFreeIdentifier(final FreeIdentifier identifierExpression) { - // Default implementation does nothing - - } - - public void visitIntegerLiteral(final IntegerLiteral expression) { - // Default implementation does nothing - - } - - public void visitLiteralPredicate(final LiteralPredicate predicate) { - // Default implementation does nothing - - } - - public void visitQuantifiedExpression(final QuantifiedExpression expression) { - // Default implementation does nothing - - } - - public void visitQuantifiedPredicate(final QuantifiedPredicate predicate) { - // Default implementation does nothing - - } - - public void visitRelationalPredicate(final RelationalPredicate predicate) { - // Default implementation does nothing - - } - - public void visitSetExtension(final SetExtension expression) { - // Default implementation does nothing - - } - - public void visitSimplePredicate(final SimplePredicate predicate) { - // Default implementation does nothing - - } - - public void visitUnaryExpression(final UnaryExpression expression) { - // Default implementation does nothing - - } - - public void visitUnaryPredicate(final UnaryPredicate predicate) { - // Default implementation does nothing - - } - - public void visitMultiplePredicate(final MultiplePredicate predicate) { - // Default implementation does nothing - - } - - @Override - public void visitExtendedExpression(final ExtendedExpression expression) { - // Default implementation does nothing - } - - @Override - public void visitExtendedPredicate(final ExtendedPredicate predicate) { - // Default implementation does nothing - } - -} diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java b/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java index 1c6801c97f5e9da610531a5f9d8834dd3641504d..87d6fb7f4339bed2e99ffa60a56dff9a71875350 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/TranslationVisitor.java @@ -6,26 +6,63 @@ package de.prob.eventb.translator.internal; -import java.util.*; - -import org.eventb.core.ast.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.eventb.core.ast.Assignment; +import org.eventb.core.ast.AssociativeExpression; +import org.eventb.core.ast.AssociativePredicate; +import org.eventb.core.ast.AtomicExpression; +import org.eventb.core.ast.BecomesEqualTo; +import org.eventb.core.ast.BecomesMemberOf; +import org.eventb.core.ast.BecomesSuchThat; +import org.eventb.core.ast.BinaryExpression; +import org.eventb.core.ast.BinaryPredicate; +import org.eventb.core.ast.BoolExpression; +import org.eventb.core.ast.BooleanType; +import org.eventb.core.ast.BoundIdentDecl; +import org.eventb.core.ast.BoundIdentifier; +import org.eventb.core.ast.Expression; +import org.eventb.core.ast.ExtendedExpression; +import org.eventb.core.ast.ExtendedPredicate; +import org.eventb.core.ast.Formula; +import org.eventb.core.ast.FreeIdentifier; +import org.eventb.core.ast.GivenType; +import org.eventb.core.ast.ISimpleVisitor; +import org.eventb.core.ast.IntegerLiteral; +import org.eventb.core.ast.IntegerType; +import org.eventb.core.ast.LiteralPredicate; +import org.eventb.core.ast.MultiplePredicate; +import org.eventb.core.ast.ParametricType; +import org.eventb.core.ast.PowerSetType; +import org.eventb.core.ast.Predicate; +import org.eventb.core.ast.ProductType; +import org.eventb.core.ast.QuantifiedExpression; +import org.eventb.core.ast.QuantifiedPredicate; +import org.eventb.core.ast.RelationalPredicate; +import org.eventb.core.ast.SetExtension; +import org.eventb.core.ast.SimplePredicate; +import org.eventb.core.ast.Type; +import org.eventb.core.ast.UnaryExpression; +import org.eventb.core.ast.UnaryPredicate; +import org.eventb.core.ast.extension.IExpressionExtension; import de.be4.classicalb.core.parser.node.*; -import de.prob.eventb.translator.*; /** - * The global SuppressWarnings annotation is used because the deprecated code is - * used to check if this new implementation computes the same results as the old - * code. - * - * That should be removed after a while. + * This visitor on an Event-B AST generates an AST in ProB's format. * * @author plagge */ -@SuppressWarnings("deprecation") public class TranslationVisitor implements ISimpleVisitor { private static final String UNCOVERED_PREDICATE = "Uncovered Predicate"; + private static final int[] EXTRA_TYPE_CONSTRUCTS = new int[] { + Formula.EMPTYSET, Formula.KPRJ1_GEN, Formula.KPRJ2_GEN, + Formula.KID_GEN }; + private final LookupStack<PPredicate> predicates = new LookupStack<PPredicate>(); private final LookupStack<PExpression> expressions = new LookupStack<PExpression>(); private final LookupStack<PSubstitution> substitutions = new LookupStack<PSubstitution>(); @@ -62,7 +99,100 @@ public class TranslationVisitor implements ISimpleVisitor { default: throw new AssertionError(UNCOVERED_PREDICATE); } - expressions.push(result); + pushExpression(expression, result); + } + + /** + * Push an expression on the stack. The original (not translated) expression + * is needed to check whether the expression should wrapped by a typeof(...) + * operator. + * + * @param original + * @param translated + */ + private void pushExpression(Expression original, PExpression translated) { + final PExpression toPush; + if (original.getType() != null && shouldHaveExtraTypeInfo(original)) { + toPush = new ATypeofExpression(translated, + translateType(original.getType())); + } else { + toPush = translated; + } + expressions.push(toPush); + } + + /** + * Check if this expression needs additional type information in the + * translation. This can be the e.g. case for {} or id + * + * @see #EXTRA_TYPE_CONSTRUCTS + * @param original + * @return <code>true</code> if the + */ + private boolean shouldHaveExtraTypeInfo(Expression original) { + if (original instanceof ExtendedExpression) { + // We always wrap extended expressions + return true; + } else { + // Look into the list of constructs that need type information. + // A linear search shouldn't be problematic (or is maybe the fastest + // solution) because there are only a few elements. + int tag = original.getTag(); + for (int i = 0; i < EXTRA_TYPE_CONSTRUCTS.length; i++) { + if (EXTRA_TYPE_CONSTRUCTS[i] == tag) + return true; + } + return false; + } + } + + /** + * Translate a Event-B type to a corresponding ProB AST. + * + * This could theoretically directly be done by using + * {@link Type#toExpression(org.eventb.core.ast.FormulaFactory)} and + * translating that expression, but then we would need a formula factory. + * + * @param type + * the type to translate, never <code>null</code> + * @return the translated expression, never <code>null</code> + * @throws AssertionError + * if a type is encountered that cannot be translated + */ + private PExpression translateType(Type type) { + final PExpression result; + if (type instanceof BooleanType) { + result = new ABoolSetExpression(); + } else if (type instanceof GivenType) { + final String name = ((GivenType) type).getName(); + result = createIdentifierExpression(name); + } else if (type instanceof IntegerType) { + result = new AIntegerSetExpression(); + } else if (type instanceof PowerSetType) { + final Type a = ((PowerSetType) type).getBaseType(); + result = new APowSubsetExpression(translateType(a)); + } else if (type instanceof ProductType) { + final Type a = ((ProductType) type).getLeft(); + final Type b = ((ProductType) type).getRight(); + result = new ACartesianProductExpression(translateType(a), + translateType(b)); + } else if (type instanceof ParametricType) { + final ParametricType pt = (ParametricType) type; + final IExpressionExtension ext = pt.getExprExtension(); + final Type[] params = pt.getTypeParameters(); + final List<PExpression> list = new ArrayList<PExpression>(); + for (final Type param : params) { + list.add(translateType(param)); + } + result = new AExtendedExprExpression(new TIdentifierLiteral( + ext.getSyntaxSymbol()), list, + Collections.<PPredicate> emptyList()); + } else { + throw new AssertionError( + "Don't know how to handle the Event-B type of class " + + type.getClass().getCanonicalName()); + } + return result; } private PExpression recurseFCOMP(final List<PExpression> list) { @@ -188,7 +318,7 @@ public class TranslationVisitor implements ISimpleVisitor { default: throw new AssertionError("Uncovered Expression " + expression); } - expressions.push(result); + pushExpression(expression, result); } @Override @@ -313,7 +443,7 @@ public class TranslationVisitor implements ISimpleVisitor { default: throw new AssertionError("Uncovered Expression"); } - expressions.push(result); + pushExpression(expression, result); } @Override @@ -337,7 +467,7 @@ public class TranslationVisitor implements ISimpleVisitor { @Override public void visitBoolExpression(final BoolExpression expression) { final PPredicate pred = getPredicate(expression.getPredicate()); - expressions.push(new AConvertBoolExpression(pred)); + pushExpression(expression, new AConvertBoolExpression(pred)); } @Override @@ -357,19 +487,20 @@ public class TranslationVisitor implements ISimpleVisitor { public void visitBoundIdentifier(final BoundIdentifier identifierExpression) { final String name = boundVariables.get(identifierExpression .getBoundIndex()); - expressions.push(createIdentifierExpression(name)); + pushExpression(identifierExpression, createIdentifierExpression(name)); } @Override public void visitFreeIdentifier(final FreeIdentifier identifierExpression) { - expressions.push(createIdentifierExpression(identifierExpression - .getName())); + pushExpression(identifierExpression, + createIdentifierExpression(identifierExpression.getName())); } @Override public void visitIntegerLiteral(final IntegerLiteral expression) { final String value = expression.getValue().toString(); - expressions.push(new AIntegerExpression(new TIntegerLiteral(value))); + pushExpression(expression, new AIntegerExpression(new TIntegerLiteral( + value))); } @Override @@ -392,28 +523,30 @@ public class TranslationVisitor implements ISimpleVisitor { public void visitQuantifiedExpression(final QuantifiedExpression expression) { // Add quantified identifiers to bound list and recursively create // subtrees representing the identifiers - int originalBoundSize = boundVariables.size(); - final List<PExpression> list = getSubExpressions(expression - .getBoundIdentDecls()); + final int originalBoundSize = boundVariables.size(); + final BoundIdentDecl[] decls = expression.getBoundIdentDecls(); + final List<PExpression> list = getSubExpressions(decls); final PPredicate pr = getPredicate(expression.getPredicate()); final PExpression ex = getExpression(expression.getExpression()); boundVariables.shrinkToSize(originalBoundSize); + final PPredicate pred = addTypesToPredicate(pr, decls); + final PExpression result; switch (expression.getTag()) { case Formula.QUNION: - result = new AQuantifiedUnionExpression(list, pr, ex); + result = new AQuantifiedUnionExpression(list, pred, ex); break; case Formula.QINTER: - result = new AQuantifiedIntersectionExpression(list, pr, ex); + result = new AQuantifiedIntersectionExpression(list, pred, ex); break; case Formula.CSET: - result = new AEventBComprehensionSetExpression(list, ex, pr); + result = new AEventBComprehensionSetExpression(list, ex, pred); break; default: throw new AssertionError(UNCOVERED_PREDICATE); } - expressions.push(result); + pushExpression(expression, result); } @Override @@ -421,8 +554,8 @@ public class TranslationVisitor implements ISimpleVisitor { // Add quantified identifiers to bound list and recursively create // subtrees representing the identifiers int originalBoundSize = boundVariables.size(); - final List<PExpression> list = getSubExpressions(predicate - .getBoundIdentDecls()); + final BoundIdentDecl[] decls = predicate.getBoundIdentDecls(); + final List<PExpression> list = getSubExpressions(decls); // Recursively analyze the predicate (important, bounds are already set) final PPredicate pred = getPredicate(predicate.getPredicate()); boundVariables.shrinkToSize(originalBoundSize); @@ -430,11 +563,22 @@ public class TranslationVisitor implements ISimpleVisitor { final PPredicate result; switch (predicate.getTag()) { case Formula.EXISTS: - result = new AExistsPredicate(list, pred); + result = new AExistsPredicate(list, + addTypesToPredicate(pred, decls)); break; case Formula.FORALL: - final PPredicate impl = pred instanceof AImplicationPredicate ? pred - : new AImplicationPredicate(new ATruthPredicate(), pred); + final PPredicate left; + final PPredicate right; + if (pred instanceof AImplicationPredicate) { + final AImplicationPredicate i = (AImplicationPredicate) pred; + left = addTypesToPredicate(i.getLeft(), decls); + right = i.getRight(); + } else { + left = addTypesToPredicate(null, decls); + right = pred; + } + final PPredicate impl = new AImplicationPredicate( + left != null ? left : new ATruthPredicate(), right); result = new AForallPredicate(list, impl); break; default: @@ -443,6 +587,51 @@ public class TranslationVisitor implements ISimpleVisitor { predicates.push(result); } + /** + * If we have declarations of x and y with types S resp. T, add the type + * information to the original predicate P. The result would be + * <code>x:S & (y:T & P)</code>. + * + * If decls is empty, the original predicate is returned unmodified. + * + * An alternative approach to this would be adding the type information + * directly to the identifiers with an oftype expression. The AST allows + * this because it expects expressions in the list of declarations. But the + * type checker must be adapted. The approach here makes (arguably) stronger + * modifications to the structure of the AST. + * + * @param predicate + * the original predicate, <code>null</code> if no original + * predicate is used. + * @param decls + * a list of declarations, never <code>null</code> + * @return the original predicate plus type information, <code>null</code> + * if no original predicate is given and decls is empty + */ + private PPredicate addTypesToPredicate(PPredicate predicate, + BoundIdentDecl[] decls) { + for (int i = decls.length; i > 0; i--) { + final BoundIdentDecl decl = decls[i - 1]; + final Type type = decl.getType(); + // I've encountered null types. Maybe that was a bug but just to be + // sure (in most cases, missing type information won't hurt): + if (type != null) { + // put a translation of the identifier on the stack ... + decl.accept(this); + // ... and take it + final PExpression expr = expressions.pop(); + // construct "expr:type" + final PPredicate member = new AMemberPredicate(expr, + translateType(type)); + // and P := "expr:type & P", if no P is given (predicate is + // null), just "expr:type" + predicate = predicate == null ? member + : new AConjunctPredicate(member, predicate); + } + } + return predicate; + } + @Override public void visitRelationalPredicate(final RelationalPredicate predicate) { // EQUAL, NOTEQUAL, LT, LE, GT, GE, IN, NOTIN, SUBSET, @@ -497,7 +686,7 @@ public class TranslationVisitor implements ISimpleVisitor { public void visitSetExtension(final SetExtension expression) { final Expression[] members = expression.getMembers(); final List<PExpression> list = getSubExpressions(members); - expressions.push(new ASetExtensionExpression(list)); + pushExpression(expression, new ASetExtensionExpression(list)); } @Override @@ -512,6 +701,7 @@ public class TranslationVisitor implements ISimpleVisitor { predicates.push(result); } + @SuppressWarnings("deprecation") @Override public void visitUnaryExpression(final UnaryExpression expression) { final PExpression exp = getExpression(expression.getChild()); @@ -562,7 +752,7 @@ public class TranslationVisitor implements ISimpleVisitor { default: throw new AssertionError("Uncovered Expression"); } - expressions.push(result); + pushExpression(expression, result); } @Override @@ -601,8 +791,8 @@ public class TranslationVisitor implements ISimpleVisitor { .getChildExpressions()); List<PPredicate> childPreds = getSubPredicates(expression .getChildPredicates()); - expressions.push(new AExtendedExprExpression(new TIdentifierLiteral( - symbol), childExprs, childPreds)); + pushExpression(expression, new AExtendedExprExpression( + new TIdentifierLiteral(symbol), childExprs, childPreds)); } @Override @@ -722,76 +912,21 @@ public class TranslationVisitor implements ISimpleVisitor { // Create a visitor and use it to translate the predicate final TranslationVisitor visitor = new TranslationVisitor(); p.accept(visitor); - final PPredicate newImp = visitor.getPredicate(); - - // Use the old visitor to check if the implementation of the new visitor - // is correct. - final PredicateVisitor oldVisitor = new PredicateVisitor(); - p.accept(oldVisitor); - final PPredicate oldImp = oldVisitor.getPredicate(); - - // Compare both results. If there are differences, throw an exception - final String expected = oldImp.toString(); - final String actual = newImp.toString(); - if (!expected.equals(actual)) { - throw new AssertionError("Expected:\n" + expected + "\n but was:\n" - + actual); - } - - // TODO[DP, 13.8.2013]: Remove call to old implementation after a test - // phase - return newImp; + return visitor.getPredicate(); } public static PExpression translateExpression(Expression e) { // Create a visitor and use it to translate the predicate final TranslationVisitor visitor = new TranslationVisitor(); e.accept(visitor); - final PExpression newImp = visitor.getExpression(); - - // Use the old visitor to check if the implementation of the new visitor - // is correct. - final ExpressionVisitor oldVisitor = new ExpressionVisitor( - new LinkedList<String>()); - e.accept(oldVisitor); - final PExpression oldImp = oldVisitor.getExpression(); - - // Compare both results. If there are differences, throw an exception - final String expected = oldImp.toString(); - final String actual = newImp.toString(); - if (!expected.equals(actual)) { - throw new AssertionError("Expected:\n" + expected + "\n but was:\n" - + actual); - } - - // TODO[DP, 13.8.2013]: Remove call to old implementation after a test - // phase - return newImp; + return visitor.getExpression(); } public static PSubstitution translateAssignment(Assignment a) { // Create a visitor and use it to translate the predicate final TranslationVisitor visitor = new TranslationVisitor(); a.accept(visitor); - final PSubstitution newImp = visitor.getSubstitution(); - - // Use the old visitor to check if the implementation of the new visitor - // is correct. - final AssignmentVisitor oldVisitor = new AssignmentVisitor(); - a.accept(oldVisitor); - final PSubstitution oldImp = oldVisitor.getSubstitution(); - - // Compare both results. If there are differences, throw an exception - final String expected = oldImp.toString(); - final String actual = newImp.toString(); - if (!expected.equals(actual)) { - throw new AssertionError("Expected:\n" + expected + "\n but was:\n" - + actual); - } - - // TODO[DP, 13.8.2013]: Remove call to old implementation after a test - // phase - return newImp; + return visitor.getSubstitution(); } }