diff --git a/.travis.yml b/.travis.yml index 371f9b2c7916dccf7a4e9a6478e5302cd14b6e83..abe843baddbc5952e76f80cf52d2386c1248bb8d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,5 @@ language: java +sudo: true script: gradle build before_install: - openssl aes-256-cbc -pass pass:$ENCRYPTION_PASSWORD -in secring.gpg.enc -out secring.gpg diff --git a/build.gradle b/build.gradle index 9cad51cb1d135ada6d255a881ff31161fae0e16f..d6daa92230e728a347a790fa50e8b62bb03992b7 100644 --- a/build.gradle +++ b/build.gradle @@ -4,25 +4,25 @@ apply plugin: 'maven' apply plugin: 'jacoco' apply plugin: 'findbugs' -project.version = '1.0.3-SNAPSHOT' +project.version = '1.0.3' project.group = 'de.hhu.stups' project.sourceCompatibility = '1.7' project.targetCompatibility = '1.7' repositories { - mavenCentral() - maven { - name "sonatype snapshots" - url "https://oss.sonatype.org/content/repositories/snapshots" - } + mavenCentral() + maven { + name "sonatype snapshots" + url "https://oss.sonatype.org/content/repositories/snapshots" + } } configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } -def parser_version = '2.5.1' +def parser_version = '2.9.12' def tlatools_version = '1.0.2' dependencies { @@ -38,7 +38,7 @@ dependencies { //compile(group: 'de.hhu.stups', name: 'de.prob.core.kernel', version: '2.0.0-milestone-13-SNAPSHOT') testCompile (group: 'junit', name: 'junit', version: '4.12') - testCompile (group: 'de.hhu.stups', name: 'tla2bAST', version: '1.0.8') + testCompile (group: 'de.hhu.stups', name: 'tla2bAST', version: '1.1.0') } jacoco { diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java index c00d21c0c4c83fd82c817716f76c191009bc3a4f..81125adf95b5bd5e35fab7b4c696b14fe2d56a59 100644 --- a/src/main/java/de/tlc4b/TLC4B.java +++ b/src/main/java/de/tlc4b/TLC4B.java @@ -13,7 +13,7 @@ import java.io.UnsupportedEncodingException; import java.util.LinkedHashMap; import java.util.Map.Entry; -import de.be4.classicalb.core.parser.exceptions.BException; +import de.be4.classicalb.core.parser.exceptions.BCompoundException; import de.tlc4b.TLC4BGlobals; import de.tlc4b.analysis.UsedStandardModules.STANDARD_MODULES; import de.tlc4b.exceptions.TLC4BIOException; @@ -49,7 +49,7 @@ public class TLC4B { TLC4B tlc4b = new TLC4B(); try { tlc4b.process(args); - } catch (BException e) { + } catch (BCompoundException e) { printlnErr("***** Parsing Error *****"); printlnErr(e.getMessage()); return; @@ -337,7 +337,7 @@ public class TLC4B { } } - public void process(String[] args) throws IOException, BException { + public void process(String[] args) throws IOException, BCompoundException { MP.print("Arguments: "); for (int i = 0; i < args.length; i++) { diff --git a/src/main/java/de/tlc4b/Translator.java b/src/main/java/de/tlc4b/Translator.java index 9502ab7495bda11a843b5ee3840aa0e76aed7a1c..da8bd947a67919c6f315c29376d46ba93abea9c4 100644 --- a/src/main/java/de/tlc4b/Translator.java +++ b/src/main/java/de/tlc4b/Translator.java @@ -7,7 +7,7 @@ import java.util.Map; import de.be4.classicalb.core.parser.BParser; import de.be4.classicalb.core.parser.analysis.prolog.RecursiveMachineLoader; -import de.be4.classicalb.core.parser.exceptions.BException; +import de.be4.classicalb.core.parser.exceptions.BCompoundException; import de.be4.classicalb.core.parser.node.APredicateParseUnit; import de.be4.classicalb.core.parser.node.PPredicate; import de.be4.classicalb.core.parser.node.Start; @@ -48,7 +48,7 @@ public class Translator { private TLCOutputInfo tlcOutputInfo; private String translatedLTLFormula; - public Translator(String machineString) throws BException { + public Translator(String machineString) throws BCompoundException { this.machineString = machineString; BParser parser = new BParser("Testing"); start = parser.parse(machineString, false); @@ -57,7 +57,7 @@ public class Translator { // System.out.println(ast2String2.toString()); } - public Translator(String machineString, String ltlFormula) throws BException { + public Translator(String machineString, String ltlFormula) throws BCompoundException { this.machineString = machineString; this.ltlFormula = ltlFormula; BParser parser = new BParser("Testing"); @@ -68,7 +68,7 @@ public class Translator { } public Translator(String machineName, File machineFile, String ltlFormula, String constantSetup) - throws BException, IOException { + throws BCompoundException, IOException { this.machineName = machineName; this.ltlFormula = ltlFormula; @@ -83,7 +83,7 @@ public class Translator { // machine final RecursiveMachineLoader rml = new RecursiveMachineLoader(machineFile.getParent(), parser.getContentProvider()); - rml.loadAllMachines(machineFile, start, parser.getSourcePositions(), parser.getDefinitions()); + rml.loadAllMachines(machineFile, start, parser.getDefinitions()); parsedMachines = rml.getParsedMachines(); @@ -92,7 +92,7 @@ public class Translator { Start start2 = null; try { start2 = con.parse("#FORMULA " + constantSetup, false); - } catch (BException e) { + } catch (BCompoundException e) { System.err.println("An error occured while parsing the constants setup predicate."); throw e; } diff --git a/src/main/java/de/tlc4b/analysis/MachineContext.java b/src/main/java/de/tlc4b/analysis/MachineContext.java index 102c2c6d1f2530841b90a39f272f783a168a4a00..14ccb839f370d24244113cb31df39615783d8b6e 100644 --- a/src/main/java/de/tlc4b/analysis/MachineContext.java +++ b/src/main/java/de/tlc4b/analysis/MachineContext.java @@ -9,7 +9,6 @@ import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAbstractConstantsMachineClause; import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; @@ -64,6 +63,7 @@ import de.be4.classicalb.core.parser.node.PPredicate; import de.be4.classicalb.core.parser.node.PSet; import de.be4.classicalb.core.parser.node.Start; import de.be4.classicalb.core.parser.node.TIdentifierLiteral; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.MP; import de.tlc4b.TLC4BGlobals; import de.tlc4b.analysis.transformation.DefinitionsSorter; @@ -197,7 +197,7 @@ public class MachineContext extends DepthFirstAdapter { } private void exist(LinkedList<TIdentifierLiteral> list) { - String name = Utils.getIdentifierAsString(list); + String name = Utils.getTIdentifierListAsString(list); identifierAlreadyExists(name); } @@ -235,13 +235,13 @@ public class MachineContext extends DepthFirstAdapter { this.header = node; if (machineName == null) { List<TIdentifierLiteral> nameList = new ArrayList<TIdentifierLiteral>(node.getName()); - this.machineName = Utils.getIdentifierAsString(nameList); + this.machineName = Utils.getTIdentifierListAsString(nameList); } List<PExpression> copy = new ArrayList<PExpression>(node.getParameters()); for (PExpression e : copy) { AIdentifierExpression p = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(p.getIdentifier()); + String name = Utils.getTIdentifierListAsString(p.getIdentifier()); exist(p.getIdentifier()); if (Character.isUpperCase(name.charAt(0))) { this.machineSetParameter.put(name, p); @@ -386,7 +386,7 @@ public class MachineContext extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>(node.getMachineNames()); for (PExpression e : copy) { AIdentifierExpression p = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(p.getIdentifier()); + String name = Utils.getTIdentifierListAsString(p.getIdentifier()); try { exist(p.getIdentifier()); @@ -409,7 +409,7 @@ public class MachineContext extends DepthFirstAdapter { @Override public void caseADeferredSetSet(ADeferredSetSet node) { List<TIdentifierLiteral> copy = new ArrayList<TIdentifierLiteral>(node.getIdentifier()); - String name = Utils.getIdentifierAsString(copy); + String name = Utils.getTIdentifierListAsString(copy); exist(node.getIdentifier()); deferredSets.put(name, node); } @@ -418,14 +418,14 @@ public class MachineContext extends DepthFirstAdapter { public void caseAEnumeratedSetSet(AEnumeratedSetSet node) { { List<TIdentifierLiteral> copy = new ArrayList<TIdentifierLiteral>(node.getIdentifier()); - String name = Utils.getIdentifierAsString(copy); + String name = Utils.getTIdentifierListAsString(copy); exist(node.getIdentifier()); enumeratedSets.put(name, node); } List<PExpression> copy = new ArrayList<PExpression>(node.getElements()); for (PExpression e : copy) { AIdentifierExpression v = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(v.getIdentifier()); + String name = Utils.getTIdentifierListAsString(v.getIdentifier()); exist(v.getIdentifier()); enumValues.put(name, v); } @@ -437,7 +437,7 @@ public class MachineContext extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>(node.getIdentifiers()); for (PExpression e : copy) { AIdentifierExpression c = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(c.getIdentifier()); + String name = Utils.getTIdentifierListAsString(c.getIdentifier()); exist(c.getIdentifier()); constants.put(name, c); } @@ -449,7 +449,7 @@ public class MachineContext extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>(node.getIdentifiers()); for (PExpression e : copy) { AIdentifierExpression c = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(c.getIdentifier()); + String name = Utils.getTIdentifierListAsString(c.getIdentifier()); exist(c.getIdentifier()); constants.put(name, c); } @@ -460,7 +460,7 @@ public class MachineContext extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>(node.getIdentifiers()); for (PExpression e : copy) { AIdentifierExpression v = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(v.getIdentifier()); + String name = Utils.getTIdentifierListAsString(v.getIdentifier()); exist(v.getIdentifier()); variables.put(name, v); } @@ -471,14 +471,14 @@ public class MachineContext extends DepthFirstAdapter { List<PExpression> copy = new ArrayList<PExpression>(node.getIdentifiers()); for (PExpression e : copy) { AIdentifierExpression v = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(v.getIdentifier()); + String name = Utils.getTIdentifierListAsString(v.getIdentifier()); exist(v.getIdentifier()); variables.put(name, v); } } private void putLocalVariableIntoCurrentScope(AIdentifierExpression node) throws ScopeException { - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); LinkedHashMap<String, Node> currentScope = contextTable.get(contextTable.size() - 1); if (currentScope.containsKey(name)) { throw new ScopeException("Duplicate Identifier: " + name); @@ -489,7 +489,7 @@ public class MachineContext extends DepthFirstAdapter { @Override public void caseAIdentifierExpression(AIdentifierExpression node) { - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); for (int i = contextTable.size() - 1; i >= 0; i--) { LinkedHashMap<String, Node> currentScope = contextTable.get(i); if (currentScope.containsKey(name)) { @@ -502,7 +502,7 @@ public class MachineContext extends DepthFirstAdapter { @Override public void caseAPrimedIdentifierExpression(APrimedIdentifierExpression node) { - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); for (int i = contextTable.size() - 1; i >= 0; i--) { LinkedHashMap<String, Node> currentScope = contextTable.get(i); if (currentScope.containsKey(name)) { @@ -643,7 +643,7 @@ public class MachineContext extends DepthFirstAdapter { // first collect all operations for (POperation e : copy) { AOperation op = (AOperation) e; - String name = Utils.getIdentifierAsString(op.getOpName()); + String name = Utils.getTIdentifierListAsString(op.getOpName()); // existString(name); if (operations.keySet().contains(name)) { throw new ScopeException(String.format("Duplicate operation: '%s'", name)); @@ -740,7 +740,7 @@ public class MachineContext extends DepthFirstAdapter { public void caseAOpSubstitution(AOpSubstitution node) { if (node.getName() != null) { AIdentifierExpression op = (AIdentifierExpression) node.getName(); - String name = Utils.getIdentifierAsString(op.getIdentifier()); + String name = Utils.getTIdentifierListAsString(op.getIdentifier()); Node o = operations.get(name); if (o != null) { this.referencesTable.put(op, o); diff --git a/src/main/java/de/tlc4b/analysis/PrimedNodesMarker.java b/src/main/java/de/tlc4b/analysis/PrimedNodesMarker.java index b9f0d82efcc5b1851776095fe5c56c2b409a1561..c09d4a2e31046baf26fa15d0d60d18f838b807bd 100644 --- a/src/main/java/de/tlc4b/analysis/PrimedNodesMarker.java +++ b/src/main/java/de/tlc4b/analysis/PrimedNodesMarker.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAssignSubstitution; import de.be4.classicalb.core.parser.node.ABecomesElementOfSubstitution; @@ -14,6 +13,7 @@ import de.be4.classicalb.core.parser.node.APrimedIdentifierExpression; import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.POperation; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.exceptions.ScopeException; public class PrimedNodesMarker extends DepthFirstAdapter { @@ -97,7 +97,7 @@ public class PrimedNodesMarker extends DepthFirstAdapter { return; } } - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); throw new ScopeException("Unkown identifier: '"+name+"$0'"); } diff --git a/src/main/java/de/tlc4b/analysis/Renamer.java b/src/main/java/de/tlc4b/analysis/Renamer.java index 864e506ee3bdb55cdf626275d8d9806f6c7bcec4..63676ea98bfb86e74f1d208854cd81a9c67e45f1 100644 --- a/src/main/java/de/tlc4b/analysis/Renamer.java +++ b/src/main/java/de/tlc4b/analysis/Renamer.java @@ -8,7 +8,6 @@ import java.util.List; import java.util.Set; import java.util.Map.Entry; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAnySubstitution; import de.be4.classicalb.core.parser.node.AComprehensionSetExpression; @@ -30,6 +29,7 @@ import de.be4.classicalb.core.parser.node.AVarSubstitution; import de.be4.classicalb.core.parser.node.Node; import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; +import de.be4.classicalb.core.parser.util.Utils; public class Renamer extends DepthFirstAdapter { private final MachineContext machineContext; @@ -216,7 +216,7 @@ public class Renamer extends DepthFirstAdapter { private String renameIdentifier(Node node) { AIdentifierExpression id = (AIdentifierExpression) node; - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); String newName = incName(name); namesTable.put(id, newName); return newName; diff --git a/src/main/java/de/tlc4b/analysis/Typechecker.java b/src/main/java/de/tlc4b/analysis/Typechecker.java index d9919c7acc51fa75bc77012532e28f61783a9e91..9c487ec517380257988a91fe54f865809f350eb7 100644 --- a/src/main/java/de/tlc4b/analysis/Typechecker.java +++ b/src/main/java/de/tlc4b/analysis/Typechecker.java @@ -8,9 +8,9 @@ import java.util.LinkedList; import java.util.List; import java.util.Map.Entry; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.*; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.btypes.AbstractHasFollowers; import de.tlc4b.btypes.BType; import de.tlc4b.btypes.BoolType; @@ -135,7 +135,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { List<PExpression> copy = new ArrayList<PExpression>(node.getParameters()); for (PExpression e : copy) { AIdentifierExpression p = (AIdentifierExpression) e; - String name = Utils.getIdentifierAsString(p.getIdentifier()); + String name = Utils.getTIdentifierListAsString(p.getIdentifier()); if (Character.isUpperCase(name.charAt(0))) { @@ -160,7 +160,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { public void caseAEnumeratedSetSet(AEnumeratedSetSet node) { List<TIdentifierLiteral> copy = new ArrayList<TIdentifierLiteral>(node.getIdentifier()); - String setName = Utils.getIdentifierAsString(copy); + String setName = Utils.getTIdentifierListAsString(copy); SetType set = new SetType(new EnumeratedSetElement(setName)); setType(node, set); List<PExpression> copy2 = new ArrayList<PExpression>(node.getElements()); @@ -172,7 +172,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { @Override public void caseADeferredSetSet(ADeferredSetSet node) { List<TIdentifierLiteral> copy = new ArrayList<TIdentifierLiteral>(node.getIdentifier()); - String name = Utils.getIdentifierAsString(copy); + String name = Utils.getTIdentifierListAsString(copy); setType(node, new SetType(new EnumeratedSetElement(name))); } @@ -399,7 +399,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { Node identifierDeclarationNode = referenceTable.get(node); BType found = getType(identifierDeclarationNode); - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); try { expected.unify(found, this); } catch (UnificationException e) { @@ -423,6 +423,20 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { node.getRight().apply(this); } + @Override + public void caseAIfThenElseExpression(AIfThenElseExpression node) { + setType(node.getCondition(), BoolType.getInstance()); + node.getCondition().apply(this); + + UntypedType x = new UntypedType(); + setType(node.getThen(), x); + setType(node.getElse(), x); + node.getThen().apply(this); + node.getElse().apply(this); + BType found = getType(node.getThen()); + unify(getType(node), found, node); + } + @Override public void caseANotEqualPredicate(ANotEqualPredicate node) { try { @@ -2246,7 +2260,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { e.getValue().apply(this); AIdentifierExpression i = (AIdentifierExpression) e.getIdentifier(); - String name = Utils.getIdentifierAsString(i.getIdentifier()); + String name = Utils.getTIdentifierListAsString(i.getIdentifier()); found.add(name, getType(e.getValue())); } BType expected = getType(node); @@ -2261,7 +2275,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { public void caseARecordFieldExpression(ARecordFieldExpression node) { StructType s = new StructType(); AIdentifierExpression i = (AIdentifierExpression) node.getIdentifier(); - String fieldName = Utils.getIdentifierAsString(i.getIdentifier()); + String fieldName = Utils.getTIdentifierListAsString(i.getIdentifier()); s.add(fieldName, new UntypedType()); setType(node.getRecord(), s); @@ -2289,7 +2303,7 @@ public class Typechecker extends DepthFirstAdapter implements ITypechecker { e.getValue().apply(this); AIdentifierExpression i = (AIdentifierExpression) e.getIdentifier(); - String name = Utils.getIdentifierAsString(i.getIdentifier()); + String name = Utils.getTIdentifierListAsString(i.getIdentifier()); BType t = ((SetType) getType(e.getValue())).getSubtype(); s.add(name, t); } diff --git a/src/main/java/de/tlc4b/analysis/transformation/DefinitionsEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/DefinitionsEliminator.java index 38fb4969b12ec1767b1a9f59770cddde2821aefb..3456f2e9dd0a80896419b07d5f3ac65db0a2b1c4 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/DefinitionsEliminator.java +++ b/src/main/java/de/tlc4b/analysis/transformation/DefinitionsEliminator.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.Hashtable; import java.util.List; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; import de.be4.classicalb.core.parser.node.ADefinitionExpression; @@ -20,6 +19,7 @@ import de.be4.classicalb.core.parser.node.PDefinition; import de.be4.classicalb.core.parser.node.PExpression; import de.be4.classicalb.core.parser.node.PMachineClause; import de.be4.classicalb.core.parser.node.Start; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.analysis.StandardMadules; /** @@ -136,7 +136,7 @@ public class DefinitionsEliminator extends DepthFirstAdapter { for (int i = 0; i < clone.getParameters().size(); i++) { AIdentifierExpression p = (AIdentifierExpression) clone .getParameters().get(i); - String paramName = Utils.getIdentifierAsString(p.getIdentifier()); + String paramName = Utils.getTIdentifierListAsString(p.getIdentifier()); Node arg = arguments.get(i); arg.apply(this); @@ -168,7 +168,7 @@ public class DefinitionsEliminator extends DepthFirstAdapter { for (int i = 0; i < clone.getParameters().size(); i++) { AIdentifierExpression p = (AIdentifierExpression) clone .getParameters().get(i); - String paramName = Utils.getIdentifierAsString(p.getIdentifier()); + String paramName = Utils.getTIdentifierListAsString(p.getIdentifier()); Node arg = arguments.get(i); arg.apply(this); context.put(paramName, node.getParameters().get(i)); @@ -200,7 +200,7 @@ public class DefinitionsEliminator extends DepthFirstAdapter { for (int i = 0; i < clone.getParameters().size(); i++) { AIdentifierExpression p = (AIdentifierExpression) clone .getParameters().get(i); - String paramName = Utils.getIdentifierAsString(p.getIdentifier()); + String paramName = Utils.getTIdentifierListAsString(p.getIdentifier()); Node arg = arguments.get(i); arg.apply(this); @@ -218,7 +218,7 @@ public class DefinitionsEliminator extends DepthFirstAdapter { public void caseAIdentifierExpression(AIdentifierExpression node) { if (contextStack.size() == 0) return; - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); for (int i = contextStack.size() - 1; i >= 0; i--) { Hashtable<String, PExpression> context = contextStack.get(i); diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java index c90ba2108061750fc300fe64a73ca63a47401cb4..fb46a533605db50d523fd85450eef4f3553e5df3 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java @@ -6,7 +6,6 @@ import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.Map; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAbstractConstantsMachineClause; import de.be4.classicalb.core.parser.node.AAbstractMachineParseUnit; @@ -23,6 +22,7 @@ import de.be4.classicalb.core.parser.node.PMachineClause; import de.be4.classicalb.core.parser.node.PParseUnit; import de.be4.classicalb.core.parser.node.PPredicate; import de.be4.classicalb.core.parser.node.Start; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.TLC4BGlobals; public class SeesEliminator extends DepthFirstAdapter { @@ -56,7 +56,7 @@ public class SeesEliminator extends DepthFirstAdapter { for (PExpression pExpression : machineNames) { AIdentifierExpression id = (AIdentifierExpression) pExpression; String machineName = Utils - .getIdentifierAsString(id.getIdentifier()); + .getTIdentifierListAsString(id.getIdentifier()); if (!resolvedMachines.contains(machineName)) { resolvedMachines.add(machineName); Start start = parsedMachines.get(machineName); diff --git a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java index 7424d4605840cfa845982e802a31adf47266278d..5dd60e094f33b63e4f87e58a462eb0dfb28981a4 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SetComprehensionOptimizer.java @@ -6,7 +6,6 @@ import java.util.Hashtable; import java.util.LinkedList; import java.util.Set; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AComprehensionSetExpression; import de.be4.classicalb.core.parser.node.AConjunctPredicate; @@ -20,6 +19,7 @@ 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.be4.classicalb.core.parser.node.Start; +import de.be4.classicalb.core.parser.util.Utils; /* * This class performs an AST transformation on set comprehension nodes. For @@ -49,7 +49,7 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { for (int i = 0; i < identifiers.size(); i++) { AIdentifierExpression id = (AIdentifierExpression) identifiers .get(i); - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); list.add(name); identifierTable.put(name, id); } @@ -189,7 +189,7 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { if (equal.getLeft() instanceof AIdentifierExpression) { AIdentifierExpression id = (AIdentifierExpression) equal .getLeft(); - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); Set<String> names = new HashSet<String>(values.keySet()); names.add(name); if (list.contains(name) @@ -202,7 +202,7 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { && equal.getRight() instanceof AIdentifierExpression) { AIdentifierExpression id = (AIdentifierExpression) equal .getRight(); - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); Set<String> names = new HashSet<String>(values.keySet()); names.add(name); if (list.contains(name) @@ -227,7 +227,7 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { @Override public void caseAIdentifierExpression(AIdentifierExpression node) { - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); if (names.contains(name)) { hasDependency = true; } @@ -288,7 +288,7 @@ public class SetComprehensionOptimizer extends DepthFirstAdapter { @Override public void caseAIdentifierExpression(AIdentifierExpression node) { - String name = Utils.getIdentifierAsString(node.getIdentifier()); + String name = Utils.getTIdentifierListAsString(node.getIdentifier()); // todo the name is not a unique of the node PExpression value = values.get(name); if (value != null) { diff --git a/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java b/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java index aecdcbb166eed4af5d196ab6c0dabffc5ac65b99..80a65e7fbf35f130b9457c41e6ac02ddfeb3bf09 100644 --- a/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java +++ b/src/main/java/de/tlc4b/analysis/typerestriction/TypeRestrictor.java @@ -7,7 +7,6 @@ import java.util.Hashtable; import java.util.List; import java.util.Set; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.AAnySubstitution; import de.be4.classicalb.core.parser.node.AAssertionsMachineClause; @@ -44,6 +43,7 @@ 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.be4.classicalb.core.parser.node.Start; +import de.be4.classicalb.core.parser.util.Utils; import de.be4.ltl.core.parser.node.AExistsLtl; import de.be4.ltl.core.parser.node.AForallLtl; import de.tlc4b.TLC4BGlobals; @@ -572,7 +572,7 @@ public class TypeRestrictor extends DepthFirstAdapter { && !(e.parent() instanceof ALambdaExpression) && !(e.parent() instanceof AComprehensionSetExpression)) { AIdentifierExpression id = (AIdentifierExpression) e; - String localVariableName = Utils.getIdentifierAsString(id + String localVariableName = Utils.getTIdentifierListAsString(id .getIdentifier()); throw new NotSupportedException( "Unable to restrict the type '" diff --git a/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java b/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java index 4ce9715c29df46688d92a230dd709ca04718c974..56108205d108030724fdf4a2627ea2fe2f43913e 100644 --- a/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java +++ b/src/main/java/de/tlc4b/ltl/LTLFormulaVisitor.java @@ -10,7 +10,7 @@ import java.util.LinkedHashMap; import java.util.List; import de.be4.classicalb.core.parser.BParser; -import de.be4.classicalb.core.parser.exceptions.BException; +import de.be4.classicalb.core.parser.exceptions.BCompoundException; import de.be4.classicalb.core.parser.node.AExpressionDefinitionDefinition; import de.be4.classicalb.core.parser.node.AIdentifierExpression; import de.be4.classicalb.core.parser.node.AStringExpression; @@ -155,7 +155,7 @@ public class LTLFormulaVisitor extends DepthFirstAdapter { de.be4.classicalb.core.parser.node.Start start = null; try { start = parser.parse(bPredicate, false); - } catch (BException e) { + } catch (BCompoundException e) { throw new LTLParseException(e.getMessage()); } diff --git a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java index 8791cb0f10074e827712512142cc03fe8457a661..9504f362b72e2e4dd502e204e15721b1dafeb9e3 100644 --- a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java +++ b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java @@ -7,9 +7,9 @@ import java.util.Iterator; import java.util.LinkedList; import java.util.List; -import de.be4.classicalb.core.parser.Utils; import de.be4.classicalb.core.parser.analysis.DepthFirstAdapter; import de.be4.classicalb.core.parser.node.*; +import de.be4.classicalb.core.parser.util.Utils; import de.tlc4b.TLC4BGlobals; import de.tlc4b.analysis.MachineContext; import de.tlc4b.analysis.PrecedenceCollector; @@ -717,7 +717,7 @@ public class TLAPrinter extends DepthFirstAdapter { private void printNormalAssignment(PExpression left, PExpression right) { AIdentifierExpression id = (AIdentifierExpression) left; - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); if (!machineContext.getVariables().containsKey(name)) { moduleStringAppend("TRUE"); } else { @@ -1138,7 +1138,7 @@ public class TLAPrinter extends DepthFirstAdapter { inAIdentifierExpression(node); String name = renamer.getNameOfRef(node); if (name == null) { - name = Utils.getIdentifierAsString(node.getIdentifier()); + name = Utils.getTIdentifierListAsString(node.getIdentifier()); } if (StandardMadules.isAbstractConstant(name)) { // in order to pass the member check @@ -1156,7 +1156,7 @@ public class TLAPrinter extends DepthFirstAdapter { public void caseAPrimedIdentifierExpression(APrimedIdentifierExpression node) { String name = renamer.getNameOfRef(node); if (name == null) { - name = Utils.getIdentifierAsString(node.getIdentifier()); + name = Utils.getTIdentifierListAsString(node.getIdentifier()); } moduleStringAppend(name); } @@ -1196,6 +1196,17 @@ public class TLAPrinter extends DepthFirstAdapter { node.getRight().apply(this); outANotEqualPredicate(node); } + + @Override + public void caseAIfThenElseExpression(AIfThenElseExpression node) { + moduleStringAppend("(IF "); + node.getCondition().apply(this); + moduleStringAppend(" THEN "); + node.getThen().apply(this); + moduleStringAppend(" ELSE "); + node.getElse().apply(this); + moduleStringAppend(")"); + } @Override public void caseAConjunctPredicate(AConjunctPredicate node) { @@ -1867,7 +1878,7 @@ public class TLAPrinter extends DepthFirstAdapter { if (node.getIdentifier() instanceof AIdentifierExpression) { AIdentifierExpression id = (AIdentifierExpression) node .getIdentifier(); - String name = Utils.getIdentifierAsString(id.getIdentifier()); + String name = Utils.getTIdentifierListAsString(id.getIdentifier()); if (StandardMadules.isAbstractConstant(name)) { moduleStringAppend(name); diff --git a/src/main/java/de/tlc4b/tla/Generator.java b/src/main/java/de/tlc4b/tla/Generator.java index 80bbdddcafb5edc70bee8fb374e65a0380b4d3f7..dbef5ec399014c2883028b4f6794af486217378c 100644 --- a/src/main/java/de/tlc4b/tla/Generator.java +++ b/src/main/java/de/tlc4b/tla/Generator.java @@ -70,7 +70,7 @@ public class Generator extends DepthFirstAdapter { evalMachineSets(); evalDefinitions(); evalConstants(); - + evalInvariant(); evalOperations(); evalGoal(); @@ -143,13 +143,12 @@ public class Generator extends DepthFirstAdapter { Node value = idValueTable.get(param); if (value != null) { - tlaModule.tlaDefinitions.add(new TLADefinition(param, value)); + tlaModule.addTLADefinition(new TLADefinition(param, value)); continue; } Integer intValue = constantsEvaluator.getIntValue(param); if (intValue != null) { - tlaModule.tlaDefinitions - .add(new TLADefinition(param, intValue)); + tlaModule.addTLADefinition(new TLADefinition(param, intValue)); continue; } @@ -205,7 +204,7 @@ public class Generator extends DepthFirstAdapter { Node n = itr2.next(); AEnumeratedSetSet e = (AEnumeratedSetSet) n; TLADefinition def = new TLADefinition(e, e); - this.tlaModule.tlaDefinitions.add(def); + this.tlaModule.addTLADefinition(def); List<PExpression> copy = new ArrayList<PExpression>(e.getElements()); for (PExpression element : copy) { this.tlaModule.constants.add(element); diff --git a/src/main/java/de/tlc4b/tla/TLAModule.java b/src/main/java/de/tlc4b/tla/TLAModule.java index d373d37c99b9e9a37afb1e0b5cdb3ca9f4d5ee46..2135d0cabf3a506bac5888539a90c40cf2fdedd0 100644 --- a/src/main/java/de/tlc4b/tla/TLAModule.java +++ b/src/main/java/de/tlc4b/tla/TLAModule.java @@ -9,14 +9,14 @@ public class TLAModule { protected String moduleName; - protected final ArrayList<TLADefinition> tlaDefinitions; + private final ArrayList<TLADefinition> tlaDefinitions; protected final ArrayList<Node> constants; protected final ArrayList<Node> assumes; protected final ArrayList<Node> variables; protected final ArrayList<Node> invariants; private final ArrayList<Node> initPredicates; protected final ArrayList<POperation> operations; - private ArrayList<PDefinition> bDefinitions; + private ArrayList<PDefinition> bDefinitions; private final ArrayList<Node> assertions; protected ArrayList<PDefinition> allDefinitions; @@ -110,4 +110,7 @@ public class TLAModule { return this.initPredicates.size() > 0; } + public void addTLADefinition(TLADefinition defintion) { + this.tlaDefinitions.add(defintion); + } } diff --git a/src/test/java/de/tlc4b/prettyprint/SyntaxExtensionsTest.java b/src/test/java/de/tlc4b/prettyprint/SyntaxExtensionsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..399fb6ecc37af9207a0c52eaab751fccf1cb5666 --- /dev/null +++ b/src/test/java/de/tlc4b/prettyprint/SyntaxExtensionsTest.java @@ -0,0 +1,20 @@ +package de.tlc4b.prettyprint; + +import static de.tlc4b.util.TestUtil.compare; + +import org.junit.Test; + + +public class SyntaxExtensionsTest { + + @Test + public void testIfThenElseg() throws Exception { + String machine = "MACHINE test\n" + + "PROPERTIES 1 = (IF 1=1 THEN 1 ELSE 2 END) \n" + "END"; + + String expected = "---- MODULE test----\n" + + "ASSUME 1 = (IF 1 = 1 THEN 1 ELSE 2) \n" + + "======"; + compare(expected, machine); + } +} diff --git a/src/test/java/de/tlc4b/typechecking/TestTypechecker.java b/src/test/java/de/tlc4b/typechecking/TestTypechecker.java index 3e3a300383f75a56996cb8e4f8913f55f41b380b..d26e7ccd1d03a9eef76ab2e64a75f593ec583f29 100644 --- a/src/test/java/de/tlc4b/typechecking/TestTypechecker.java +++ b/src/test/java/de/tlc4b/typechecking/TestTypechecker.java @@ -3,6 +3,7 @@ package de.tlc4b.typechecking; import java.util.Hashtable; import de.be4.classicalb.core.parser.BParser; +import de.be4.classicalb.core.parser.exceptions.BCompoundException; import de.be4.classicalb.core.parser.exceptions.BException; import de.be4.classicalb.core.parser.node.Start; import de.tlc4b.analysis.MachineContext; @@ -22,7 +23,12 @@ public class TestTypechecker { variables = new Hashtable<String, BType>(); BParser parser = new BParser("Test"); - Start start = parser.parse(machine, false); + Start start; + try { + start = parser.parse(machine, false); + } catch (BCompoundException e) { + throw e.getFirstException(); + } final Ast2String ast2String2 = new Ast2String(); start.apply(ast2String2); // System.out.println(ast2String2.toString()); diff --git a/src/test/java/de/tlc4b/util/TestUtil.java b/src/test/java/de/tlc4b/util/TestUtil.java index 4dca4d68c7b4e97b5f2c97372fd0a731ad0d46c8..7fc8d56af27894e54968f8a95cf2f088495f0e45 100644 --- a/src/test/java/de/tlc4b/util/TestUtil.java +++ b/src/test/java/de/tlc4b/util/TestUtil.java @@ -13,6 +13,7 @@ import java.util.Arrays; import java.util.List; import util.ToolIO; +import de.be4.classicalb.core.parser.exceptions.BCompoundException; import de.be4.classicalb.core.parser.exceptions.BException; import de.be4.classicalb.core.parser.node.Start; import de.tla2b.exceptions.TLA2BException; @@ -52,8 +53,14 @@ public class TestUtil { public static void tryTranslating(final String machineString) throws BException { TLC4BGlobals.setForceTLCToEvalConstants(false); ToolIO.setMode(ToolIO.TOOL); - Translator b2tlaTranslator = new Translator(machineString); - b2tlaTranslator.translate(); + Translator b2tlaTranslator; + try { + b2tlaTranslator = new Translator(machineString); + b2tlaTranslator.translate(); + } catch (BCompoundException e) { + throw e.getFirstException(); + } + } public static String translateTLA2B(String moduleName, String tlaString) throws TLA2BException { @@ -135,17 +142,26 @@ public class TestUtil { } public static void compareEquals(String expected, String machine) throws BException { - Translator b2tlaTranslator = new Translator(machine); - b2tlaTranslator.translate(); - System.out.println(b2tlaTranslator.getModuleString()); - assertEquals(expected, b2tlaTranslator.getModuleString()); + try { + Translator b2tlaTranslator = new Translator(machine); + b2tlaTranslator.translate(); + System.out.println(b2tlaTranslator.getModuleString()); + assertEquals(expected, b2tlaTranslator.getModuleString()); + } catch (BCompoundException e) { + throw e.getFirstException(); + } + } public static String translate(String machine) throws BException { - Translator translator = new Translator(machine); - translator.translate(); - System.out.println(translator.getModuleString()); - return translator.getModuleString(); + try { + Translator translator = new Translator(machine); + translator.translate(); + System.out.println(translator.getModuleString()); + return translator.getModuleString(); + } catch (BCompoundException e) { + throw e.getFirstException(); + } } public static TLCResult testString(String machineString) throws IOException {