diff --git a/relast2uml.base/src/main/jastadd/Analysis.jrag b/relast2uml.base/src/main/jastadd/Analysis.jrag index 84a3af2c07d0b22e676686229b88fb5654426719..317cf9dab8f3d0beb71e38fa7a2410b3c04090e2 100644 --- a/relast2uml.base/src/main/jastadd/Analysis.jrag +++ b/relast2uml.base/src/main/jastadd/Analysis.jrag @@ -1,2 +1,12 @@ aspect Analysis { + syn lazy Folder GrammarFile.defaultFolder() { + Folder result = new Folder(); + result.setName(new java.io.File(getFileName()).getName().replace(".relast", "").replace(".ast", "")); + for (Declaration decl : getDeclarationList()) { + if (decl.isTypeDecl() && !decl.asTypeDecl().hasSourceFolder()) { + result.addType(decl.asTypeDecl()); + } + } + return result; + } } diff --git a/relast2uml.base/src/main/jastadd/Navigation.jrag b/relast2uml.base/src/main/jastadd/Navigation.jrag index a5d0889ba9607e9139f4f71dfc17cf3235831d34..09c9ae19da6a995a0c24e27afff0d0739604b1c7 100644 --- a/relast2uml.base/src/main/jastadd/Navigation.jrag +++ b/relast2uml.base/src/main/jastadd/Navigation.jrag @@ -13,6 +13,14 @@ aspect Navigation { eq Program.getChild().containedFile() = null; eq Relast2Uml.getChild().containedFile() = null; + // --- isTypeDecl (should be in preprocessor) --- + syn boolean Declaration.isTypeDecl() = false; + eq TypeDecl.isTypeDecl() = true; + + // --- asTypeDecl (should be in preprocessor) --- + syn TypeDecl Declaration.asTypeDecl() = null; + eq TypeDecl.asTypeDecl() = this; + // --- isTypeComponent (should be in preprocessor) --- syn boolean Component.isTypeComponent() = false; eq TypeComponent.isTypeComponent() = true; diff --git a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java index bb60cd810082c4f557b5d8a54e166d84006ee620..1e76de88a4e7d1cce18e7e33ca191abb7bfec17f 100644 --- a/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java +++ b/relast2uml.base/src/main/java/org/jastadd/relast2uml/compiler/Compiler.java @@ -1,10 +1,7 @@ package org.jastadd.relast2uml.compiler; import beaver.Parser; -import org.jastadd.relast2uml.ast.ErrorMessage; -import org.jastadd.relast2uml.ast.GrammarFile; -import org.jastadd.relast2uml.ast.Program; -import org.jastadd.relast2uml.ast.Relast2Uml; +import org.jastadd.relast2uml.ast.*; import org.jastadd.relast2uml.compiler.options.CommandLine; import org.jastadd.relast2uml.compiler.options.FlagOption; import org.jastadd.relast2uml.compiler.options.Option; @@ -25,6 +22,7 @@ public class Compiler { private StringOption optionOutputFile; private StringOption optionInputRelast2Uml; + private FlagOption optionDefaultFolders; private FlagOption optionHelp; private FlagOption optionVersion; private FlagOption optionVerbose; @@ -165,6 +163,8 @@ public class Compiler { "output", "target file to be generated.", "uml.md").makeOptional()); optionInputRelast2Uml = addOption(new StringOption( "inputRelast2Uml", "relast2uml definition file.").makeOptional()); + optionDefaultFolders = addOption(new FlagOption( + "defaultFolders", "Creates a default folder per grammar file.")); optionHelp = addOption(new FlagOption( "help", "Print usage and exit.")); optionVersion = addOption(new FlagOption( @@ -193,7 +193,6 @@ public class Compiler { inputGrammar.dumpTree(System.out); } program.addGrammarFile(inputGrammar); - inputGrammar.treeResolveAll(); inputGrammar.setFileName(inputGrammarFileName); } catch (IOException | Parser.Exception e) { throw new CompilerException("Could not parse grammar file " + inputGrammarFileName, e); @@ -217,6 +216,11 @@ public class Compiler { } relast2Uml.setProgram(program); relast2Uml.treeResolveAll(); + if (optionDefaultFolders.isSet()) { + for (GrammarFile grammarFile : program.getGrammarFileList()) { + relast2Uml.addFolder(grammarFile.defaultFolder()); + } + } return relast2Uml; } diff --git a/relast2uml.base/src/main/resources/TypeDecl.mustache b/relast2uml.base/src/main/resources/TypeDecl.mustache index 48eff2c7c8caed5a4bb0974bc2218173536cfb64..a72b5dcfcdc2b8fe11ca240402d98cc787340d83 100644 --- a/relast2uml.base/src/main/resources/TypeDecl.mustache +++ b/relast2uml.base/src/main/resources/TypeDecl.mustache @@ -1,4 +1,5 @@ -{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> {<%/first%> +{{=<% %>=}}<%#isAbstract%>abstract <%/isAbstract%>class <%name%><%#InnerTokenComponents%><%#first%> { +<%/first%> <%name%> -<%#last%>}<%/last%> -<%/InnerTokenComponents%><%={{ }}=%> +<%#last%> +}<%/last%><%/InnerTokenComponents%><%={{ }}=%> diff --git a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java index 871500ba6f059b4926fb6b4eb655b79362f16f5d..14de18e22bd30cb474cf9548c92641066667cd8f 100644 --- a/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java +++ b/relast2uml.base/src/test/java/org/jastadd/relast2uml/test/CompilerTest.java @@ -35,6 +35,7 @@ public class CompilerTest { String[] args = { "--output=" + output, "--inputRelast2Uml=" + inputRelast2Uml, + "--defaultFolders", inputGrammar }; diff --git a/relast2uml.base/src/test/resources/Example.relast b/relast2uml.base/src/test/resources/Example.relast index a4a05b6faacc8ae1dde380126f78d12f571801f5..0eb3846f541bdf720d7adf3687defa446c8c30bd 100644 --- a/relast2uml.base/src/test/resources/Example.relast +++ b/relast2uml.base/src/test/resources/Example.relast @@ -11,7 +11,7 @@ Funktionsprinzip ::= Dateneingangswert* Verarbeitungsschritt* Datenausgangswert* abstract Datenquelle; // Beispiel für Wert: FB_links, ist_diff, max_diff -Wert : Datenquelle ::= <Datentyp> ; +Wert : Datenquelle ::= <Datentyp> <A> <B>; // Ein Wert, der bei "Dateneingang" steht, z.B. für ReLi: max_Diff oder FB,links // Beispiel für Dateneingangswert: Zuordnung, aus welcher Quelle der Wert ausgelesen werden soll