From 2f66b9da071e2a21966b95977a8eb3c3bea7a653 Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Fri, 24 Jun 2022 13:49:43 +0200 Subject: [PATCH] update AST printing --- gradle.properties | 2 +- src/main/jastadd/common/Tokens.jrag | 43 +++++++++++++ src/main/jastadd/common/Tracing.jadd | 1 - .../inf/st/mg/common/MotionGrammarParser.java | 61 ++++++++++--------- 4 files changed, 77 insertions(+), 30 deletions(-) create mode 100644 src/main/jastadd/common/Tokens.jrag diff --git a/gradle.properties b/gradle.properties index 08db721..8a37e6b 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ relast_version = 0.3.0-137 -relast2uml_version = 1.0.2-68 +relast2uml_version = 1.1.0 jupyter_version = 5.8.2 assertj_version = 3.22.0 grammar2uml_version = 0.2.1 diff --git a/src/main/jastadd/common/Tokens.jrag b/src/main/jastadd/common/Tokens.jrag new file mode 100644 index 0000000..ba79de8 --- /dev/null +++ b/src/main/jastadd/common/Tokens.jrag @@ -0,0 +1,43 @@ +aspect Tokens { + + inh boolean Token.isSubToken(); + eq Token.getChild().isSubToken() = true; + eq MotionGrammarElement.getChild().isSubToken() = false; + + syn boolean Token.isNegated() = getClass().getSimpleName().matches("(?s).*Not?[A-Z].*"); + + syn String Token.negatedLabel() = "¬" + getClass().getSimpleName().replaceAll("Not?([A-Z])", "$1"); + + syn String Token.label() { + String result = ""; + boolean useOr = isNegated(); + boolean first = true; + if (numChildren() > 0) { + for (ASTNode c : this.astChildren()) { + if (first) { + first = false; + } else { + if (useOr) { + result += " || "; + } else { + result += " && "; + } + } + if (c instanceof Opt) { + Opt optChild = (Opt) c; + if (optChild.getChild(0) != null) { + result += ((Token)optChild.getChild(0)).label(); + } else { + result += "false"; + } + } else { + result += ((Token) c).label(); + } + } + } else { + result = isNegated() ? negatedLabel() : getClass().getSimpleName(); + } + return result; + } + +} diff --git a/src/main/jastadd/common/Tracing.jadd b/src/main/jastadd/common/Tracing.jadd index 8188384..9134d38 100644 --- a/src/main/jastadd/common/Tracing.jadd +++ b/src/main/jastadd/common/Tracing.jadd @@ -16,7 +16,6 @@ aspect Tracing { 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")); 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 ad983ac..3777975 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 @@ -42,40 +42,35 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { try { - // TODO remove this once the issue in relast2uml has been resolved - if (rootContainer_.getChild(0) != null) { - Dumper.read(rootContainer_.getChild(0)) - .setBackgroundColorMethod(n -> (n == highlightNode ? (n instanceof Token ? H_T : H_N) : (n instanceof Token ? N_T : N_N))) - .setNameMethod(o -> { - String result = ""; - try { - o.getClass().getDeclaredMethod("action", World.class); - result += "<:boom:> "; - } catch (NoSuchMethodException ignored) { - } - return result + o.getClass().getSimpleName(); - }) - .customPreamble("title " + step) - .skinParam(SkinParamBooleanSetting.Shadowing, false) - .skinParam(SkinParamStringSetting.backgroundColor, "white") - .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")); - } + Dumper.read(rootContainer_.getChild(0)) + .setBackgroundColorMethod(n -> (n == highlightNode ? (n instanceof Token ? H_T : H_N) : (n instanceof Token ? N_T : N_N))) + .includeChildWhen((parentNode, childNode, contextName) -> !(parentNode instanceof Token)) + .setNameMethod(o -> { + String result = ""; + try { + o.getClass().getDeclaredMethod("action", World.class); + result += "<:boom:> "; + } catch (NoSuchMethodException ignored) { + } + if (o instanceof Token) { + Token t = (Token) o; + // every token with optional children has at least one (in the OR-case) + result += t.label(); + } else { + result += o.getClass().getSimpleName(); + } + return result; + }) + .customPreamble("title " + step) + .skinParam(SkinParamBooleanSetting.Shadowing, false) + .skinParam(SkinParamStringSetting.backgroundColor, "white") + .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) { e.printStackTrace(); } } - public static class ParseException extends Exception { - public ParseException(String ruleName, TokenType... expectedTokens) { - super("Unable to parse nonterminal " + ruleName + ". Expected tokens " + Arrays.stream(expectedTokens).map(Object::toString).collect(Collectors.joining(", ")) + "."); - } - - public ParseException(TokenType expectedToken) { - super("Unable to parse token " + expectedToken.name() + "."); - } - } - /** * Parse a motion grammar with root T * @@ -97,4 +92,14 @@ public abstract class MotionGrammarParser<T extends MotionGrammarElement> { } protected abstract void parse(ASTNode<?> parent, int index) throws ParseException; + + public static class ParseException extends Exception { + public ParseException(String ruleName, TokenType... expectedTokens) { + super("Unable to parse nonterminal " + ruleName + ". Expected tokens " + Arrays.stream(expectedTokens).map(Object::toString).collect(Collectors.joining(", ")) + "."); + } + + public ParseException(TokenType expectedToken) { + super("Unable to parse token " + expectedToken.name() + "."); + } + } } -- GitLab