diff --git a/src/main/java/de/tlc4b/TLC4B.java b/src/main/java/de/tlc4b/TLC4B.java index 89610f7bf341b3f93738699f49726790f0233c53..134a48edb34ad731647c6e9f1196e57ccffdd6a2 100644 --- a/src/main/java/de/tlc4b/TLC4B.java +++ b/src/main/java/de/tlc4b/TLC4B.java @@ -154,6 +154,7 @@ public class TLC4B { public static void test(String[] args, boolean deleteFiles) throws Exception { + System.setProperty("apple.awt.UIElement", "true"); // avoiding pop up windows TLC4BGlobals.resetGlobals(); TLC4BGlobals.setDeleteOnExit(deleteFiles); TLC4BGlobals.setCreateTraceFile(false); diff --git a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java index e7283719de7900fbd94a9a14f40cb3e530cbcb6d..2e755f3ed54e4a987e1213e5ad17ed9fdf4df8c1 100644 --- a/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java +++ b/src/main/java/de/tlc4b/analysis/transformation/SeesEliminator.java @@ -26,15 +26,24 @@ public class SeesEliminator extends DepthFirstAdapter { private final Start main; private final Map<String, Start> parsedMachines; + private final ArrayList<String> resolvedMachines; public static void eliminateSeesClauses(Start start, Map<String, Start> parsedMachines) { - new SeesEliminator(start, parsedMachines); + new SeesEliminator(start, parsedMachines, new ArrayList<String>()); } - private SeesEliminator(Start start, Map<String, Start> parsedMachines) { + private void eliminateSeenMachinesRecursively(Start start, + Map<String, Start> parsedMachines, + ArrayList<String> resolvedMachines) { + new SeesEliminator(start, parsedMachines, resolvedMachines); + } + + private SeesEliminator(Start start, Map<String, Start> parsedMachines, + ArrayList<String> resolvedMachines) { this.main = start; this.parsedMachines = parsedMachines; + this.resolvedMachines = resolvedMachines; MachineClauseSorter.sortMachineClauses(start); start.apply(this); } @@ -43,14 +52,17 @@ public class SeesEliminator extends DepthFirstAdapter { LinkedList<PExpression> machineNames = node.getMachineNames(); for (PExpression pExpression : machineNames) { AIdentifierExpression id = (AIdentifierExpression) pExpression; - String identifierAsString = Utils.getIdentifierAsString(id + String machineName = Utils.getIdentifierAsString(id .getIdentifier()); - Start start = parsedMachines.get(identifierAsString); - DefinitionsEliminator.eliminateDefinitions(start); - eliminateSeesClauses(start, parsedMachines); - new MachineClauseAdder(main, start); - if(node.parent() != null){ - node.replaceBy(null); + if(!resolvedMachines.contains(machineName)){ + resolvedMachines.add(machineName); + Start start = parsedMachines.get(machineName); + DefinitionsEliminator.eliminateDefinitions(start); + eliminateSeenMachinesRecursively(start, parsedMachines, resolvedMachines); + new MachineClauseAdder(main, start); + if (node.parent() != null) { + node.replaceBy(null); + } } } } @@ -60,13 +72,14 @@ public class SeesEliminator extends DepthFirstAdapter { private final HashMap<Class<? extends PMachineClause>, PMachineClause> machineClauseHashMap; private final LinkedList<PMachineClause> additionalMachineClauseList; - public MachineClauseAdder(Start main, Start start) { + public MachineClauseAdder(Start main, Start seenMachineStart) { this.machineClausesList = new ArrayList<PMachineClause>(); this.machineClauseHashMap = new LinkedHashMap<Class<? extends PMachineClause>, PMachineClause>(); this.additionalMachineClauseList = new LinkedList<PMachineClause>(); PParseUnit pParseUnit = main.getPParseUnit(); AAbstractMachineParseUnit machineParseUnit = (AAbstractMachineParseUnit) pParseUnit; + System.out.println(machineParseUnit.getHeader()); for (PMachineClause machineClause : machineParseUnit .getMachineClauses()) { @@ -75,9 +88,8 @@ public class SeesEliminator extends DepthFirstAdapter { machineClause); } - start.apply(this); - - + seenMachineStart.apply(this); + LinkedList<PMachineClause> newMachineClauseList = new LinkedList<PMachineClause>(); for (PMachineClause pMachineClause : machineClausesList) { pMachineClause.replaceBy(null); // delete parent of clause @@ -92,7 +104,9 @@ public class SeesEliminator extends DepthFirstAdapter { AConstantsMachineClause main = (AConstantsMachineClause) machineClauseHashMap .get(node.getClass()); - if (main != null) { + if (main == null) { + additionalMachineClauseList.add(node); + } else { ArrayList<PExpression> oldConstantsList = new ArrayList<PExpression>( main.getIdentifiers()); ArrayList<PExpression> newConstantsList = new ArrayList<PExpression>(); @@ -109,8 +123,6 @@ public class SeesEliminator extends DepthFirstAdapter { } main.setIdentifiers(newConstantsList); - } else { - additionalMachineClauseList.add(node); } } @@ -144,34 +156,27 @@ public class SeesEliminator extends DepthFirstAdapter { @Override public void caseAPropertiesMachineClause(APropertiesMachineClause node) { - APropertiesMachineClause main = null; - for (PMachineClause clause : machineClausesList) { - if (clause instanceof APropertiesMachineClause) { - main = (APropertiesMachineClause) clause; - } - } - - if (main != null) { + APropertiesMachineClause main = (APropertiesMachineClause) machineClauseHashMap + .get(node.getClass()); + if (main == null) { + additionalMachineClauseList.add(node); + } else { AConjunctPredicate con = new AConjunctPredicate(); con.setLeft(main.getPredicates()); con.setRight(node.getPredicates()); main.setPredicates(con); - } else { - additionalMachineClauseList.add(node); } } @Override public void caseADefinitionsMachineClause(ADefinitionsMachineClause node) { - ADefinitionsMachineClause main = null; - for (PMachineClause clause : machineClausesList) { - if (clause instanceof ADefinitionsMachineClause) { - main = (ADefinitionsMachineClause) clause; - } - } + ADefinitionsMachineClause main = (ADefinitionsMachineClause) machineClauseHashMap + .get(node.getClass()); - if (main != null) { + if (main == null) { + additionalMachineClauseList.add(node); + } else { ArrayList<PDefinition> oldDefinitions = new ArrayList<PDefinition>( main.getDefinitions()); ArrayList<PDefinition> newDefinitionsList = new ArrayList<PDefinition>(); @@ -190,8 +195,6 @@ public class SeesEliminator extends DepthFirstAdapter { } main.setDefinitions(newDefinitionsList); - } else { - additionalMachineClauseList.add(node); } } diff --git a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java index 743559e754f9877a34aac5247472c71c8729261b..b3fe17567887f460a9e6a327ec87f407da99c078 100644 --- a/src/test/java/de/tlc4b/tlc/integration/BasicTest.java +++ b/src/test/java/de/tlc4b/tlc/integration/BasicTest.java @@ -38,6 +38,7 @@ public class BasicTest extends AbstractParseMachineTest { public static Configuration getConfig() { final ArrayList<TestPair> list = new ArrayList<TestPair>(); list.add(new TestPair(NoError, "./src/test/resources/composition/sees")); + list.add(new TestPair(NoError, "./src/test/resources/composition/sees2")); list.add(new TestPair(NoError, "./src/test/resources/basics")); list.add(new TestPair(NoError, "./src/test/resources/laws")); return getConfiguration(list); diff --git a/src/test/resources/composition/sees2/M1.mch b/src/test/resources/composition/sees2/M1.mch new file mode 100644 index 0000000000000000000000000000000000000000..a8d6a056b9ca6ed69e929821bfab0cf797385f0e --- /dev/null +++ b/src/test/resources/composition/sees2/M1.mch @@ -0,0 +1,3 @@ +MACHINE M1 +SEES M2, M4 +END diff --git a/src/test/resources/composition/sees2/M2.mch b/src/test/resources/composition/sees2/M2.mch new file mode 100644 index 0000000000000000000000000000000000000000..8d955de80bb2e06b138d295e0a8a1d0dac8dab85 --- /dev/null +++ b/src/test/resources/composition/sees2/M2.mch @@ -0,0 +1,7 @@ +MACHINE M2 +SEES M3 +CONSTANTS + k2 +PROPERTIES + k2 = k3 + 1 +END diff --git a/src/test/resources/composition/sees2/M3.mch b/src/test/resources/composition/sees2/M3.mch new file mode 100644 index 0000000000000000000000000000000000000000..f383a5af8d141311c169f03e3efc068adc2baa70 --- /dev/null +++ b/src/test/resources/composition/sees2/M3.mch @@ -0,0 +1,7 @@ +MACHINE M3 +SEES M4 +CONSTANTS + k3 +PROPERTIES + k3 = 3 +END diff --git a/src/test/resources/composition/sees2/M4.mch b/src/test/resources/composition/sees2/M4.mch new file mode 100644 index 0000000000000000000000000000000000000000..36ba47cf46c4056979631cdcf411125e2aba7a28 --- /dev/null +++ b/src/test/resources/composition/sees2/M4.mch @@ -0,0 +1,6 @@ +MACHINE M4 +CONSTANTS + k4 +PROPERTIES + k4 = 4 +END