From ae2df97eac7fc1108fd7520e2e642166810e0ceb Mon Sep 17 00:00:00 2001
From: Johannes Mey <johannes.mey@tu-dresden.de>
Date: Mon, 11 Apr 2022 21:07:32 +0200
Subject: [PATCH] fix world problem

---
 src/main/jastadd/LoadWorld.jadd               |  8 +++----
 src/main/jastadd/LoadWorld.jrag               |  3 +++
 src/main/jastadd/RobotWorld.jadd              | 11 +++++++++
 src/main/jastadd/RobotWorld.jrag              |  3 +++
 src/main/jastadd/SemanticActions.jadd         |  8 +++----
 src/main/jastadd/common/SemanticActions.jadd  |  2 +-
 src/main/jastadd/common/Tokens.jadd           | 23 +++++++++++++++++++
 ...{WorldParser.java => LoadWorldParser.java} |  8 +++----
 .../de/tudresden/inf/st/mg/RobotParser.java   |  4 ++--
 .../inf/st/mg/common/MotionGrammarParser.java | 11 +++++----
 .../de/tudresden/inf/st/mg/ParserTest.java    |  2 +-
 11 files changed, 62 insertions(+), 21 deletions(-)
 create mode 100644 src/main/jastadd/common/Tokens.jadd
 rename src/main/java/de/tudresden/inf/st/mg/{WorldParser.java => LoadWorldParser.java} (94%)

diff --git a/src/main/jastadd/LoadWorld.jadd b/src/main/jastadd/LoadWorld.jadd
index 4881399..1359211 100644
--- a/src/main/jastadd/LoadWorld.jadd
+++ b/src/main/jastadd/LoadWorld.jadd
@@ -14,11 +14,9 @@ aspect World {
     return print();
   }
 
