diff --git a/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java b/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java index 5e64e8e77dfd79a432892d127cd75f5725e3e2fc..69c7cb6cd836d106c8f9a6ba8c9560cd51eeea7b 100644 --- a/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/AbstractComponentTranslator.java @@ -6,13 +6,32 @@ package de.prob.eventb.translator; +import java.util.ArrayList; import java.util.Collections; +import java.util.LinkedList; +import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.eventb.core.ISCExpressionElement; +import org.eventb.core.ISCIdentifierElement; +import org.eventb.core.ISCPredicateElement; +import org.eventb.core.ast.Expression; +import org.eventb.core.ast.FormulaFactory; +import org.eventb.core.ast.ITypeEnvironment; +import org.eventb.core.ast.Predicate; +import org.rodinp.core.IAttributeType; import org.rodinp.core.IInternalElement; +import org.rodinp.core.RodinCore; +import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.node.Node; +import de.be4.classicalb.core.parser.node.PExpression; +import de.be4.classicalb.core.parser.node.PPredicate; +import de.prob.core.translator.pragmas.IPragma; +import de.prob.core.translator.pragmas.UnitPragma; +import de.prob.eventb.translator.internal.ProofObligation; +import de.prob.eventb.translator.internal.TranslationVisitor; public abstract class AbstractComponentTranslator { @@ -21,7 +40,83 @@ public abstract class AbstractComponentTranslator { public Map<Node, IInternalElement> getLabelMapping() { return Collections.unmodifiableMap(labelMapping); } - - abstract public String getResource(); + + private boolean theoryIsUsed = false; + private final List<IPragma> pragmas = new ArrayList<IPragma>(); + private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); + private final String resourceName; + + protected AbstractComponentTranslator(String resourceName) { + this.resourceName = resourceName; + } + + public String getResource() { + return resourceName; + } + + public List<IPragma> getPragmas() { + return Collections.unmodifiableList(pragmas); + } + + public List<ProofObligation> getProofs() { + return Collections.unmodifiableList(proofs); + } + + protected void addProof(ProofObligation po) { + proofs.add(po); + } + + protected void addUnitPragmas(ISCIdentifierElement[] elements) + throws RodinDBException { + try { + final IAttributeType.String UNITATTRIBUTE = RodinCore + .getStringAttrType("de.prob.units.unitPragmaAttribute"); + + for (final ISCIdentifierElement variable : elements) { + if (variable.hasAttribute(UNITATTRIBUTE)) { + String content = variable.getAttributeValue(UNITATTRIBUTE); + + if (!content.isEmpty()) { + pragmas.add(new UnitPragma(getResource(), variable + .getIdentifierString(), content)); + } + } + } + } catch (IllegalArgumentException ex) { + // Happens if the attribute does not exist, i.e. the unit plugin is + // not installed + } + + } + + protected PPredicate translatePredicate(FormulaFactory ff, + final ITypeEnvironment env, final ISCPredicateElement predicate) + throws RodinDBException { + final PredicateVisitor visitor = new PredicateVisitor( + new LinkedList<String>()); + final Predicate pred = predicate.getPredicate(ff, env); + pred.accept(visitor); + final PPredicate result = visitor.getPredicate(); + theoryIsUsed |= TranslationVisitor.checkNewImplementation(pred, result); + return result; + } + + protected PExpression translateExpression(FormulaFactory ff, + final ITypeEnvironment env, final ISCExpressionElement expression) + throws RodinDBException { + final ExpressionVisitor visitor = new ExpressionVisitor( + new LinkedList<String>()); + final Expression expr = expression.getExpression(ff, env); + expr.accept(visitor); + final PExpression result = visitor.getExpression(); + theoryIsUsed |= TranslationVisitor.checkNewImplementation(expr, result); + return result; + } + + public boolean isTheoryUsed() { + return theoryIsUsed; + } + + abstract public Node getAST(); } \ No newline at end of file diff --git a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java index ed06174c383f320972bcd7542360bafa60cd4bc5..4322265947bc67873a3610dbb0010940d9957d9c 100644 --- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java @@ -31,14 +31,11 @@ import org.eventb.core.ISCExtendsContext; import org.eventb.core.ISCInternalContext; import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; -import org.eventb.core.ast.Predicate; import org.eventb.core.seqprover.IConfidence; -import org.rodinp.core.IAttributeType; import org.rodinp.core.IInternalElement; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; import org.rodinp.core.IRodinProject; -import org.rodinp.core.RodinCore; import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.analysis.pragma.internal.ClassifiedPragma; @@ -50,6 +47,7 @@ import de.be4.classicalb.core.parser.node.AExtendsContextClause; import de.be4.classicalb.core.parser.node.AIdentifierExpression; import de.be4.classicalb.core.parser.node.ASetsContextClause; import de.be4.classicalb.core.parser.node.ATheoremsContextClause; +import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PContextClause; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PPredicate; @@ -57,12 +55,9 @@ import de.be4.classicalb.core.parser.node.PSet; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.hhu.stups.sablecc.patch.SourcePosition; import de.prob.core.translator.TranslationFailedException; -import de.prob.core.translator.pragmas.IPragma; -import de.prob.core.translator.pragmas.UnitPragma; import de.prob.eventb.translator.internal.EProofStatus; import de.prob.eventb.translator.internal.ProofObligation; import de.prob.eventb.translator.internal.SequentSource; -import de.prob.eventb.translator.internal.TranslationVisitor; public final class ContextTranslator extends AbstractComponentTranslator { @@ -70,9 +65,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { private final ISCContext context; private final AEventBContextParseUnit model = new AEventBContextParseUnit(); private final Map<String, ISCContext> depContext = new HashMap<String, ISCContext>(); - private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); private final List<ClassifiedPragma> proofspragmas = new ArrayList<ClassifiedPragma>(); - private final List<IPragma> pragmas = new ArrayList<IPragma>(); private final IEventBRoot root; private final FormulaFactory ff; @@ -159,6 +152,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { private ContextTranslator(final ISCContext context, final FormulaFactory ff, final ITypeEnvironment te, final IEventBRoot root) throws TranslationFailedException { + super(context.getComponentName()); this.context = context; this.ff = ff; this.te = te; @@ -173,26 +167,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { private void collectPragmas() throws RodinDBException { // unit pragma, attached to constants - try { - final IAttributeType.String UNITATTRIBUTE = RodinCore - .getStringAttrType("de.prob.units.unitPragmaAttribute"); - - final ISCConstant[] constants = context.getSCConstants(); - - for (final ISCConstant constant : constants) { - if (constant.hasAttribute(UNITATTRIBUTE)) { - String content = constant.getAttributeValue(UNITATTRIBUTE); - - if (!content.isEmpty()) { - pragmas.add(new UnitPragma(getResource(), constant - .getIdentifierString(), content)); - } - } - } - } catch (IllegalArgumentException ex) { - // Happens if the attribute does not exist, i.e. the unit plugin is - // not installed - } + addUnitPragmas(context.getSCConstants()); } private void collectProofInfo() throws RodinDBException { @@ -241,7 +216,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { .getLabel())); } - proofs.add(new ProofObligation(origin, s, name, pstatus)); + addProof(new ProofObligation(origin, s, name, pstatus)); } } @@ -382,12 +357,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { predicates.length); for (final ISCAxiom element : predicates) { if (element.isTheorem() == theorems) { - final PredicateVisitor visitor = new PredicateVisitor( - new LinkedList<String>()); - final Predicate p = element.getPredicate(ff, te); - p.accept(visitor); - final PPredicate predicate = visitor.getPredicate(); - TranslationVisitor.checkNewImplementation(p, predicate); + final PPredicate predicate = translatePredicate(ff, te, element); list.add(predicate); labelMapping.put(predicate, element); proofspragmas.add(new ClassifiedPragma("discharged", predicate, @@ -398,14 +368,6 @@ public final class ContextTranslator extends AbstractComponentTranslator { return list; } - public List<ProofObligation> getProofs() { - return proofs; - } - - public List<IPragma> getPragmas() { - return pragmas; - } - public List<ClassifiedPragma> getProofspragmas() { return proofspragmas; } @@ -415,4 +377,9 @@ public final class ContextTranslator extends AbstractComponentTranslator { return context.getComponentName(); } + @Override + public Node getAST() { + return getContextAST(); + } + } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java index b1edb97e3b185017e1b3ba7c097985a46011e827..21d51c5cc4ca7931cab48da34d058bf745089b39 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBTranslator.java @@ -19,14 +19,11 @@ import org.rodinp.core.IInternalElement; import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.analysis.prolog.ASTProlog; -import de.be4.classicalb.core.parser.node.AEventBContextParseUnit; -import de.be4.classicalb.core.parser.node.AEventBModelParseUnit; import de.be4.classicalb.core.parser.node.Node; import de.prob.core.translator.ITranslator; import de.prob.core.translator.TranslationFailedException; import de.prob.core.translator.pragmas.IPragma; import de.prob.eventb.translator.AbstractComponentTranslator; -import de.prob.eventb.translator.ContextTranslator; import de.prob.eventb.translator.Theories; import de.prob.prolog.output.IPrologTermOutput; @@ -56,42 +53,29 @@ public abstract class EventBTranslator implements ITranslator { return printer; } - private void printContexts( - final Collection<ContextTranslator> contextTranslators, - final IPrologTermOutput pout, final ASTProlog prolog) { - pout.openList(); - for (final ContextTranslator contextTranslator : contextTranslators) { - final AEventBContextParseUnit contextAST = contextTranslator - .getContextAST(); - contextAST.apply(prolog); - } - pout.closeList(); - } - private void printModels( - final Collection<ModelTranslator> refinementChainTranslators, + final Collection<? extends AbstractComponentTranslator> refinementChainTranslators, final IPrologTermOutput pout, final ASTProlog prolog) { pout.openList(); - for (final ModelTranslator modelTranslator : refinementChainTranslators) { - final AEventBModelParseUnit modelAST = modelTranslator - .getModelAST(); + for (final AbstractComponentTranslator translateor : refinementChainTranslators) { + final Node modelAST = translateor.getAST(); modelAST.apply(prolog); } pout.closeList(); } private void printProofInformation( - final Collection<ModelTranslator> refinementChainTranslators, - Collection<ContextTranslator> contextTranslators, + final Collection<? extends AbstractComponentTranslator> refinementChainTranslators, + Collection<? extends AbstractComponentTranslator> contextTranslators, final IPrologTermOutput pout) throws TranslationFailedException { ArrayList<ProofObligation> list = new ArrayList<ProofObligation>(); - for (ContextTranslator contextTranslator : contextTranslators) { + for (AbstractComponentTranslator contextTranslator : contextTranslators) { list.addAll(contextTranslator.getProofs()); } - for (ModelTranslator modelTranslator : refinementChainTranslators) { + for (AbstractComponentTranslator modelTranslator : refinementChainTranslators) { list.addAll(modelTranslator.getProofs()); } @@ -116,15 +100,15 @@ public abstract class EventBTranslator implements ITranslator { } private void printPragmaContents( - Collection<ModelTranslator> refinementChainTranslators, - Collection<ContextTranslator> contextTranslators, + Collection<? extends AbstractComponentTranslator> refinementChainTranslators, + Collection<? extends AbstractComponentTranslator> contextTranslators, IPrologTermOutput pout) { ArrayList<IPragma> pragmas = new ArrayList<IPragma>(); - for (ContextTranslator contextTranslator : contextTranslators) { + for (AbstractComponentTranslator contextTranslator : contextTranslators) { pragmas.addAll(contextTranslator.getPragmas()); } - for (ModelTranslator modelTranslator : refinementChainTranslators) { + for (AbstractComponentTranslator modelTranslator : refinementChainTranslators) { pragmas.addAll(modelTranslator.getPragmas()); } @@ -136,8 +120,8 @@ public abstract class EventBTranslator implements ITranslator { protected abstract void printFlowInformation(final IPrologTermOutput pout); private ASTProlog createAstVisitor( - final Collection<ModelTranslator> refinementChainTranslators, - final Collection<ContextTranslator> contextTranslators, + final Collection<? extends AbstractComponentTranslator> refinementChainTranslators, + final Collection<? extends AbstractComponentTranslator> contextTranslators, final IPrologTermOutput pout) throws TranslationFailedException { Collection<AbstractComponentTranslator> translators = new ArrayList<AbstractComponentTranslator>(); translators.addAll(refinementChainTranslators); @@ -146,15 +130,15 @@ public abstract class EventBTranslator implements ITranslator { } protected void printProlog( - final Collection<ModelTranslator> refinementChainTranslators, - final Collection<ContextTranslator> contextTranslators, + final Collection<? extends AbstractComponentTranslator> refinementChainTranslators, + final Collection<? extends AbstractComponentTranslator> contextTranslators, final IPrologTermOutput pout) throws TranslationFailedException { final ASTProlog prolog = createAstVisitor(refinementChainTranslators, contextTranslators, pout); pout.openTerm("load_event_b_project"); printModels(refinementChainTranslators, pout, prolog); - printContexts(contextTranslators, pout, prolog); + printModels(contextTranslators, pout, prolog); pout.openList(); pout.openTerm("exporter_version"); pout.printNumber(2); @@ -164,6 +148,8 @@ public abstract class EventBTranslator implements ITranslator { pout); try { Theories.translate(project, pout); + } catch (NoClassDefFoundError e) { + } catch (RodinDBException e) { e.printStackTrace(); } diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java index 5aaacd2ab0b38d194b81fd554751f15f9576ff77..45049f26186f142fef8e614154bf1e2a32fc1c6c 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/ModelTranslator.java @@ -9,7 +9,6 @@ package de.prob.eventb.translator.internal; // NOPMD by bendisposto import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.LinkedList; import java.util.List; @@ -37,13 +36,10 @@ import org.eventb.core.ISCWitness; import org.eventb.core.ITraceableElement; import org.eventb.core.ast.FormulaFactory; import org.eventb.core.ast.ITypeEnvironment; -import org.eventb.core.ast.Predicate; import org.eventb.core.seqprover.IConfidence; -import org.rodinp.core.IAttributeType; import org.rodinp.core.IElementType; import org.rodinp.core.IRodinElement; import org.rodinp.core.IRodinFile; -import org.rodinp.core.RodinCore; import org.rodinp.core.RodinDBException; import de.be4.classicalb.core.parser.node.AAnticipatedEventstatus; @@ -60,6 +56,7 @@ import de.be4.classicalb.core.parser.node.ATheoremsModelClause; import de.be4.classicalb.core.parser.node.AVariablesModelClause; import de.be4.classicalb.core.parser.node.AVariantModelClause; import de.be4.classicalb.core.parser.node.AWitness; +import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PEvent; import de.be4.classicalb.core.parser.node.PEventstatus; import de.be4.classicalb.core.parser.node.PExpression; @@ -69,12 +66,8 @@ import de.be4.classicalb.core.parser.node.PSubstitution; import de.be4.classicalb.core.parser.node.PWitness; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; import de.prob.core.translator.TranslationFailedException; -import de.prob.core.translator.pragmas.IPragma; -import de.prob.core.translator.pragmas.UnitPragma; import de.prob.eventb.translator.AbstractComponentTranslator; import de.prob.eventb.translator.AssignmentVisitor; -import de.prob.eventb.translator.ExpressionVisitor; -import de.prob.eventb.translator.PredicateVisitor; import de.prob.logging.Logger; public class ModelTranslator extends AbstractComponentTranslator { @@ -84,8 +77,6 @@ public class ModelTranslator extends AbstractComponentTranslator { private final FormulaFactory ff; private final ITypeEnvironment te; private final IMachineRoot origin; - private final List<ProofObligation> proofs = new ArrayList<ProofObligation>(); - private final List<IPragma> pragmas = new ArrayList<IPragma>(); // private final List<String> depContext = new ArrayList<String>(); @@ -119,14 +110,6 @@ public class ModelTranslator extends AbstractComponentTranslator { return modelTranslator; } - public List<ProofObligation> getProofs() { - return Collections.unmodifiableList(proofs); - } - - public List<IPragma> getPragmas() { - return Collections.unmodifiableList(pragmas); - } - public AEventBModelParseUnit getModelAST() { if (broken) { final String message = "The machine contains Rodin Problems. Please fix it before animating"; @@ -149,6 +132,7 @@ public class ModelTranslator extends AbstractComponentTranslator { private ModelTranslator(final ISCMachineRoot machine) throws TranslationFailedException { + super(machine.getComponentName()); this.machine = machine; origin = machine.getMachineRoot(); ff = ((ISCMachineRoot) machine).getFormulaFactory(); @@ -181,26 +165,7 @@ public class ModelTranslator extends AbstractComponentTranslator { private void collectPragmas() throws RodinDBException { // unit pragma, attached to variables - try { - final IAttributeType.String UNITATTRIBUTE = RodinCore - .getStringAttrType("de.prob.units.unitPragmaAttribute"); - - final ISCVariable[] variables = machine.getSCVariables(); - - for (final ISCVariable variable : variables) { - if (variable.hasAttribute(UNITATTRIBUTE)) { - String content = variable.getAttributeValue(UNITATTRIBUTE); - - if (!content.isEmpty()) { - pragmas.add(new UnitPragma(getResource(), variable - .getIdentifierString(), content)); - } - } - } - } catch (IllegalArgumentException ex) { - // Happens if the attribute does not exist, i.e. the unit plugin is - // not installed - } + addUnitPragmas(machine.getSCVariables()); } private void collectProofInfo() throws RodinDBException { @@ -244,7 +209,7 @@ public class ModelTranslator extends AbstractComponentTranslator { s.add(new SequentSource(type, le.getLabel())); } - proofs.add(new ProofObligation(origin, s, name, pstatus)); + addProof(new ProofObligation(origin, s, name, pstatus)); } if (!bugs.isEmpty()) { @@ -284,10 +249,9 @@ public class ModelTranslator extends AbstractComponentTranslator { final ISCVariant[] variant = machine.getSCVariants(); final AVariantModelClause var; if (variant.length == 1) { - final ExpressionVisitor visitor = new ExpressionVisitor( - new LinkedList<String>()); - variant[0].getExpression(ff, te).accept(visitor); - var = new AVariantModelClause(visitor.getExpression()); + final PExpression expression = translateExpression(ff, te, + variant[0]); + var = new AVariantModelClause(expression); } else if (variant.length == 0) { var = null; } else @@ -423,15 +387,7 @@ public class ModelTranslator extends AbstractComponentTranslator { final List<PPredicate> theoremsList) throws RodinDBException { final ISCGuard[] guards = revent.getSCGuards(); for (final ISCGuard guard : guards) { - final PredicateVisitor visitor = new PredicateVisitor( - new LinkedList<String>()); - final Predicate guardPredicate = guard.getPredicate(ff, localEnv); - // System.out.println("GUARD: " + guard.getLabel() + " -> " - // + guardPredicate); - guardPredicate.accept(visitor); - final PPredicate predicate = visitor.getPredicate(); - TranslationVisitor - .checkNewImplementation(guardPredicate, predicate); + final PPredicate predicate = translatePredicate(ff, localEnv, guard); if (guard.isTheorem()) { theoremsList.add(predicate); } else { @@ -466,11 +422,8 @@ public class ModelTranslator extends AbstractComponentTranslator { final List<PWitness> witnessList = new ArrayList<PWitness>( witnesses.length); for (final ISCWitness witness : witnesses) { - final PredicateVisitor visitor = new PredicateVisitor( - new LinkedList<String>()); - final Predicate pp = witness.getPredicate(ff, localEnv); - pp.accept(visitor); - final PPredicate predicate = visitor.getPredicate(); + final PPredicate predicate = translatePredicate(ff, localEnv, + witness); final TIdentifierLiteral label = new TIdentifierLiteral( witness.getLabel()); witnessList.add(new AWitness(label, predicate)); @@ -533,12 +486,8 @@ public class ModelTranslator extends AbstractComponentTranslator { // only use predicates that are defined in the current refinement // level, not in an abstract machine if (!isDefinedInAbstraction(evPredicate)) { - final PredicateVisitor visitor = new PredicateVisitor( - new LinkedList<String>()); - Predicate p = evPredicate.getPredicate(ff, te); - p.accept(visitor); - final PPredicate predicate = visitor.getPredicate(); - TranslationVisitor.checkNewImplementation(p, predicate); + final PPredicate predicate = translatePredicate(ff, te, + evPredicate); list.add(predicate); labelMapping.put(predicate, evPredicate); } @@ -573,8 +522,7 @@ public class ModelTranslator extends AbstractComponentTranslator { } @Override - public String getResource() { - return machine.getComponentName(); + public Node getAST() { + return getModelAST(); } - }