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