From d6c8f859fc00a55b7a6f8d25c375bd40e3f6b049 Mon Sep 17 00:00:00 2001 From: hansen <dominik_hansen@web.de> Date: Fri, 5 Feb 2016 10:24:09 +0100 Subject: [PATCH] added support for IF-THEN-ELSE-END expression --- build.gradle | 2 +- .../java/de/tlc4b/analysis/Typechecker.java | 14 +++++++++++++ .../java/de/tlc4b/prettyprint/TLAPrinter.java | 11 ++++++++++ src/main/java/de/tlc4b/tla/Generator.java | 9 ++++----- src/main/java/de/tlc4b/tla/TLAModule.java | 7 +++++-- .../prettyprint/SyntaxExtensionsTest.java | 20 +++++++++++++++++++ 6 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 src/test/java/de/tlc4b/prettyprint/SyntaxExtensionsTest.java diff --git a/build.gradle b/build.gradle index 5d6e988..7d9929a 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ configurations.all { resolutionStrategy.cacheChangingModulesFor 0, 'seconds' } -def parser_version = '2.5.1' +def parser_version = '2.5.2-SNAPSHOT' def tlatools_version = '1.0.2-SNAPSHOT' dependencies { diff --git a/src/main/java/de/tlc4b/analysis/Typechecker.java b/src/main/java/de/tlc4b/analysis/Typechecker.java index 1e438a3..bf7dcf7 100644 --- a/src/main/java/de/tlc4b/analysis/Typechecker.java +++ b/src/main/java/de/tlc4b/analysis/Typechecker.java @@ -471,6 +471,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 { diff --git a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java index 8791cb0..55687a6 100644 --- a/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java +++ b/src/main/java/de/tlc4b/prettyprint/TLAPrinter.java @@ -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) { diff --git a/src/main/java/de/tlc4b/tla/Generator.java b/src/main/java/de/tlc4b/tla/Generator.java index 97c016e..ca2b6c6 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 d373d37..2135d0c 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 0000000..399fb6e --- /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); + } +} -- GitLab