From d14634fe3399ac6a9fd339c3fefb2d2338a5baea Mon Sep 17 00:00:00 2001 From: dgelessus <dgelessus@users.noreply.github.com> Date: Wed, 25 Jan 2023 11:51:06 +0100 Subject: [PATCH] Combine scope checking into type checking The type checker needs to look up the VTs anyway, so it makes more sense to put the error check there as well. --- src/main/java/de/prob/voparser/VOParser.java | 16 +--- .../prob/voparser/VOScopeCheckException.java | 17 ----- .../java/de/prob/voparser/VOScopeChecker.java | 27 ------- .../java/de/prob/voparser/VOTypeChecker.java | 6 +- .../java/de/prob/voparser/VOScopingTest.java | 75 ------------------- .../de/prob/voparser/VOTypeCheckingTest.java | 30 ++++++++ 6 files changed, 36 insertions(+), 135 deletions(-) delete mode 100644 src/main/java/de/prob/voparser/VOScopeCheckException.java delete mode 100644 src/main/java/de/prob/voparser/VOScopeChecker.java delete mode 100644 src/test/java/de/prob/voparser/VOScopingTest.java diff --git a/src/main/java/de/prob/voparser/VOParser.java b/src/main/java/de/prob/voparser/VOParser.java index 7eb0fac..fe5c544 100644 --- a/src/main/java/de/prob/voparser/VOParser.java +++ b/src/main/java/de/prob/voparser/VOParser.java @@ -16,13 +16,10 @@ public class VOParser { private final Map<String, VTType> tasks; - private final VOScopeChecker scopeChecker; - private final VOTypeChecker typeChecker; public VOParser() { this.tasks = new HashMap<>(); - this.scopeChecker = new VOScopeChecker(this); this.typeChecker = new VOTypeChecker(this); } @@ -56,21 +53,10 @@ public class VOParser { tasks.remove(id); } - public void semanticCheck(Start ast) { - scopeChecker.scopeCheck(ast); + public void typeCheck(Start ast) { typeChecker.typeCheck(ast); } - public void semanticCheck(String formula) { - scopeCheck(formula); - typeCheck(formula); - } - - public void scopeCheck(String formula) { - Start start = parseFormula(formula); - scopeChecker.scopeCheck(start); - } - public void typeCheck(String formula) { Start start = parseFormula(formula); typeChecker.typeCheck(start); diff --git a/src/main/java/de/prob/voparser/VOScopeCheckException.java b/src/main/java/de/prob/voparser/VOScopeCheckException.java deleted file mode 100644 index 7bbe7e2..0000000 --- a/src/main/java/de/prob/voparser/VOScopeCheckException.java +++ /dev/null @@ -1,17 +0,0 @@ -package de.prob.voparser; - -public class VOScopeCheckException extends VOException { - private static final long serialVersionUID = 1L; - - public VOScopeCheckException(final String message, final Throwable cause) { - super(message, cause); - } - - public VOScopeCheckException(final String message) { - this(message, null); - } - - public VOScopeCheckException(final Throwable cause) { - this(cause == null ? null : cause.toString(), cause); - } -} diff --git a/src/main/java/de/prob/voparser/VOScopeChecker.java b/src/main/java/de/prob/voparser/VOScopeChecker.java deleted file mode 100644 index 7c370c5..0000000 --- a/src/main/java/de/prob/voparser/VOScopeChecker.java +++ /dev/null @@ -1,27 +0,0 @@ -package de.prob.voparser; - -import de.prob.voparser.analysis.DepthFirstAdapter; -import de.prob.voparser.node.AIdentifierVo; -import de.prob.voparser.node.Start; - - -public class VOScopeChecker extends DepthFirstAdapter { - - private final VOParser voParser; - - public VOScopeChecker(VOParser voParser) { - this.voParser = voParser; - } - - public void scopeCheck(Start start) { - start.apply(this); - } - - @Override - public void caseAIdentifierVo(AIdentifierVo node) { - if (!voParser.getTasks().containsKey(node.getIdentifierLiteral().getText())) { - throw new VOScopeCheckException("Scope error in VO"); - } - } - -} diff --git a/src/main/java/de/prob/voparser/VOTypeChecker.java b/src/main/java/de/prob/voparser/VOTypeChecker.java index ddba43f..e296814 100644 --- a/src/main/java/de/prob/voparser/VOTypeChecker.java +++ b/src/main/java/de/prob/voparser/VOTypeChecker.java @@ -92,7 +92,11 @@ public class VOTypeChecker extends DepthFirstAdapter { private PersistentHashSet<AnimatorState> visitIdentifierNode(AIdentifierVo node, PersistentHashSet<AnimatorState> animatorState) { - VTType type = voParser.getTasks().get(node.getIdentifierLiteral().getText()); + final String id = node.getIdentifierLiteral().getText(); + if (!voParser.getTasks().containsKey(id)) { + throw new VOTypeCheckException("Scope error in VO"); + } + VTType type = voParser.getTasks().get(id); PersistentHashSet<AnimatorState> newAnimatorState = animatorState; boolean valid = true; switch (type) { diff --git a/src/test/java/de/prob/voparser/VOScopingTest.java b/src/test/java/de/prob/voparser/VOScopingTest.java deleted file mode 100644 index 2665b09..0000000 --- a/src/test/java/de/prob/voparser/VOScopingTest.java +++ /dev/null @@ -1,75 +0,0 @@ -package de.prob.voparser; - -/** - * (c) 2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen, - * Heinrich Heine Universitaet Duesseldorf - * This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html) - * */ - -import org.junit.Test; - -public class VOScopingTest { - - @Test - public void testAtomic() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1", VTType.EXPLORE); - voParser.scopeCheck("MC1"); - } - - @Test - public void testSequential() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1", VTType.TRACE); - voParser.registerTask("TR1", VTType.TRACE); - voParser.scopeCheck("MC1;TR1"); - } - - @Test(expected = VOScopeCheckException.class) - public void testSequentialError() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1", VTType.TRACE); - voParser.scopeCheck("MC1;TR1"); - } - - @Test - public void testAnd() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1", VTType.TRACE); - voParser.registerTask("TR1", VTType.TRACE); - voParser.scopeCheck("MC1 & TR1"); - } - - @Test - public void testAnd2() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1.1", VTType.TRACE); - voParser.registerTask("TR1.1", VTType.TRACE); - voParser.registerTask("MC2.1", VTType.TRACE); - voParser.registerTask("TR2.1", VTType.TRACE); - voParser.scopeCheck("(MC1.1; TR1.1) & (MC2.1; TR2.1)"); - } - - @Test - public void testOr() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1", VTType.TRACE); - voParser.registerTask("TR1", VTType.TRACE); - voParser.scopeCheck("MC1 or TR1"); - } - - @Test - public void testDot() { - VOParser voParser = new VOParser(); - voParser.registerTask("MC1.1", VTType.EXPLORE); - voParser.scopeCheck("MC1.1"); - } - - - @Test(expected = VOScopeCheckException.class) - public void testScopingError() { - VOParser voParser = new VOParser(); - voParser.scopeCheck("MC1"); - } - -} diff --git a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java index 8d3eb82..96e2baa 100644 --- a/src/test/java/de/prob/voparser/VOTypeCheckingTest.java +++ b/src/test/java/de/prob/voparser/VOTypeCheckingTest.java @@ -25,6 +25,13 @@ public class VOTypeCheckingTest { voParser.typeCheck("MC1;MC2"); } + @Test(expected = VOTypeCheckException.class) + public void testSequentialError() { + VOParser voParser = new VOParser(); + voParser.registerTask("MC1", VTType.TRACE); + voParser.typeCheck("MC1;TR1"); + } + @Test(expected = VOTypeCheckException.class) public void testSequential2() { VOParser voParser = new VOParser(); @@ -42,6 +49,16 @@ public class VOTypeCheckingTest { voParser.typeCheck("MC1 & TR1"); } + @Test + public void testAnd2() { + VOParser voParser = new VOParser(); + voParser.registerTask("MC1.1", VTType.TRACE); + voParser.registerTask("TR1.1", VTType.TRACE); + voParser.registerTask("MC2.1", VTType.TRACE); + voParser.registerTask("TR2.1", VTType.TRACE); + voParser.typeCheck("(MC1.1; TR1.1) & (MC2.1; TR2.1)"); + } + @Test public void testOr() { VOParser voParser = new VOParser(); @@ -50,4 +67,17 @@ public class VOTypeCheckingTest { voParser.typeCheck("MC1 or TR1"); } + @Test + public void testDot() { + VOParser voParser = new VOParser(); + voParser.registerTask("MC1.1", VTType.EXPLORE); + voParser.typeCheck("MC1.1"); + } + + @Test(expected = VOTypeCheckException.class) + public void testScopingError() { + VOParser voParser = new VOParser(); + voParser.typeCheck("MC1"); + } + } -- GitLab