-  public enum TokenType {UNDEFINED,FULL,LOAD,UNLOAD; }
-  public static TokenType Token.type() {return TokenType.UNDEFINED; }
-  public static TokenType Full.type() {return TokenType.FULL; }
-  public static TokenType Load.type() {return TokenType.LOAD; }
-  public static TokenType Unload.type() {return TokenType.UNLOAD; }
+  public static TokenType Full.type()   {return TokenType.of("FULL"); }
+  public static TokenType Load.type()   {return TokenType.of("LOAD"); }
+  public static TokenType Unload.type() {return TokenType.of("UNLOAD"); }
 
   public Full World.parseFull() {
     return null;
diff --git a/src/main/jastadd/LoadWorld.jrag b/src/main/jastadd/LoadWorld.jrag
index aca640a..b658ab5 100644
--- a/src/main/jastadd/LoadWorld.jrag
+++ b/src/main/jastadd/LoadWorld.jrag
@@ -1,3 +1,6 @@
 aspect LoadWorld {
   syn String Container.print() = "[Container " + getElementCount() + "/" + getCapacity() + "]";
+
+  syn Container World.asContainer() = null;
+  eq Container.asContainer() = this;
 }
\ No newline at end of file
diff --git a/src/main/jastadd/RobotWorld.jadd b/src/main/jastadd/RobotWorld.jadd
index e69ba01..02351bb 100644
--- a/src/main/jastadd/RobotWorld.jadd
+++ b/src/main/jastadd/RobotWorld.jadd
@@ -12,6 +12,17 @@ aspect RobotWorld {
     return new RobotScene(t, b);
   }
 
+  public static TokenType EmptyTable.type()             { return TokenType.of("EMPTY_TABLE"); }
+  public static TokenType ObjectAtWrongPlace.type()     { return TokenType.of("OBJECT_AT_WRONG_PLACE"); }
+  public static TokenType Pick.type()                   { return TokenType.of("PICK"); }
+  public static TokenType RobotIsFree.type()            { return TokenType.of("ROBOT_IS_FREE"); }
+  public static TokenType RobotIsBusy.type()            { return TokenType.of("ROBOT_IS_BUSY"); }
+  public static TokenType RobotIsIdle.type()            { return TokenType.of("ROBOT_IS_IDLE"); }
+  public static TokenType RobotHasNoItemAttached.type() { return TokenType.of("ROBOT_HAS_NO_ITEM_ATTACHED"); }
+  public static TokenType Wait.type()                   { return TokenType.of("WAIT"); }
+  public static TokenType RightPlace.type()             { return TokenType.of("RIGHT_PLACE"); }
+  public static TokenType Drop.type()                   { return TokenType.of("DROP"); }
+
   public static Pose Pose.of(double x, double y, double z) {
     return new Pose(x, y, z, 0, 0, 0, 1);
   }
diff --git a/src/main/jastadd/RobotWorld.jrag b/src/main/jastadd/RobotWorld.jrag
index ee136ab..a3560db 100644
--- a/src/main/jastadd/RobotWorld.jrag
+++ b/src/main/jastadd/RobotWorld.jrag
@@ -7,6 +7,9 @@ aspect RobotWorld {
     return result + "\n]\n";
   }
 
+  syn RobotScene World.asRobotScene() = null;
+  eq RobotScene.asRobotScene() = this;
+
   syn boolean PhysicalObject.isBin() = false;
   eq Bin.isBin() = true;
 
diff --git a/src/main/jastadd/SemanticActions.jadd b/src/main/jastadd/SemanticActions.jadd
index a3edb74..f91e0fe 100644
--- a/src/main/jastadd/SemanticActions.jadd
+++ b/src/main/jastadd/SemanticActions.jadd
@@ -1,18 +1,18 @@
 aspect SemanticActions {
 
-  @Override
   public void Load.action(World world) {
+    Container container = world.asContainer();
     System.out.println("performing semantic action for element Load");
     System.out.print("  " + world);
-    world.setElementCount(world.getElementCount() + 1);
+    container.setElementCount(world.asContainer().getElementCount() + 1);
     System.out.println(" -> " + world);
   }
 
-  @Override
   public void Unload.action(World world) {
+    Container container = world.asContainer();
     System.out.println("performing semantic action for element Unload");
     System.out.print("  " + world);
-    world.setElementCount(world.getElementCount() - 1);
+    container.setElementCount(container.getElementCount() - 1);
     System.out.println(" -> " + world);
   }
 }
\ No newline at end of file
diff --git a/src/main/jastadd/common/SemanticActions.jadd b/src/main/jastadd/common/SemanticActions.jadd
index d4b7afd..ea271e4 100644
--- a/src/main/jastadd/common/SemanticActions.jadd
+++ b/src/main/jastadd/common/SemanticActions.jadd
@@ -1,7 +1,7 @@
 aspect SemanticActions {
 
   public void MotionGrammarElement.action(World world) {
-    System.out.println("performing semantic action for element " + getClass().getSimpleName());
+    System.out.println("NOT performing any semantic action for element " + getClass().getSimpleName());
   }
 
 }
\ No newline at end of file
diff --git a/src/main/jastadd/common/Tokens.jadd b/src/main/jastadd/common/Tokens.jadd
new file mode 100644
index 0000000..6f4d21f
--- /dev/null
+++ b/src/main/jastadd/common/Tokens.jadd
@@ -0,0 +1,23 @@
+aspect Tokens {
+
+  public class TokenType {
+
+    private String name_;
+
+    private TokenType(String name) {
+      name_ = name;
+    }
+
+    public String name() {
+      return name_;
+    }
+
+    public static TokenType of(String name) {
+      return new TokenType(name);
+    }
+
+  }
+
+  public static TokenType Token.type()  {return TokenType.of("UNDEFINED"); }
+
+}
\ No newline at end of file
diff --git a/src/main/java/de/tudresden/inf/st/mg/WorldParser.java b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
similarity index 94%
rename from src/main/java/de/tudresden/inf/st/mg/WorldParser.java
rename to src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
index f263b72..3638eb4 100644
--- a/src/main/java/de/tudresden/inf/st/mg/WorldParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java
@@ -5,7 +5,7 @@ import de.tudresden.inf.st.mg.jastadd.model.*;
 
 
 
-public final class WorldParser extends MotionGrammarParser<T> {
+public final class LoadWorldParser extends MotionGrammarParser<T> {
 
   private static final String WORLD = "World";
 
@@ -13,12 +13,12 @@ public final class WorldParser extends MotionGrammarParser<T> {
   private Unload peekedUnload_ = null;
   private Full peekedFull_ = null;
 
-  public WorldParser(World world) {
-    context_.put(WORLD, world);
+  public LoadWorldParser(World world) {
+    contexts_.put(WORLD, world);
   }
 
   private World getWorld() {
-    return (World) context_.get(WORLD);
+    return (World) contexts_.get(WORLD);
   }
 
   @Override
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 6b227c6..b21339f 100644
--- a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java
+++ b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java
@@ -11,11 +11,11 @@ public final class RobotParser extends MotionGrammarParser<Tidy> {
   private ObjectAtWrongPlace peekedObjectAtWrongPlace_ = null;
 
   public RobotParser(World world) {
-    context_.put(WORLD, world);
+    contexts_.put(WORLD, world);
   }
 
   private World getWorld() {
-    return (World) context_.get(WORLD);
+    return (World) contexts_.get(WORLD);
   }
 
 
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 483ed0e..0a1dfa9 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
@@ -2,7 +2,10 @@ package de.tudresden.inf.st.mg.common;
 
 import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper;
 import de.tudresden.inf.st.jastadd.dumpAst.ast.SkinParamBooleanSetting;
-import de.tudresden.inf.st.mg.jastadd.model.*;
+import de.tudresden.inf.st.mg.jastadd.model.ASTNode;
+import de.tudresden.inf.st.mg.jastadd.model.MotionGrammarElement;
+import de.tudresden.inf.st.mg.jastadd.model.Token;
+import de.tudresden.inf.st.mg.jastadd.model.TokenType;
 
 import java.io.IOException;
 import java.nio.file.Path;
@@ -13,7 +16,7 @@ import java.util.stream.Collectors;
 
 public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
 
-  protected final Map<String, ASTNode<?>> context_ = new HashMap<>();
+  protected final Map<String, ASTNode<?>> contexts_ = new HashMap<>();
   protected ASTNode<T> rootContainer_;
   private int timeStep_;
   protected Path astDiagramDir_;
@@ -41,7 +44,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
 
     try {
 
-      for (var contextEntry : context_.entrySet()) {
+      for (var contextEntry : contexts_.entrySet()) {
         Dumper.read(contextEntry.getValue())
                 .setNameMethod(o -> o == null ? "null" : o.getClass().getSimpleName())
                 .dumpAsPNG(astDiagramDir_.resolve("Context-" + contextEntry.getKey() + "-" + String.format("%03d", timeStep_) + "-" + step + ".png"));
@@ -63,7 +66,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> {
 
   public static class ParseException extends Exception {
     public ParseException(String ruleName, TokenType... expectedTokens) {
-      super("Unable to parse nonterminal " + ruleName + ". Expected tokens " + Arrays.stream(expectedTokens).map(Enum::toString).collect(Collectors.joining(", ")) + ".");
+      super("Unable to parse nonterminal " + ruleName + ". Expected tokens " + Arrays.stream(expectedTokens).map(Object::toString).collect(Collectors.joining(", ")) + ".");
     }
 
     public ParseException(TokenType expectedToken) {
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 6dce667..82ec1be 100644
--- a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java
+++ b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java
@@ -44,7 +44,7 @@ public class ParserTest {
     // for some reason, the best random seed value here is 1 and not 0???
     Container containerWorld = Container.initialWorld(new Random(1));
 
-    WorldParser parser = new WorldParser(containerWorld);
+    LoadWorldParser parser = new LoadWorldParser(containerWorld);
     parser.setDebugDiagramDir(LOAD_AST_DIAGRAM_DIR);
 
     var result = parser.parse();
-- 
GitLab