From 6a407f80595b6d275ec06b36a63d4a34c2bb5247 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Thu, 31 Mar 2022 13:52:51 +0200 Subject: [PATCH] fix genericity problem --- .../java/de/tudresden/inf/st/mg/Main.java | 2 +- .../de/tudresden/inf/st/mg/RobotParser.java | 24 +++--------------- .../de/tudresden/inf/st/mg/WorldParser.java | 25 +++---------------- .../inf/st/mg/common/MotionGrammarParser.java | 22 ++++++++++++++++ .../de/tudresden/inf/st/mg/ParserTest.java | 2 +- 5 files changed, 30 insertions(+), 45 deletions(-) diff --git a/src/main/java/de/tudresden/inf/st/mg/Main.java b/src/main/java/de/tudresden/inf/st/mg/Main.java index 3acb247..905b280 100644 --- a/src/main/java/de/tudresden/inf/st/mg/Main.java +++ b/src/main/java/de/tudresden/inf/st/mg/Main.java @@ -36,7 +36,7 @@ public class Main { e.printStackTrace(); } try { - parser.parseT(); + parser.parse(); } catch (WorldParser.ParseException e) { e.printStackTrace(); } diff --git a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java index 2c285f6..30b8726 100644 --- a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java @@ -20,27 +20,9 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { return (World) context_.get(WORLD); } - /** - * Parse a motion grammar with root T - * - * @return the parsed AST of type T - */ - public Tidy parseTidy() throws ParseException { - // don't try this at home - rootContainer_ = new ASTNode<>(); - if (rootContainer_.getNumChild() == 0) { - rootContainer_.addChild(null); - } - printAST("initial", null); - parseTidy(rootContainer_, 0); - Tidy result = rootContainer_.getChild(0); - printAST("complete", null); - result.setParent(null); - rootContainer_.setChild(null, 0); - return result; - } - private void parseTidy(ASTNode<?> parent, int index) throws ParseException { + @Override + protected void parse(ASTNode<?> parent, int index) throws ParseException { Tidy result; if (true) { @@ -49,6 +31,6 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { // semantic action for T result.action(getWorld()); - printAST("parseT", result); + printAST("parseTidy", result); } } diff --git a/src/main/java/de/tudresden/inf/st/mg/WorldParser.java b/src/main/java/de/tudresden/inf/st/mg/WorldParser.java index e5e634f..f263b72 100644 --- a/src/main/java/de/tudresden/inf/st/mg/WorldParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/WorldParser.java @@ -21,27 +21,8 @@ public final class WorldParser extends MotionGrammarParser<T> { return (World) context_.get(WORLD); } - /** - * Parse a motion grammar with root T - * - * @return the parsed AST of type T - */ - public T parseT() throws ParseException { - // don't try this at home - rootContainer_ = new ASTNode<>(); - if (rootContainer_.getNumChild() == 0) { - rootContainer_.addChild(null); - } - printAST("initial", null); - parseT(rootContainer_, 0); - T result = rootContainer_.getChild(0); - printAST("complete", null); - result.setParent(null); - rootContainer_.setChild(null, 0); - return result; - } - - private void parseT(ASTNode<?> parent, int index) throws ParseException { + @Override + protected void parse(ASTNode<?> parent, int index) throws ParseException { T result; // try to parse a T @@ -66,7 +47,7 @@ public final class WorldParser extends MotionGrammarParser<T> { T1 result = (T1) parent.getChild(index); parseLoad(result, 0); - parseT(result, 1); + parse(result, 1); parseUnload(result, 2); // semantic action for T1 diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java index ae6f4d6..483ed0e 100644 --- a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarParser.java @@ -70,4 +70,26 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { super("Unable to parse token " + expectedToken.name() + "."); } } + + /** + * Parse a motion grammar with root T + * + * @return the parsed AST of type T + */ + public T parse() throws ParseException { + // don't try this at home + rootContainer_ = new ASTNode<>(); + if (rootContainer_.getNumChild() == 0) { + rootContainer_.addChild(null); + } + printAST("initial", null); + parse(rootContainer_, 0); + T result = rootContainer_.getChild(0); + printAST("complete", null); + result.setParent(null); + rootContainer_.setChild(null, 0); + return result; + } + + protected abstract void parse(ASTNode<?> parent, int index) throws ParseException; } diff --git a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java index 8a0327e..efb5b28 100644 --- a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java +++ b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java @@ -41,7 +41,7 @@ public class ParserTest { WorldParser parser = new WorldParser(world); parser.setDebugDiagramDir(AST_DIAGRAM_DIR); - var result = parser.parseT(); + var result = parser.parse(); assertThat(result).isNotNull().isInstanceOf(T1.class); } -- GitLab