From 8a5f7159d6bb74568c57aa7b7d40c12ecfdec027 Mon Sep 17 00:00:00 2001 From: hansene <dominik_hansen@web.de> Date: Thu, 30 Jul 2015 20:53:21 +0200 Subject: [PATCH] Adapted the translator to the new parser version --- build.gradle | 7 +- src/main/java/de/tlc4b/MP.java | 48 +++++++ src/main/java/de/tlc4b/TLC4B.java | 136 +++++++++--------- src/main/java/de/tlc4b/TLCRunner.java | 9 +- src/main/java/de/tlc4b/Translator.java | 3 +- .../tlc4b/analysis/PrecedenceCollector.java | 31 ++-- .../java/de/tlc4b/analysis/Typechecker.java | 15 +- .../transformation/SeesEliminator.java | 1 - .../SetComprehensionOptimizer.java | 1 - .../typerestriction/TypeRestrictor.java | 9 +- src/main/java/de/tlc4b/btypes/BType.java | 2 +- src/main/java/de/tlc4b/btypes/BoolType.java | 2 +- .../java/de/tlc4b/btypes/FunctionType.java | 6 +- .../tlc4b/btypes/IntegerOrSetOfPairType.java | 2 +- .../de/tlc4b/btypes/IntegerOrSetType.java | 2 +- .../java/de/tlc4b/btypes/IntegerType.java | 2 +- .../java/de/tlc4b/btypes/ModelValueType.java | 2 +- src/main/java/de/tlc4b/btypes/PairType.java | 6 +- src/main/java/de/tlc4b/btypes/SetType.java | 4 +- src/main/java/de/tlc4b/btypes/StringType.java | 4 +- src/main/java/de/tlc4b/btypes/StructType.java | 4 +- .../java/de/tlc4b/btypes/UntypedType.java | 2 +- .../java/de/tlc4b/prettyprint/TLAPrinter.java | 25 +++- src/main/java/de/tlc4b/tlc/TLCResults.java | 57 +++++--- src/main/java/de/tlc4b/util/StopWatch.java | 24 +++- src/main/java/de/tlc4b/util/UtilMethods.java | 20 ++- .../tlc4b/typechecking/TestTypechecker.java | 2 +- src/test/java/de/tlc4b/util/TestUtil.java | 24 ++-- src/test/java/testing/CompoundScopeTest.java | 66 --------- src/test/java/testing/CompoundTest.java | 40 ------ 30 files changed, 284 insertions(+), 272 deletions(-) create mode 100644 src/main/java/de/tlc4b/MP.java delete mode 100644 src/test/java/testing/CompoundScopeTest.java delete mode 100644 src/test/java/testing/CompoundTest.java diff --git a/build.gradle b/build.gradle index 048c586..27ec8e8 100644 --- a/build.gradle +++ b/build.gradle @@ -7,8 +7,6 @@ apply plugin: 'findbugs' project.version = '1.0.0-SNAPSHOT' project.group = 'de.prob' -sourceCompatibility = 1.5 - repositories { mavenCentral() maven { @@ -24,7 +22,7 @@ configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } -def parser_version = '2.4.36-SNAPSHOT' +def parser_version = '2.5.0-SNAPSHOT' dependencies { //compile (group: 'com.microsoft', name: 'tla2tools', version: '1.4.6') @@ -37,8 +35,6 @@ dependencies { //compile(group: 'de.prob', name: 'de.prob.core.kernel', version: '2.0.0-milestone-13-SNAPSHOT') - - testCompile (group: 'junit', name: 'junit', version: '4.11') testCompile (group: 'de.prob', name: 'tla2bAST', version: '1.0.5-SNAPSHOT') @@ -91,7 +87,6 @@ jar { jar { manifest { attributes "Main-Class" : 'de.tlc4b.TLC4B' - attributes "Class-Path": 'tlatools.jar' } } diff --git a/src/main/java/de/tlc4b/MP.java b/src/main/java/de/tlc4b/MP.java new file mode 100644 index 0000000..7ce4afd --- /dev/null +++ b/src/main/java/de/tlc4b/MP.java @@ -0,0 +1,48 @@ +package de.tlc4b; + +import java.io.OutputStream; +import java.io.PrintStream; + +public class MP { + private static PrintStream out = System.out; + private static PrintStream err = System.err; + + private MP() { + } + + public static void printlnErr(String errorMessage) { + err.print("Error: "); + err.println(errorMessage); + } + + public static void println(String message) { + out.println(message); + } + + public static void print(String message) { + out.print(message); + } + + static class TLCOutputStream extends PrintStream { + static final PrintStream origOut = System.out; + + public static void changeOutputStream() { + MP.TLCOutputStream tlcOutputStream = new TLCOutputStream(origOut); + System.setOut(tlcOutputStream); + } + + public static void resetOutputStream() { + System.setOut(origOut); + } + + public TLCOutputStream(OutputStream out) { + super(out, true); + } + + @Override + public void print(String s) { + super.print("TLC: " + s); + } + } + +} diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java index 134a48e..7a57201 100644 --- a/src/main/java/de/tlc4b/TLC4B.java +++ b/src/main/java/de/tlc4b/TLC4B.java @@ -21,6 +21,8 @@ import de.tlc4b.exceptions.TranslationException; import de.tlc4b.tlc.TLCOutputInfo; import de.tlc4b.tlc.TLCResults; import de.tlc4b.util.StopWatch; +import static de.tlc4b.util.StopWatch.Watches.*; +import static de.tlc4b.MP.*; public class TLC4B { @@ -45,32 +47,33 @@ public class TLC4B { try { tlc4b.process(args); } catch (BException e) { - System.err.println("***** Parsing Error *****"); - System.err.println(e.getMessage()); + printlnErr("***** Parsing Error *****"); + printlnErr(e.getMessage()); return; } catch (TLC4BException e) { - System.err.println(e.getMessage()); - System.out.println("Model checking time: 0 sec"); - System.out.println("Result: " + e.getError()); + printlnErr(e.getMessage()); + println("Model checking time: 0 sec"); + println("Result: " + e.getError()); return; } catch (IOException e) { - System.err.println(e.getMessage()); - System.out.println("Model checking time: 0 sec"); - System.out.println("Result: " + "I/O Error"); + printlnErr(e.getMessage()); + println("Model checking time: 0 sec"); + println("Result: " + "I/O Error"); } if (TLC4BGlobals.isRunTLC()) { try { + TLCRunner.runTLC(tlc4b.machineFileNameWithoutFileExtension, tlc4b.buildDir); + TLCResults results = new TLCResults(tlc4b.tlcOutputInfo); results.evalResults(); tlc4b.printResults(results, TLC4BGlobals.isCreateTraceFile()); System.exit(0); } catch (NoClassDefFoundError e) { - System.err - .println("Can not find TLC. The tlatools.jar must be included in the classpath."); + printlnErr("Can not find TLC. The tlatools.jar must be included in the classpath."); } } @@ -80,46 +83,42 @@ public class TLC4B { private void printResults(TLCResults results, boolean createTraceFile) { printOperationsCount(results); // options - System.out.println("Used Options"); - System.out.println("| Number of workers: " + TLC4BGlobals.getWorkers()); - System.out.println("| Invariants check: " + TLC4BGlobals.isInvariant()); - System.out.println("| Deadlock check: " - + TLC4BGlobals.isDeadlockCheck()); - System.out.println("| Assertion check: " + TLC4BGlobals.isAssertion()); - System.out.println("| Find Goal check: " + TLC4BGlobals.isGOAL()); - System.out - .println("| LTL formulas check: " + TLC4BGlobals.isCheckLTL()); - System.out.println("| Partial invariant evaluation: " + println("Used Options"); + println("| Number of workers: " + TLC4BGlobals.getWorkers()); + println("| Invariants check: " + TLC4BGlobals.isInvariant()); + println("| Deadlock check: " + TLC4BGlobals.isDeadlockCheck()); + println("| Assertion check: " + TLC4BGlobals.isAssertion()); + println("| Find Goal check: " + TLC4BGlobals.isGOAL()); + println("| LTL formulas check: " + TLC4BGlobals.isCheckLTL()); + println("| Partial invariant evaluation: " + TLC4BGlobals.isPartialInvariantEvaluation()); - System.out.println("| Lazy constants setup: " + println("| Lazy constants setup: " + !TLC4BGlobals.isForceTLCToEvalConstants()); - System.out.println("| Agressive well-definedness check: " + println("| Agressive well-definedness check: " + TLC4BGlobals.checkWelldefinedness()); - System.out.println("| Prob constant setup: " - + TLC4BGlobals.isProBconstantsSetup()); - System.out.println("| Symmetry reduction: " - + TLC4BGlobals.useSymmetry()); - System.out.print("| MIN Int: " + TLC4BGlobals.getMIN_INT()); - System.out.print(" | MAX Int: " + TLC4BGlobals.getMAX_INT()); - System.out.println(" | Standard deferret set size: " + println("| Prob constant setup: " + TLC4BGlobals.isProBconstantsSetup()); + println("| Symmetry reduction: " + TLC4BGlobals.useSymmetry()); + println("| MIN Int: " + TLC4BGlobals.getMIN_INT()); + println("| MAX Int: " + TLC4BGlobals.getMAX_INT()); + println("| Standard deferret set size: " + TLC4BGlobals.getDEFERRED_SET_SIZE()); - System.out.println("--------------------------------"); - System.out.println("Parsing time: " + StopWatch.getRunTime("Parsing") + println("--------------------------------"); + println("Parsing time: " + StopWatch.getRunTime(PARSING_TIME) + " ms"); + println("Translation time: " + StopWatch.getRunTime(TRANSLATION_TIME) + " ms"); - System.out.println("Translation time: " - + StopWatch.getRunTime("Translation") + " ms"); - System.out.println("Model checking time: " - + results.getModelCheckingTime() + " sec"); - // System.out.println("Number of workers: " + + println("Model checking time: " + results.getModelCheckingTime() + + " sec"); + // MP.printMessage("Number of workers: " + // TLCGlobals.getNumWorkers()); - System.out.println("States analysed: " - + results.getNumberOfDistinctStates()); - System.out.println("Transitions fired: " - + results.getNumberOfTransitions()); - System.out.println("Result: " + results.getResultString()); + if (results.getViolatedAssertions().size() > 0) { + println("Violated assertions: " + results.getViolatedAssertions()); + } + println("States analysed: " + results.getNumberOfDistinctStates()); + println("Transitions fired: " + results.getNumberOfTransitions()); + println("Result: " + results.getResultString()); String violatedDefinition = results.getViolatedDefinition(); if (violatedDefinition != null) { - System.out.print("Violated Definition: " + violatedDefinition); + println("Violated Definition: " + violatedDefinition); } if (results.hasTrace() && createTraceFile) { @@ -129,7 +128,7 @@ public class TLC4B { File traceFile = createFile(mainfile.getParentFile(), tracefileName, trace, false); if (traceFile != null) { - System.out.println("Trace file '" + traceFile.getAbsolutePath() + println("Trace file '" + traceFile.getAbsolutePath() + "' created."); } } @@ -140,21 +139,21 @@ public class TLC4B { LinkedHashMap<String, Long> operationCount = results .getOperationCount(); if (TLC4BGlobals.isPrintCoverage() && operationCount != null) { - System.out.println("---------- Coverage statistics ----------"); + println("---------- Coverage statistics ----------"); for (Entry<String, Long> entry : operationCount.entrySet()) { String key = entry.getKey(); String value = entry.getValue().toString(); - System.out.println(key + ": " + value); + println(key + ": " + value); } - System.out - .println("---------- End of coverage statistics ----------"); + println("---------- End of coverage statistics ----------"); } } public static void test(String[] args, boolean deleteFiles) throws Exception { - System.setProperty("apple.awt.UIElement", "true"); // avoiding pop up windows + System.setProperty("apple.awt.UIElement", "true"); // avoiding pop up + // windows TLC4BGlobals.resetGlobals(); TLC4BGlobals.setDeleteOnExit(deleteFiles); TLC4BGlobals.setCreateTraceFile(false); @@ -165,16 +164,17 @@ public class TLC4B { tlc4b.process(args); } catch (Exception e) { e.printStackTrace(); - System.err.println(e.getMessage()); + printlnErr(e.getMessage()); throw e; } if (TLC4BGlobals.isRunTLC()) { + MP.TLCOutputStream.changeOutputStream(); TLCRunner.runTLC(tlc4b.machineFileNameWithoutFileExtension, tlc4b.buildDir); - + MP.TLCOutputStream.resetOutputStream(); + ; TLCResults results = new TLCResults(tlc4b.tlcOutputInfo); results.evalResults(); - tlc4b.printResults(results, false); System.exit(0); @@ -278,30 +278,33 @@ public class TLC4B { public void process(String[] args) throws IOException, BException { handleParameter(args); - System.out.print("Arguments: "); + MP.print("Arguments: "); for (int i = 0; i < args.length; i++) { String string = args[i]; - System.out.print(string); - System.out.print(" "); + MP.print(string); + MP.print(" "); } - System.out.println(); + println(""); handleMainFileName(); if (TLC4BGlobals.isTranslate()) { - StopWatch.start("Parsing"); - System.out.println("Parsing..."); + StopWatch.start(PARSING_TIME); + MP.print("Parsing... "); translator = new Translator(machineFileNameWithoutFileExtension, mainfile, this.ltlFormula, this.constantsSetup); - StopWatch.stop("Parsing"); - - StopWatch.start("Translation"); - System.out.println("Translating..."); + StopWatch.stop(PARSING_TIME); + println("(" + StopWatch.getRunTimeAsString(PARSING_TIME) + "ms)"); + + StopWatch.start(TRANSLATION_TIME); + MP.print("Translating... "); translator.translate(); this.tlaModule = translator.getModuleString(); this.config = translator.getConfigString(); this.tlcOutputInfo = translator.getTLCOutputInfo(); + StopWatch.stop(TRANSLATION_TIME); + println("(" + StopWatch.getRunTimeAsString(TRANSLATION_TIME) + + "ms)"); createFiles(); - StopWatch.stop("Translation"); } } @@ -345,7 +348,7 @@ public class TLC4B { machineFileNameWithoutFileExtension + ".tla", tlaModule, TLC4BGlobals.isDeleteOnExit()); if (moduleFile != null) { - System.out.println("TLA+ module '" + moduleFile.getAbsolutePath() + println("TLA+ module '" + moduleFile.getAbsolutePath() + "' created."); } @@ -353,8 +356,8 @@ public class TLC4B { machineFileNameWithoutFileExtension + ".cfg", config, TLC4BGlobals.isDeleteOnExit()); if (configFile != null) { - System.out.println("Configuration file '" - + configFile.getAbsolutePath() + "' created."); + println("Configuration file '" + configFile.getAbsolutePath() + + "' created."); } createStandardModules(); } @@ -400,8 +403,7 @@ public class TLC4B { while ((read = is.read(bytes)) != -1) { fos.write(bytes, 0, read); } - System.out.println("Standard module '" + file.getName() - + "' created."); + println("Standard module '" + file.getName() + "' created."); } catch (IOException e) { throw new TLC4BIOException(e.getMessage()); } finally { diff --git a/src/main/java/de/tlc4b/TLCRunner.java b/src/main/java/de/tlc4b/TLCRunner.java index 48aec1e..3087b77 100644 --- a/src/main/java/de/tlc4b/TLCRunner.java +++ b/src/main/java/de/tlc4b/TLCRunner.java @@ -90,9 +90,8 @@ public class TLCRunner { } public static void runTLC(String machineName, File path) { - - System.out.println("--------------------------------"); - + MP.println("--------------------------------"); + MP.TLCOutputStream.changeOutputStream(); ToolIO.setMode(ToolIO.SYSTEM); ArrayList<String> list = new ArrayList<String>(); @@ -131,10 +130,10 @@ public class TLCRunner { } // System.setOut(systemOut); // ArrayList<String> messages = btlcStream.getArrayList(); - - System.out.println("--------------------------------"); closeThreads(); // return messages; + MP.TLCOutputStream.resetOutputStream(); + MP.println("--------------------------------"); } private static void closeThreads() { diff --git a/src/main/java/de/tlc4b/Translator.java b/src/main/java/de/tlc4b/Translator.java index 87bb1cc..6900ba9 100644 --- a/src/main/java/de/tlc4b/Translator.java +++ b/src/main/java/de/tlc4b/Translator.java @@ -84,8 +84,7 @@ public class Translator { // machine final RecursiveMachineLoader rml = new RecursiveMachineLoader( machineFile.getParent(), parser.getContentProvider()); - rml.loadAllMachines(machineFile, start, null, parser.getDefinitions(), - parser.getPragmas()); + rml.loadAllMachines(machineFile, start, null, parser.getDefinitions()); parsedMachines = rml.getParsedMachines(); diff --git a/src/main/java/de/tlc4b/analysis/PrecedenceCollector.java b/src/main/java/de/tlc4b/analysis/PrecedenceCollector.java index e495133..63389ad 100644 --- a/src/main/java/de/tlc4b/analysis/PrecedenceCollector.java +++ b/src/main/java/de/tlc4b/analysis/PrecedenceCollector.java @@ -6,6 +6,7 @@ import java.util.Hashtable; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AConvertBoolExpression; import de.be4.classicalb.core.parser.node.ADomainExpression; +import de.be4.classicalb.core.parser.node.ALabelPredicate; import de.be4.classicalb.core.parser.node.AMinusOrSetSubtractExpression; import de.be4.classicalb.core.parser.node.AMultOrCartExpression; import de.be4.classicalb.core.parser.node.Node; @@ -56,21 +57,18 @@ public class PrecedenceCollector extends DepthFirstAdapter { put("AUnionExpression", 8, 8, true); put("ASetSubtractionExpression", 8, 8, false); put("AIntervalExpression", 9, 9, true); - + put("ACartesianProductExpression", 8, 13, false); - + put("AAddExpression", 10, 10, true); - - + put("AModuloExpression", 10, 11, true); put("AUnaryMinusExpression", 12, 12, false); put("AConcatExpression", 13, 13, true); put("ADivExpression", 13, 13, false); - - + put("AFunctionExpression", 20, 20, false); - - + } private Precedence getPrecedence(Node node) { @@ -113,13 +111,18 @@ public class PrecedenceCollector extends DepthFirstAdapter { @Override public void defaultIn(final Node node) { + Node parent = node.parent(); Precedence p = getPrecedence(node); if (p != null) { precedenceTable.put(node, p); + if (parent instanceof ALabelPredicate) { + parent = parent.parent(); + } - if (node.parent() != null) { - Precedence parent = precedenceTable.get(node.parent()); - if (Precedence.makeBrackets(p, parent)) { + if (parent != null) { + Precedence parentPrecedence = precedenceTable + .get(node.parent()); + if (Precedence.makeBrackets(p, parentPrecedence)) { brackets.add(node); } } @@ -154,16 +157,16 @@ public class PrecedenceCollector extends DepthFirstAdapter { brackets.add(node); } } - + @Override - public void inADomainExpression(ADomainExpression node) { + public void inADomainExpression(ADomainExpression node) { BType type = typechecker.getType(node.getExpression()); Precedence p; if (type instanceof FunctionType) { // Function p = new Precedence("ADomainExpression", 9, 9, false); - + precedenceTable.put(node, p); Precedence parent = precedenceTable.get(node.parent()); diff --git a/src/main/java/de/tlc4b/analysis/Typechecker.java b/src/main/java/de/tlc4b/analysis/Typechecker.java index fbd148e..1e438a3 100644 --- a/src/main/java/de/tlc4b/analysis/Typechecker.java +++ b/src/main/java/de/tlc4b/analysis/Typechecker.java @@ -118,7 +118,12 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { } public BType getType(Node node) { - return types.get(node); + BType res = types.get(node); + if (res == null) { + new TypeErrorException("Node '" + node + "' has not type.\n" + + node.getStartPos()); + } + return res; } @Override @@ -445,7 +450,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { expected.unify(found, this); } catch (UnificationException e) { throw new TypeErrorException("Excepted '" + expected - + "' , found '" + found + "' at identifier " + node + "\n" + + "' , found '" + found + "' at identifier " + name + "\n" + node.getStartPos()); } } @@ -1127,6 +1132,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { try { BoolType.getInstance().unify(getType(node), this); } catch (UnificationException e) { + System.out.println(node.parent().getClass()); throw new TypeErrorException("Excepted '" + getType(node) + "' , found 'BOOL' in ' <=> '"); } @@ -2478,4 +2484,9 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { } } + public void inALabelPredicate(ALabelPredicate node) { + BType type = getType(node); + setType(node.getPredicate(), type); + } + } diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java index 2e755f3..22194e8 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java @@ -79,7 +79,6 @@ public class SeesEliminator extends DepthFirstAdapter { PParseUnit pParseUnit = main.getPParseUnit(); AAbstractMachineParseUnit machineParseUnit = (AAbstractMachineParseUnit) pParseUnit; - System.out.println(machineParseUnit.getHeader()); for (PMachineClause machineClause : machineParseUnit .getMachineClauses()) { diff --git a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java index f311207..2524422 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.Hashtable; import java.util.LinkedList; -import java.util.List; import java.util.Set; import de.be4.classicalb.core.parser.Utils; diff --git a/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java b/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java index 22c1f09..deaf979 100644 --- a/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java +++ b/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java @@ -52,6 +52,7 @@ import de.tlc4b.analysis.Typechecker; import de.tlc4b.btypes.BType; import de.tlc4b.exceptions.NotSupportedException; import de.tlc4b.ltl.LTLFormulaVisitor; +import de.tlc4b.util.UtilMethods; public class TypeRestrictor extends DepthFirstAdapter { @@ -552,17 +553,19 @@ public class TypeRestrictor extends DepthFirstAdapter { conType = typechecker.getType(machineContext .getReferenceNode(e)); } - if (conType.containsIntegerType() + if (conType.containsInfiniteType() && !(e.parent() instanceof ALambdaExpression) && !(e.parent() instanceof AComprehensionSetExpression)) { AIdentifierExpression id = (AIdentifierExpression) e; String localVariableName = Utils.getIdentifierAsString(id .getIdentifier()); throw new NotSupportedException( - "Unable to restrict the type of the variable '" + "Unable to restrict the type '" + + conType + + "' of identifier '" + localVariableName + "' to a finite set. TLC is not able to handle infinite sets.\n" - + e.getStartPos()); + + UtilMethods.getPositionAsString(e)); } tree = conType.createSyntaxTreeNode(typechecker); diff --git a/src/main/java/de/tlc4b/btypes/BType.java b/src/main/java/de/tlc4b/btypes/BType.java index 01147cf..ed800fc 100644 --- a/src/main/java/de/tlc4b/btypes/BType.java +++ b/src/main/java/de/tlc4b/btypes/BType.java @@ -8,6 +8,6 @@ public interface BType extends ITypeConstants{ public boolean isUntyped(); public boolean compare(BType other); public String getTlaType(); - public boolean containsIntegerType(); + public boolean containsInfiniteType(); public PExpression createSyntaxTreeNode(Typechecker typechecker); } diff --git a/src/main/java/de/tlc4b/btypes/BoolType.java b/src/main/java/de/tlc4b/btypes/BoolType.java index 4206654..ef7bb6b 100644 --- a/src/main/java/de/tlc4b/btypes/BoolType.java +++ b/src/main/java/de/tlc4b/btypes/BoolType.java @@ -47,7 +47,7 @@ public class BoolType implements BType { return "BOOLEAN"; } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return false; } diff --git a/src/main/java/de/tlc4b/btypes/FunctionType.java b/src/main/java/de/tlc4b/btypes/FunctionType.java index cb16e85..64e4348 100644 --- a/src/main/java/de/tlc4b/btypes/FunctionType.java +++ b/src/main/java/de/tlc4b/btypes/FunctionType.java @@ -123,9 +123,9 @@ public class FunctionType extends AbstractHasFollowers { return "[" + domain.getTlaType() + " -> " + range.getTlaType() + "]"; } - public boolean containsIntegerType() { - return this.domain.containsIntegerType() - || this.range.containsIntegerType(); + public boolean containsInfiniteType() { + return this.domain.containsInfiniteType() + || this.range.containsInfiniteType(); } public PExpression createSyntaxTreeNode(Typechecker typechecker) { diff --git a/src/main/java/de/tlc4b/btypes/IntegerOrSetOfPairType.java b/src/main/java/de/tlc4b/btypes/IntegerOrSetOfPairType.java index a8d378e..7de577d 100644 --- a/src/main/java/de/tlc4b/btypes/IntegerOrSetOfPairType.java +++ b/src/main/java/de/tlc4b/btypes/IntegerOrSetOfPairType.java @@ -223,7 +223,7 @@ public class IntegerOrSetOfPairType extends AbstractHasFollowers { return null; } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return false; } diff --git a/src/main/java/de/tlc4b/btypes/IntegerOrSetType.java b/src/main/java/de/tlc4b/btypes/IntegerOrSetType.java index 77765c9..82857bb 100644 --- a/src/main/java/de/tlc4b/btypes/IntegerOrSetType.java +++ b/src/main/java/de/tlc4b/btypes/IntegerOrSetType.java @@ -59,7 +59,7 @@ public class IntegerOrSetType extends AbstractHasFollowers { return null; } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return false; } diff --git a/src/main/java/de/tlc4b/btypes/IntegerType.java b/src/main/java/de/tlc4b/btypes/IntegerType.java index 70cbe3c..fe3d951 100644 --- a/src/main/java/de/tlc4b/btypes/IntegerType.java +++ b/src/main/java/de/tlc4b/btypes/IntegerType.java @@ -59,7 +59,7 @@ public class IntegerType implements BType { return false; } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return true; } diff --git a/src/main/java/de/tlc4b/btypes/ModelValueType.java b/src/main/java/de/tlc4b/btypes/ModelValueType.java index 0be4a04..4017d48 100644 --- a/src/main/java/de/tlc4b/btypes/ModelValueType.java +++ b/src/main/java/de/tlc4b/btypes/ModelValueType.java @@ -61,7 +61,7 @@ public class ModelValueType implements BType { return name; } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return false; } diff --git a/src/main/java/de/tlc4b/btypes/PairType.java b/src/main/java/de/tlc4b/btypes/PairType.java index 4d7d141..1e9057d 100644 --- a/src/main/java/de/tlc4b/btypes/PairType.java +++ b/src/main/java/de/tlc4b/btypes/PairType.java @@ -129,9 +129,9 @@ public class PairType extends AbstractHasFollowers { return res; } - public boolean containsIntegerType() { - return this.first.containsIntegerType() - || this.second.containsIntegerType(); + public boolean containsInfiniteType() { + return this.first.containsInfiniteType() + || this.second.containsInfiniteType(); } public PExpression createSyntaxTreeNode(Typechecker typechecker) { diff --git a/src/main/java/de/tlc4b/btypes/SetType.java b/src/main/java/de/tlc4b/btypes/SetType.java index cc3d361..8137156 100644 --- a/src/main/java/de/tlc4b/btypes/SetType.java +++ b/src/main/java/de/tlc4b/btypes/SetType.java @@ -102,8 +102,8 @@ public class SetType extends AbstractHasFollowers { return "SUBSET(" + subtype.getTlaType() + ")"; } - public boolean containsIntegerType() { - return this.subtype.containsIntegerType(); + public boolean containsInfiniteType() { + return this.subtype.containsInfiniteType(); } public PExpression createSyntaxTreeNode(Typechecker typechecker) { diff --git a/src/main/java/de/tlc4b/btypes/StringType.java b/src/main/java/de/tlc4b/btypes/StringType.java index ed5c511..4771569 100644 --- a/src/main/java/de/tlc4b/btypes/StringType.java +++ b/src/main/java/de/tlc4b/btypes/StringType.java @@ -52,8 +52,8 @@ public class StringType implements BType { return "STRING"; } - public boolean containsIntegerType() { - return false; + public boolean containsInfiniteType() { + return true; } public PExpression createSyntaxTreeNode(Typechecker typechecker) { diff --git a/src/main/java/de/tlc4b/btypes/StructType.java b/src/main/java/de/tlc4b/btypes/StructType.java index 1466385..30fc041 100644 --- a/src/main/java/de/tlc4b/btypes/StructType.java +++ b/src/main/java/de/tlc4b/btypes/StructType.java @@ -210,10 +210,10 @@ public class StructType extends AbstractHasFollowers { return res.toString(); } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { Iterator<BType> iterator = this.types.values().iterator(); while (iterator.hasNext()) { - if (iterator.next().containsIntegerType()) + if (iterator.next().containsInfiniteType()) return true; } return false; diff --git a/src/main/java/de/tlc4b/btypes/UntypedType.java b/src/main/java/de/tlc4b/btypes/UntypedType.java index edf9e04..a24e490 100644 --- a/src/main/java/de/tlc4b/btypes/UntypedType.java +++ b/src/main/java/de/tlc4b/btypes/UntypedType.java @@ -28,7 +28,7 @@ public class UntypedType extends AbstractHasFollowers { return this.toString(); } - public boolean containsIntegerType() { + public boolean containsInfiniteType() { return false; } diff --git a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java index cf6736b..54287c2 100644 --- a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java +++ b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java @@ -452,12 +452,31 @@ public class TLAPrinter extends DepthFirstAdapter { if (assertions.size() == 0) return; for (int i = 0; i < assertions.size(); i++) { + Node assertion = assertions.get(i); + String name = null; + if (assertion instanceof ALabelPredicate) { + ALabelPredicate label = (ALabelPredicate) assertion; + name = label.getName().getText(); + } + if (tlaModule.hasInitPredicate()) { - moduleStringAppend("Assertion" + (i + 1) + " == "); + if (name != null) { + moduleStringAppend(name); + moduleStringAppend(" == "); + } else { + moduleStringAppend(name); + moduleStringAppend("Assertion" + (i + 1) + " == "); + } } else { - moduleStringAppend("ASSUME Assertion" + (i + 1) + " == "); + moduleStringAppend("ASSUME "); + if (name != null) { + moduleStringAppend(name); + moduleStringAppend(" == "); + } else { + moduleStringAppend("Assertion" + (i + 1) + " == "); + } } - assertions.get(i).apply(this); + assertion.apply(this); moduleStringAppend("\n"); } } diff --git a/src/main/java/de/tlc4b/tlc/TLCResults.java b/src/main/java/de/tlc4b/tlc/TLCResults.java index d055a7e..e8e6bee 100644 --- a/src/main/java/de/tlc4b/tlc/TLCResults.java +++ b/src/main/java/de/tlc4b/tlc/TLCResults.java @@ -34,6 +34,7 @@ public class TLCResults implements ToolGlobals { private Date startTime; private Date endTime; private LinkedHashMap<String, Long> operationsCount; + private ArrayList<String> violatedAssertions = new ArrayList<String>(); private int lengthOfTrace; private String traceString; @@ -72,6 +73,10 @@ public class TLCResults implements ToolGlobals { return violatedDefinition; } + public ArrayList<String> getViolatedAssertions(){ + return this.violatedAssertions; + } + public int getNumberOfTransitions() { return numberOfTransitions; } @@ -286,31 +291,34 @@ public class TLCResults implements ToolGlobals { case EC.TLC_ASSUMPTION_FALSE: // get the violated assumption expr from the OutputCollector - ExprNode violatedAssumptionExpr = OutputCollector - .getViolatedAssumption(); - if (violatedAssumptionExpr != null) { + ArrayList<ExprNode> violatedAssumptions = OutputCollector + .getViolatedAssumptions(); + System.out.println(violatedAssumptions.size()); + if (violatedAssumptions.size() > 0) { // try to find the assume node contain the expr in order to get // the name of the assumption - ModuleNode moduleNode = OutputCollector.getModuleNode(); - AssumeNode[] assumptions = moduleNode.getAssumptions(); - for (AssumeNode assumeNode : assumptions) { - if (assumeNode.getAssume() == violatedAssumptionExpr) { - ThmOrAssumpDefNode def = assumeNode.getDef(); - // if the assumption is a named assumption, def is - // unequal null - // All B assertions are represented as named assumptions - // in the TLA module - if (def != null - && def.getName().toString() - .startsWith("Assertion")) { - tlcResult = TLCResult.AssertionError; - return; + + for (ExprNode exprNode : violatedAssumptions) { + AssumeNode assumeNode = findAssumeNode(exprNode); + ThmOrAssumpDefNode def = assumeNode.getDef(); + // if the assumption is a named assumption, def is + // unequal null + // All B assertions are represented as named assumptions + // in the TLA module + if (def != null) { + String assertionName = def.getName().toString(); + if(!violatedAssertions.contains(assertionName)){ + this.violatedAssertions.add(assertionName); } + tlcResult = TLCResult.AssertionError; } + } } - // otherwise, it is normal properties error - tlcResult = TLCResult.PropertiesError; + if(tlcResult!= null){ + // otherwise, it is normal properties error + tlcResult = TLCResult.PropertiesError; + } break; case EC.TLC_TEMPORAL_PROPERTY_VIOLATED: @@ -340,6 +348,17 @@ public class TLCResults implements ToolGlobals { } } + private AssumeNode findAssumeNode(ExprNode exprNode) { + ModuleNode moduleNode = OutputCollector.getModuleNode(); + AssumeNode[] assumptions = moduleNode.getAssumptions(); + for (AssumeNode assumeNode : assumptions) { + if (assumeNode.getAssume() == exprNode) { + return assumeNode; + } + } + return null; + } + private TLCResult evaluatingParameter(String[] params) { for (int i = 0; i < params.length; i++) { String s = params[i]; diff --git a/src/main/java/de/tlc4b/util/StopWatch.java b/src/main/java/de/tlc4b/util/StopWatch.java index a0a719b..d93065f 100644 --- a/src/main/java/de/tlc4b/util/StopWatch.java +++ b/src/main/java/de/tlc4b/util/StopWatch.java @@ -3,21 +3,31 @@ package de.tlc4b.util; import java.util.Hashtable; public class StopWatch { - private static final Hashtable<String, Long> startTime = new Hashtable<String, Long>(); - private static final Hashtable<String, Long> runTime = new Hashtable<String, Long>(); - public static void start(String id) { - startTime.put(id, System.currentTimeMillis()); - } - public static long stop(String id) { + private static final Hashtable<Watches, Long> startTime = new Hashtable<Watches, Long>(); + private static final Hashtable<Watches, Long> runTime = new Hashtable<Watches, Long>(); + + public enum Watches{ + PARSING_TIME, TRANSLATION_TIME, TLC_TIME, OVERALL_TIME + } + + public static void start(Watches watch){ + startTime.put(watch, System.currentTimeMillis()); + } + + public static long stop(Watches id) { long stopTime = System.currentTimeMillis() - startTime.remove(id); runTime.put(id, stopTime); return stopTime; } - public static long getRunTime(String id){ + public static long getRunTime(Watches id){ return runTime.get(id); } + + public static String getRunTimeAsString(Watches id){ + return runTime.get(id).toString(); + } } \ No newline at end of file diff --git a/src/main/java/de/tlc4b/util/UtilMethods.java b/src/main/java/de/tlc4b/util/UtilMethods.java index 822c469..3ff3fe4 100644 --- a/src/main/java/de/tlc4b/util/UtilMethods.java +++ b/src/main/java/de/tlc4b/util/UtilMethods.java @@ -3,7 +3,9 @@ package de.tlc4b.util; import java.util.ArrayList; import de.be4.classicalb.core.parser.node.AIdentifierExpression; +import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; +import de.hhu.stups.sablecc.patch.SourcePosition; public class UtilMethods { @@ -14,5 +16,21 @@ public class UtilMethods { AIdentifierExpression id = new AIdentifierExpression(idList); return id; } - + + public static String getPositionAsString(Node node) { + StringBuilder sb = new StringBuilder(); + SourcePosition startPos = node.getStartPos(); + SourcePosition endPos = node.getEndPos(); + if (startPos == null) { + sb.append("### Unknown position."); + } else { + sb.append("### Line "); + sb.append(startPos.getLine()); + sb.append(", Column "); + sb.append(endPos.getPos()); + } + + return sb.toString(); + } + } diff --git a/src/test/java/de/tlc4b/typechecking/TestTypechecker.java b/src/test/java/de/tlc4b/typechecking/TestTypechecker.java index 1d3bcd8..484487a 100644 --- a/src/test/java/de/tlc4b/typechecking/TestTypechecker.java +++ b/src/test/java/de/tlc4b/typechecking/TestTypechecker.java @@ -25,7 +25,7 @@ public class TestTypechecker { Start start = parser.parse(machine, false); final Ast2String ast2String2 = new Ast2String(); start.apply(ast2String2); - System.out.println(ast2String2.toString()); + //System.out.println(ast2String2.toString()); MachineContext c = new MachineContext(null, start, null, null); Typechecker t = new Typechecker(c); diff --git a/src/test/java/de/tlc4b/util/TestUtil.java b/src/test/java/de/tlc4b/util/TestUtil.java index 98c7291..831ec92 100644 --- a/src/test/java/de/tlc4b/util/TestUtil.java +++ b/src/test/java/de/tlc4b/util/TestUtil.java @@ -31,15 +31,15 @@ public class TestUtil { Translator b2tlaTranslator = new Translator(machine); b2tlaTranslator.translate(); System.out.println(b2tlaTranslator.getModuleString()); - - //TODO create standard modules BBuildins - + + // TODO create standard modules BBuildins String moduleName = b2tlaTranslator.getMachineName(); - String str1 = translateTLA2B(moduleName, - b2tlaTranslator.getModuleString()); + String str1 = de.tla2bAst.Translator.translateModuleString(moduleName, + b2tlaTranslator.getModuleString(), null); - String str2 = translateTLA2B(moduleName, expectedModule); + String str2 = de.tla2bAst.Translator.translateModuleString(moduleName, + expectedModule, null); // StringBuilder sb1 = de.tla2b.translation.Tla2BTranslator // .translateString(name, b2tlaTranslator.getModuleString(), null); // StringBuilder sb2 = de.tla2b.translation.Tla2BTranslator @@ -53,8 +53,7 @@ public class TestUtil { // assertEquals(sb2.toString(), sb1.toString()); } - public static String translateTLA2B(String moduleName, String tlaString) - throws TLA2BException { + public static String translateTLA2B(String moduleName, String tlaString) throws TLA2BException { return de.tla2bAst.Translator.translateModuleString(moduleName, tlaString, null); } @@ -65,7 +64,6 @@ public class TestUtil { tlaString, configString); } - public static void compareLTLFormula(String expected, String machine, String ltlFormula) throws Exception { Translator b2tlaTranslator = new Translator(machine, ltlFormula); @@ -121,12 +119,8 @@ public class TestUtil { System.out.println(b2tlaTranslator.getModuleString()); System.out.println(b2tlaTranslator.getConfigString()); - - //TODO include config file in back translation from TLA+ to B - - - - + // TODO include config file in back translation from TLA+ to B + // String name = b2tlaTranslator.getMachineName(); // StringBuilder sb1 = de.tla2b.translation.Tla2BTranslator // .translateString(name, b2tlaTranslator.getModuleString(), diff --git a/src/test/java/testing/CompoundScopeTest.java b/src/test/java/testing/CompoundScopeTest.java deleted file mode 100644 index 89bf8f0..0000000 --- a/src/test/java/testing/CompoundScopeTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package testing; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.junit.Ignore; -import org.junit.Test; - -import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.analysis.pragma.Pragma; -import de.be4.classicalb.core.parser.analysis.prolog.RecursiveMachineLoader; -import de.be4.classicalb.core.parser.exceptions.BException; -import de.be4.classicalb.core.parser.node.Start; -import de.tlc4b.util.Ast2String; - -public class CompoundScopeTest { - - @Ignore - @Test - public void test() throws BException, IOException { - String filename = "src/test/resources/M1.mch"; - checkScope(filename); - } - - public void checkScope(String filename) throws BException, IOException { - - final File machineFile = new File(filename); - - BParser parser = new BParser(filename); - Start tree = parser.parseFile(machineFile, false); - - RecursiveMachineLoader r = new RecursiveMachineLoader( - machineFile.getParent(), parser.getContentProvider()); - - List<Pragma> pragmas = new ArrayList<Pragma>(); - pragmas.addAll(parser.getPragmas()); - r.loadAllMachines(machineFile, tree, parser.getSourcePositions(), - parser.getDefinitions(), pragmas); - // r.printAsProlog(new PrintWriter(System.out), false); - - Map<String, Start> map = r.getParsedMachines(); - ArrayList<String> list = new ArrayList<String>(map.keySet()); - - // Hashtable<String, MachineContext> machineContextsTable = new - // Hashtable<String, MachineContext>(); - // Hashtable<String, Typechecker> typecheckerTable = new - // Hashtable<String, Typechecker>(); - for (int i = 0; i < list.size(); i++) { - String name = list.get(i); - // System.out.println(name); - Start start = map.get(name); - final Ast2String ast2String2 = new Ast2String(); - start.apply(ast2String2); - System.out.println(ast2String2.toString()); - - // MachineContext c = new MachineContext(start, - // machineContextsTable); - // machineContextsTable.put(name, c); - - } - - } -} diff --git a/src/test/java/testing/CompoundTest.java b/src/test/java/testing/CompoundTest.java deleted file mode 100644 index 769fff7..0000000 --- a/src/test/java/testing/CompoundTest.java +++ /dev/null @@ -1,40 +0,0 @@ -package testing; - -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.List; - -import org.junit.Test; - -import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.analysis.pragma.Pragma; -import de.be4.classicalb.core.parser.analysis.prolog.RecursiveMachineLoader; -import de.be4.classicalb.core.parser.exceptions.BException; -import de.be4.classicalb.core.parser.node.Start; - -public class CompoundTest { - - @Test - public void test() throws IOException, BException { - String filename = "src/test/resources/compound/M1.mch"; - //final int dot = filename.lastIndexOf('.'); - final File machineFile = new File(filename); - //final String probfilename = filename.substring(0, dot) + ".prob"; - - - - BParser parser = new BParser(filename); - Start tree = parser.parseFile(machineFile, false); - - RecursiveMachineLoader r = new RecursiveMachineLoader(machineFile.getParent(), parser.getContentProvider()); - - - List<Pragma> pragmas = new ArrayList<Pragma>(); - pragmas.addAll(parser.getPragmas()); - r.loadAllMachines(machineFile, tree, parser.getSourcePositions(), parser.getDefinitions(), pragmas); - - //r.printAsProlog(new PrintWriter(System.out), false); - } - -} -- GitLab