diff --git a/gradle.properties b/gradle.properties index 4f0ee66dd8bd5c1e752d4d9e1e0b6889e087c15e..08db7214a1bd07bb1e3c104d563211783404e6f6 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ relast_version = 0.3.0-137 -relast2uml_version = 1.0.0 +relast2uml_version = 1.0.2-68 jupyter_version = 5.8.2 assertj_version = 3.22.0 grammar2uml_version = 0.2.1 diff --git a/material/2022-05-31-research-discussion.odp b/material/2022-05-31-research-discussion.odp index d02f6f8c376adc42b302a736ea19017932c5b493..b994241547651755158e533c4400f49d31247cb2 100644 Binary files a/material/2022-05-31-research-discussion.odp and b/material/2022-05-31-research-discussion.odp differ diff --git a/material/overview.drawio b/material/overview.drawio index ca260e737ff4c34b6b2357b58dd8ee029fca997e..3dd4ab3ff9738e76a29c83aac23d46f786ca49e5 100644 --- a/material/overview.drawio +++ b/material/overview.drawio @@ -1 +1 @@ -<mxfile host="Electron" modified="2022-05-30T15:22:45.891Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/18.1.3 Chrome/100.0.4896.143 Electron/18.2.3 Safari/537.36" etag="In4-8qNJInGg5Ttx52PO" version="18.1.3" type="device"><diagram id="xllGRi-CdCWfJc1u12WW" name="Page-1">7Vpdb6M4FP01fSzyF8Z+bDvT3dmdSiN1pdE+VQ44gBZwFpxJZn79XggQwHTazoZ2qk6ktsm1+eg591yfa3JGr/L9b6XaJDcm0tkZQdH+jL47I0QKDL/rwNdDwBf8EIjLNDqE8DFwm37TbRC10W0a6Wo00RqT2XQzDoamKHRoRzFVlmY3nrY22fiqGxVrJ3AbqqyNkmP0cxrZpJ2LEToO/K7TOGkvLfx2IFfd5DZQJSoyu0GIvj+jV6Ux9vAu31/prMauw+Vw3PU9o/3tlrqwjzngm/n75g8/+ZNEHxVOgg/nH9TqnASH03xR2bb9j9u7tV87CEqzLSJdnwWd0ctdklp9u1FhPboDziGW2DyDTxjerk1hWxYxh8/t6XVp9f7eG8c9HJBG2uTall9hSnuAaAFsM4h00O+OfAQdyMmACtZNVG0OxP2pjzDBmxapJ6BGHdAudaK+pGZbfgc9/DB6NU4pJN9FlsYFxKzZjDElNQXrNMuuTGbK5go0UlqsQ4hXtjT/6MEID4VerU/Dgs8mNDCXhj42pIGSpWjADg1XgJTe25cgwdciYnMkCLKi/ERSwJI+TMKcFpYjwb+fhOvPpoRyS3gGd3G5Kkec8H+3deVrcD2vGmAvYALmm32DVTcO7+L6Lywvea5cfXVsfVQrnX0yVWpTU7O2Mtaa/F46B3xDYd7UJ8v3cb2EeStVpaGnwq3Vd7ZMVRHX17psljTk+TNFbpILCAmF0FwuIOQHzUh9hi4e6bXaZvY0GULwOEMo8T2OnSTBdCZJcMA8KhfKE+7kyY1pqHqD6eEjvZ5PD/zu8mrJ9ODcH6UHo24B6b3NMDeCpeqHfNiAdAxUaY31Re3qnm5EGjPYWTjksS7UzkEeYqeBmMoxxEQ+skYvt066C2WnPdTr5qjCg6A+qbLSrp6ayj7WxyiLC1PoScq3IdUKLAQc4cSu8vI0ihopzTE7NqELuMwAHQtlx1zgMsdnjeZSxJEfFUeUltANHUpdZbb13f9PwUDpGL8cARE8nhA0tFnV3sY59U9Uw4TDFPVnV7k5lS1WyDA7BVk7Xdklihv03QRxIbnv44AwPOGmsbSnsB+B9MiEG0k9LhxuKKNeIJ+zCrqt7l9QuIrq7dQ4hviDBQ77c+3DYqQIh5RbnasCQIPoRaOK10LQEnpiaGLnpXxpxlzDFgJHttyGtqpP7TgJtdnoInotLC5jJSh/nJVYjDbiesDqKLS0WJsyP2TvHIV9pOfUQuuzghao6obguNVx+luhmqOH+6nn5fkRljHNm03vIR1t6F2ax3DZLAUqr8Ms3dypst7ICU2+AbLLWuC3Zm13ANAdJmIPP96miJcBl5JJJyVmwBUzFo94/lLwulu/jYn41T+RgD5M1nM2T8T1478q3glE2fnofmVjHnFNyfMWPXcT2iHk9fTJmJ2oUSaTpwV0ZnF61ha5u/7PwBNjtXMWPhOAC/HllKbp5kXdU0eqSvqnSKdwD1R6YkwRlh72HZYw3G/gEiUWW+Z+IqJOICh5qp2nAHl4QlggPUoeJSuMF6t/bhf9YnRRJjlH3Bfc92UgHF15CMoSQwQLhJnEPsV0TJdECyiNSWjJJgYFCw+7zOGgj462pcDokqXkRt3mzOHv6aY91oUuFVz8+j0Ekrs4M6upax/h7Dy3Wuop1PQbHbI37AMixIyExGIrk+vr71VQZLarH34MNY/pIP2bxX+qKSpASoJDFiMWSOaWQAzFJYBiFDDBuGTiRAUPE9mbu34HCs/5PVhKPT6nm8CTeCnSXIcPrluXRZ30U0Ov12t93w5VmKgi1m9oh2oiQCqlJ4cvNsPvs24yPsJ/vJZdDI4n1S7A/YOPAcDdU+MhvlL0D1OeADF8PH6rsBkbfDWTvv8P</diagram></mxfile> \ No newline at end of file +<mxfile host="Electron" modified="2022-06-10T07:40:44.173Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/18.1.3 Chrome/100.0.4896.143 Electron/18.2.3 Safari/537.36" etag="r6BY6nRAQaejeYnjVoee" version="18.1.3" type="device"><diagram id="xllGRi-CdCWfJc1u12WW" name="Page-1">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</diagram></mxfile> \ No newline at end of file diff --git a/material/overview.drawio-full.png b/material/overview.drawio-full.png new file mode 100644 index 0000000000000000000000000000000000000000..e1f9b10fa0ff88f130c1040a884227da0ce93c5c Binary files /dev/null and b/material/overview.drawio-full.png differ diff --git a/material/overview.drawio.png b/material/overview.drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..a1827b8dc9f04c7804d469134989a5352016096a Binary files /dev/null and b/material/overview.drawio.png differ diff --git a/src/main/jastadd/cleanup/Cleanup.jrag b/src/main/jastadd/cleanup/Cleanup.jrag index 62540f0f837a6e3f3f780dec537888b2b7149076..8aa80f487df93e2daec08013e2ef435d6ec0f5b1 100644 --- a/src/main/jastadd/cleanup/Cleanup.jrag +++ b/src/main/jastadd/cleanup/Cleanup.jrag @@ -42,4 +42,5 @@ aspect CleanupAttributes { syn Tidy Tidy.containingTidy() = this; inh Tidy ASTNode.containingTidy(); eq Tidy.getChild().containingTidy() = this; + eq World.getChild().containingTidy() = null; // fallback } diff --git a/src/main/jastadd/cleanup/Tracing.jadd b/src/main/jastadd/cleanup/Tracing.jadd new file mode 100644 index 0000000000000000000000000000000000000000..a5174dbc10ef2ffe5b25cce087ac8ff28c5c0082 --- /dev/null +++ b/src/main/jastadd/cleanup/Tracing.jadd @@ -0,0 +1,70 @@ +aspect Tracing { + + refine + public void Pose.setX(double x) { + World.printContextOf("Pose.setX()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(x); + World.printContextOf("Pose.setX()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("Pose.setX()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + refine + public void Pose.setY(double y) { + World.printContextOf("Pose.setY()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(y); + World.printContextOf("Pose.setY()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("Pose.setY()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + refine + public void Pose.setZ(double z) { + World.printContextOf("Pose.setZ()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(z); + World.printContextOf("Pose.setZ()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("Pose.setZ()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + // this is probably never called because each child overrides the setter method + refine + public void PhysicalObject.setPose(Pose p) { + World.printContextOf("PhysicalObject.setPose()-BEFORE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(p); + World.printContextOf("PhysicalObject.setPose()-AFTER", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("PhysicalObject.setPose()-DONE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + refine + public void MovableObject.setPose(Pose p) { + World.printContextOf("MovableObject.setPose()-BEFORE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(p); + World.printContextOf("MovableObject.setPose()-AFTER", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("MovableObject.setPose()-DONE", getPose(), de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + refine + public void Robot.setIsIdle(boolean b) { + World.printContextOf("Robot.setIsIdle()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + refined(b); + World.printContextOf("Robot.setIsIdle()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("Robot.setIsIdle()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + } + + refine RelAstAPI + public Robot Robot.setAttachedItem(MovableObject o) { + World.printContextOf("Robot.setAttachedItem()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + var result = refined(o); + World.printContextOf("Robot.setAttachedItem()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("Robot.setAttachedItem()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + return result; + } + + refine RelAstAPI + public MovableObject MovableObject.setAttachedRobot(Robot r) { + World.printContextOf("MovableObject.setAttachedRobot()-BEFORE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.REMOVE_COLOR); + var result = refined(r); + World.printContextOf("MovableObject.setAttachedRobot()-AFTER", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.ADD_COLOR); + World.printContextOf("MovableObject.setAttachedRobot()-DONE", this, de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR); + return result; + } + +} diff --git a/src/main/jastadd/common/MotionGrammar.jadd b/src/main/jastadd/common/MotionGrammar.jadd new file mode 100644 index 0000000000000000000000000000000000000000..07164d9fbf8d77f9026821f71fb26dab3c8ad406 --- /dev/null +++ b/src/main/jastadd/common/MotionGrammar.jadd @@ -0,0 +1,11 @@ +aspect Parser { + public de.tudresden.inf.st.mg.common.MotionGrammarParser ASTNode.parser; + public de.tudresden.inf.st.mg.common.MotionGrammarParser ASTNode.getParser() { + if (parser == null) { + return (getParent() != null) ? getParent().getParser() : null; + } else { + return parser; + } + } + +} diff --git a/src/main/jastadd/common/MotionGrammar.jrag b/src/main/jastadd/common/MotionGrammar.jrag new file mode 100644 index 0000000000000000000000000000000000000000..9cbc6b5f52b08adf26b9447aafad5cf035a4692a --- /dev/null +++ b/src/main/jastadd/common/MotionGrammar.jrag @@ -0,0 +1,5 @@ +aspect Navigation { + inh World ASTNode.containingWorld(); + eq World.getChild().containingWorld() = this; + eq MotionGrammarElement.getChild().containingWorld() = null; +} diff --git a/src/main/jastadd/common/Tracing.jadd b/src/main/jastadd/common/Tracing.jadd new file mode 100644 index 0000000000000000000000000000000000000000..8188384459e935e10ddebd48e7a8a804fc40f02c --- /dev/null +++ b/src/main/jastadd/common/Tracing.jadd @@ -0,0 +1,28 @@ +aspect Tracing { + + public static void World.printContextOf(String step, ASTNode<?> highlightNode, String highlightColor) { + + final String DEFAULT_COLOR = de.tudresden.inf.st.mg.common.MotionGrammarConfig.DEFAULT_COLOR; + + World world; + try { + world = highlightNode.containingWorld(); + } catch (NullPointerException e) { + // the element is not in a full AST (yet?), so we don't print it + return; + } + String worldName = world.getClass().getSimpleName(); + + try { + de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper.read(world) + .setNameMethod(o -> o == null ? "null" : o.getClass().getSimpleName()) + .includeRelationsFor(".*", ".*") + .setBackgroundColorMethod(n -> (n == highlightNode ? highlightColor : DEFAULT_COLOR)) + .excludeTokens("Q.") // FIXME remove domain-specific code + .dumpAsPNG(de.tudresden.inf.st.mg.common.MotionGrammarConfig.astDiagramDir.resolve("Context-" + worldName + "-" + new java.text.SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png")); + } catch (java.io.IOException e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java index 3638eb4971643f63f880434d762e7b9a0da6dc82..e7a17ec6ebabaa3b95f02399be6db0949314d8fa 100644 --- a/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/LoadWorldParser.java @@ -28,10 +28,12 @@ public final class LoadWorldParser extends MotionGrammarParser<T> { // try to parse a T if (peekFull()) { result = new T2(); + result.parser = this; parent.setChild(result, index); parseT2(parent, index); } else if (peekLoad()) { result = new T1(); + result.parser = this; parent.setChild(result, index); parseT1(parent, index); } else { 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 0af51f88a7ba60e32aad9b5e6263b49b88c932b6..2d3840a1db44f47e6a653c41c1dab509b0cdc8e7 100644 --- a/src/main/java/de/tudresden/inf/st/mg/RobotParser.java +++ b/src/main/java/de/tudresden/inf/st/mg/RobotParser.java @@ -33,6 +33,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { @Override protected void parse(ASTNode<?> parent, int index) throws ParseException { Tidy result = new Tidy(); + result.parser = this; parent.setChild(result, index); while (true) { @@ -66,6 +67,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { private void parseMoveObjectToCorrectPlace(ASTNode<?> parent, int index) throws ParseException { MoveObjectToCorrectPlace result = new MoveObjectToCorrectPlace(); + result.parser = this; parent.setChild(result, index); parseObjectAtWrongPlace(result, 0, parent.containingTidy()); @@ -79,6 +81,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { private void parseWaitForEmptyTable(ASTNode<?> parent, int index) throws ParseException { WaitForEmptyTable result = new WaitForEmptyTable(); + result.parser = this; parent.setChild(result, index); parseNotEmptyTable(result, 0); @@ -91,6 +94,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { private void parseDropObjectAtRightPlace(ASTNode<?> parent, int index) throws ParseException { DropObjectAtRightPlace result = new DropObjectAtRightPlace(); + result.parser = this; parent.setChild(result, index); parseRobotIsReadyToDrop(result, 0); @@ -123,6 +127,7 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { private void parsePickUpObject(ASTNode<?> parent, int index) throws ParseException { PickUpObject result = new PickUpObject(); + result.parser = this; parent.setChild(result, index); parseRobotIsReadyToPick(result, 0); @@ -138,10 +143,12 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { // try to parse a RobotIsReadyToPickToken if (peekRobotIsReadyToPickToken()) { result = new RobotIsReallyReadyToPick(); + result.parser = this; parent.setChild(result, index); parseRobotIsReallyReadyToPick(parent, index); } else if (peekRobotIsNotReadyToPickToken()) { result = new RobotIsNotReadyToPick(); + result.parser = this; parent.setChild(result, index); parseRobotIsNotReadyToPick(parent, index); } else { @@ -233,10 +240,12 @@ public final class RobotParser extends MotionGrammarParser<Tidy> { // try to parse a RobotIsReadyToDropToken if (peekRobotIsReadyToDropToken()) { result = new RobotIsReallyReadyToDrop(); + result.parser = this; parent.setChild(result, index); parseRobotIsReallyReadyToDrop(parent, index); } else if (peekRobotIsNotReadyToDropToken()) { result = new RobotIsNotReadyToDrop(); + result.parser = this; parent.setChild(result, index); parseRobotIsNotReadyToDrop(parent, index); } else { diff --git a/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..7cef061ee29c6ef139a989679834d3e5d72ab783 --- /dev/null +++ b/src/main/java/de/tudresden/inf/st/mg/common/MotionGrammarConfig.java @@ -0,0 +1,17 @@ +package de.tudresden.inf.st.mg.common; + +import java.nio.file.Path; + +public class MotionGrammarConfig { + + private MotionGrammarConfig() { + // hide the constructor + } + + public static Path astDiagramDir; + public static final String DEFAULT_COLOR = "cccccc"; + public static final String ADD_COLOR = "47ba4c"; + public static final String REMOVE_COLOR = "de4a2c"; + + +} 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 706c7a980464f168bcda52ac87594123c6caa7b2..ad983acecb7db8680339693582897390af5001f0 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 @@ -7,6 +7,7 @@ import de.tudresden.inf.st.mg.jastadd.model.*; import java.io.IOException; import java.nio.file.Path; +import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.HashMap; import java.util.Map; @@ -17,10 +18,9 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { protected final Map<String, ASTNode<?>> contexts_ = new HashMap<>(); protected ASTNode<T> rootContainer_; private int timeStep_; - protected Path astDiagramDir_; public void setDebugDiagramDir(Path p) { - astDiagramDir_ = p; + MotionGrammarConfig.astDiagramDir = p; } /** @@ -31,7 +31,7 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { */ protected void printAST(String step, ASTNode<?> highlightNode) { - if (astDiagramDir_ == null) { + if (MotionGrammarConfig.astDiagramDir == null) { return; } @@ -42,13 +42,6 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { try { - for (var contextEntry : contexts_.entrySet()) { -// System.out.println("REL: " + ((RobotScene) (contextEntry.getValue())).getRobot().getAttachedItem()); - Dumper.read(contextEntry.getValue()) - .setNameMethod(o -> o == null ? "null" : o.getClass().getSimpleName()) - .includeRelationsFor(".*", ".*") - .dumpAsPNG(astDiagramDir_.resolve("Context-" + contextEntry.getKey() + "-" + String.format("%03d", timeStep_) + "-" + step + ".png")); - } // TODO remove this once the issue in relast2uml has been resolved if (rootContainer_.getChild(0) != null) { Dumper.read(rootContainer_.getChild(0)) @@ -62,11 +55,10 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { } return result + o.getClass().getSimpleName(); }) + .customPreamble("title " + step) .skinParam(SkinParamBooleanSetting.Shadowing, false) .skinParam(SkinParamStringSetting.backgroundColor, "white") -// .dumpAsSource(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".puml")) -// .dumpAsSVG(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".svg")); - .dumpAsPNG(astDiagramDir_.resolve("AST-" + String.format("%03d", timeStep_) + "-" + step + ".png")); + .dumpAsPNG(MotionGrammarConfig.astDiagramDir.resolve("AST-" + String.format("%03d", timeStep_) + "-" + new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss.SSS").format(new java.util.Date()) + "-" + step + ".png")); } timeStep_++; } catch (IOException e) { 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 b88ce99baeda404224b2f9a5f54864aa3281d57e..3950d514953d3a6a8970a02b50388bc0ccb7e5bf 100644 --- a/src/test/java/de/tudresden/inf/st/mg/ParserTest.java +++ b/src/test/java/de/tudresden/inf/st/mg/ParserTest.java @@ -52,17 +52,17 @@ public class ParserTest { @Test void runTidyParser() throws MotionGrammarParser.ParseException { -// for some reason, the best random seed value here is 1 and not 0??? -World world = RobotScene.initialWorld(new Random(1)); + // for some reason, the best random seed value here is 1 and not 0??? + World world = RobotScene.initialWorld(new Random(1)); -// create a parser using the world -RobotParser parser = new RobotParser(world); -parser.setDebugDiagramDir(TIDY_AST_DIAGRAM_DIR); + // create a parser using the world + RobotParser parser = new RobotParser(world); + parser.setDebugDiagramDir(TIDY_AST_DIAGRAM_DIR); -// parse (synchonously, long-running) -var result = parser.parse(); + // parse (synchonously, long-running) + var result = parser.parse(); -assertThat(result).isNotNull().isInstanceOf(Tidy.class); + assertThat(result).isNotNull().isInstanceOf(Tidy.class); } }