diff --git a/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java new file mode 100644 index 0000000000000000000000000000000000000000..8f166ba9eb6b292cac18d69d1dfd90f5d2c78d6a --- /dev/null +++ b/de.prob.core/src/de/prob/core/translator/pragmas/IPragma.java @@ -0,0 +1,9 @@ +package de.prob.core.translator.pragmas; + +import de.prob.prolog.output.IPrologTermOutput; + +public interface IPragma { + + void output(IPrologTermOutput pout); + +} 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 ad5b33afb304accdbaa9f275db0e8a47d91b6707..62fb49e49dde23f2d56b267667e0184f5c607a6e 100644 --- a/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/ContextTranslator.java @@ -53,6 +53,7 @@ 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.eventb.translator.internal.EProofStatus; import de.prob.eventb.translator.internal.ProofObligation; import de.prob.eventb.translator.internal.SequentSource; @@ -65,6 +66,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { 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>(); public static ContextTranslator create(final ISCContext context) throws TranslationFailedException { @@ -110,6 +112,7 @@ public final class ContextTranslator extends AbstractComponentTranslator { if (rodinFile.exists()) { ISCContextRoot root = (ISCContextRoot) rodinFile.getRoot(); collectProofInfo(root); + collectPragmas(root); } } catch (Exception e) { // We do not guarantee to include proof infos. If something goes @@ -124,6 +127,10 @@ public final class ContextTranslator extends AbstractComponentTranslator { } + private void collectPragmas(ISCContextRoot origin) { + // TODO + } + private void collectProofInfo(ISCContextRoot origin) throws RodinDBException { @@ -327,6 +334,11 @@ public final class ContextTranslator extends AbstractComponentTranslator { return proofs; } + public List<IPragma> getPragmas() { + // TODO Auto-generated method stub + return pragmas; + } + public List<ClassifiedPragma> getProofspragmas() { return proofspragmas; } diff --git a/de.prob.core/src/de/prob/eventb/translator/UnitPragmaTranslator.java b/de.prob.core/src/de/prob/eventb/translator/UnitPragmaTranslator.java deleted file mode 100644 index 4148c8bcaba817abac471fc9a6b1e687c88927b7..0000000000000000000000000000000000000000 --- a/de.prob.core/src/de/prob/eventb/translator/UnitPragmaTranslator.java +++ /dev/null @@ -1,7 +0,0 @@ -package de.prob.eventb.translator; - -import de.prob.core.translator.ITranslator; - -public class UnitPragmaTranslator implements ITranslator { - -} diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java index e5c3d34b48bf2ecca49162be37a6bb0fa003e456..075270d4ae253ae3aef71dafd9d877e1ee61a433 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBContextTranslator.java @@ -17,7 +17,6 @@ import org.rodinp.core.RodinDBException; import de.prob.core.translator.TranslationFailedException; import de.prob.eventb.translator.ContextTranslator; -import de.prob.eventb.translator.UnitPragmaTranslator; import de.prob.prolog.output.IPrologTermOutput; public final class EventBContextTranslator extends EventBTranslator { @@ -53,15 +52,14 @@ public final class EventBContextTranslator extends EventBTranslator { private void constructTranslation(final IPrologTermOutput pto) throws TranslationFailedException { List<ContextTranslator> contextTranslators = new ArrayList<ContextTranslator>(); - List<UnitPragmaTranslator> unitPragmaTranslators = new ArrayList<UnitPragmaTranslator>(); // translators.add(ContextTranslator.create(context)); if (context instanceof ISCContextRoot) { ISCContextRoot root = (ISCContextRoot) context; collectContexts(contextTranslators, new ArrayList<String>(), root); } - printProlog(new ArrayList<ModelTranslator>(), contextTranslators, - unitPragmaTranslators, pto); + + printProlog(new ArrayList<ModelTranslator>(), contextTranslators, pto); } private void collectContexts(final List<ContextTranslator> translatorMap, diff --git a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java index dc7b01890c43d07b15238966f619dc50bfea9398..1b9e5fb6179714c13da881ffcedb401ac70ef529 100644 --- a/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java +++ b/de.prob.core/src/de/prob/eventb/translator/internal/EventBMachineTranslator.java @@ -16,7 +16,6 @@ import org.rodinp.core.RodinDBException; import de.prob.core.translator.TranslationFailedException; import de.prob.eventb.translator.ContextTranslator; -import de.prob.eventb.translator.UnitPragmaTranslator; import de.prob.eventb.translator.flow.FlowAnalysis; import de.prob.logging.Logger; import de.prob.prolog.output.IPrologTermOutput; @@ -65,8 +64,7 @@ public final class EventBMachineTranslator extends EventBTranslator { List<ISCMachineRoot> roots = collectRefinementChain(); final List<ModelTranslator> mchTranslators = getModelTranslators(roots); final List<ContextTranslator> ctxTranslators = getContextTranslators(roots); - final List<UnitPragmaTranslator> unitPragmaTranslators = getUnitPragmaTranslators(roots); - printProlog(mchTranslators, ctxTranslators, unitPragmaTranslators, pto); + printProlog(mchTranslators, ctxTranslators, pto); } private List<ISCMachineRoot> collectRefinementChain() @@ -99,18 +97,12 @@ public final class EventBMachineTranslator extends EventBTranslator { return mchTranslators; } - private List<UnitPragmaTranslator> getUnitPragmaTranslators( - final List<ISCMachineRoot> roots) throws TranslationFailedException { - final List<UnitPragmaTranslator> translators = new ArrayList<UnitPragmaTranslator>(); - // TODO: do something brilliant - return translators; - } - private List<ContextTranslator> getContextTranslators( final List<ISCMachineRoot> models) throws TranslationFailedException { final List<ContextTranslator> translators = new ArrayList<ContextTranslator>(); final List<String> processed = new ArrayList<String>(); + for (ISCMachineRoot m : models) { ISCInternalContext[] seenContexts; try { 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 723d413d96db5ae8983e7f8763bf8023d9d2bb23..4cf7538db93dfea3df0b9355063386031bca3f3a 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 @@ -23,9 +23,9 @@ 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.UnitPragmaTranslator; import de.prob.prolog.output.IPrologTermOutput; public abstract class EventBTranslator implements ITranslator { @@ -113,6 +113,24 @@ public abstract class EventBTranslator implements ITranslator { printFlowInformation(pout); } + private void printPragmaContents( + Collection<ModelTranslator> refinementChainTranslators, + Collection<ContextTranslator> contextTranslators, + IPrologTermOutput pout) { + ArrayList<IPragma> pragmas = new ArrayList<IPragma>(); + + for (ContextTranslator contextTranslator : contextTranslators) { + pragmas.addAll(contextTranslator.getPragmas()); + } + for (ModelTranslator modelTranslator : refinementChainTranslators) { + pragmas.addAll(modelTranslator.getPragmas()); + } + + for (IPragma pragma : pragmas) { + pragma.output(pout); + } + } + protected abstract void printFlowInformation(final IPrologTermOutput pout); private ASTProlog createAstVisitor( @@ -128,7 +146,6 @@ public abstract class EventBTranslator implements ITranslator { protected void printProlog( final Collection<ModelTranslator> refinementChainTranslators, final Collection<ContextTranslator> contextTranslators, - final Collection<UnitPragmaTranslator> unitPragmaTranslators, final IPrologTermOutput pout) throws TranslationFailedException { final ASTProlog prolog = createAstVisitor(refinementChainTranslators, contextTranslators, pout); @@ -149,6 +166,8 @@ public abstract class EventBTranslator implements ITranslator { // } catch (RodinDBException e) { // e.printStackTrace(); // } + printPragmaContents(refinementChainTranslators, contextTranslators, + pout); pout.closeList(); pout.printVariable("_Error"); pout.closeTerm(); 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 ead67da6ba447b4f830418088f54eb34069a3bf7..fd794beadb03366ee8b2fb99b9a0b8ee16273a51 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 @@ -67,6 +67,7 @@ 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.eventb.translator.AbstractComponentTranslator; import de.prob.eventb.translator.AssignmentVisitor; import de.prob.eventb.translator.ExpressionVisitor; @@ -81,6 +82,8 @@ public class ModelTranslator extends AbstractComponentTranslator { 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>(); // Confined in the thread calling the factory method @@ -117,6 +120,10 @@ public class ModelTranslator extends AbstractComponentTranslator { 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"; @@ -164,6 +171,13 @@ public class ModelTranslator extends AbstractComponentTranslator { // Check for fully discharged Invariants and Events collectProofInfo(); + + // Collect Pragmas, Units, etc. + collectPragmas(); + } + + private void collectPragmas() { + // TODO } private void collectProofInfo() throws RodinDBException { @@ -179,7 +193,8 @@ public class ModelTranslator extends AbstractComponentTranslator { EProofStatus pstatus = EProofStatus.UNPROVEN; - if (!broken && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX)) + if (!broken + && (confidence > IConfidence.PENDING && confidence <= IConfidence.REVIEWED_MAX)) pstatus = EProofStatus.REVIEWED; if (!broken && confidence == IConfidence.DISCHARGED_MAX) pstatus = EProofStatus.PROVEN;