From 38f370818b96017a55287392eeae725bed18f73d Mon Sep 17 00:00:00 2001 From: Johannes Mey <johannes.mey@tu-dresden.de> Date: Sun, 8 Jul 2018 18:46:29 +0200 Subject: [PATCH] add option to rename list class. this made it much easier to use the generator in the train benchmark. --- spec/jastadd/Backend.jadd | 43 ++++++++++--------- .../org/jastadd/relast/compiler/Compiler.java | 8 ++++ 2 files changed, 31 insertions(+), 20 deletions(-) diff --git a/spec/jastadd/Backend.jadd b/spec/jastadd/Backend.jadd index f206987..8778063 100644 --- a/spec/jastadd/Backend.jadd +++ b/spec/jastadd/Backend.jadd @@ -1,4 +1,7 @@ aspect BackendAbstractGrammar { + + public static String ASTNode.listClass = "ArrayList"; + public String Program.generateAbstractGrammar() { StringBuilder sb = new StringBuilder(); generateAbstractGrammar(sb); @@ -19,7 +22,7 @@ aspect BackendAbstractGrammar { if (hasSuper()) { sb.append(" : " + getSuper()); } - + if (getNumComponent() > 0 || relationComponents().size() > 0) { sb.append(" ::="); } @@ -56,7 +59,7 @@ aspect BackendAbstractGrammar { return "<" + getImplAttributeName() + ":" + ofTypeDecl() + ">"; } public String ManyRelationComponent.generateAbstractGrammar() { - return "<" + getImplAttributeName() + ":ArrayList<" + ofTypeDecl() + ">>"; + return "<" + getImplAttributeName() + ":" + ASTNode.listClass + "<" + ofTypeDecl() + ">>"; } public String RelationComponent.getImplAttributeName() { @@ -159,7 +162,7 @@ aspect BackendDirectedAPI { } public void OptionalRelationComponent.generateDirectedAPI(StringBuilder sb) { generateDirectedZeroOneAPI(sb, true); - + generateExtraOptAPI(sb); } public void RelationComponent.generateDirectedZeroOneAPI(StringBuilder sb, boolean optional) { @@ -184,9 +187,9 @@ aspect BackendDirectedAPI { sb.append(ind(1) + "public void " + toTypeDecl() + ".addTo"); sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list == null) {\n"); - sb.append(ind(3) + "list = new ArrayList<>();\n"); + sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "list.add(o);\n"); sb.append(ind(2) + "set" + getImplAttributeName() + "(list);\n"); @@ -196,7 +199,7 @@ aspect BackendDirectedAPI { sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom"); sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); sb.append(ind(2) + "}\n"); @@ -227,7 +230,7 @@ aspect BackendDirectedAPI { public void RelationComponent.generateGetMany(StringBuilder sb) { sb.append(ind(1) + "public java.util.List<" + ofTypeDecl() + "> " + toTypeDecl()); sb.append("." + name() + "() {\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> l = get" + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> l = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "return l != null ? Collections.unmodifiableList(l) : Collections.emptyList();\n"); sb.append(ind(1) + "}\n"); @@ -314,14 +317,14 @@ aspect BackendBidirectionalAPI { sb.append(ind(1) + "public void " + toTypeDecl() + ".addTo"); sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list == null) {\n"); - sb.append(ind(3) + "list = new ArrayList<>();\n"); + sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + "ArrayList<" + otherSide().ofTypeDecl() + "> list2 = o.get" + sb.append(ind(2) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get" + otherSide().getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list2 == null) {\n"); - sb.append(ind(3) + "list2 = new ArrayList<>();\n"); + sb.append(ind(3) + "list2 = new "+ ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "list.add(o);\n"); sb.append(ind(2) + "list2.add(this);\n"); @@ -333,9 +336,9 @@ aspect BackendBidirectionalAPI { sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom"); sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); - sb.append(ind(3) + "ArrayList<" + otherSide().ofTypeDecl() + "> list2 = o.get" + sb.append(ind(3) + ASTNode.listClass + "<" + otherSide().ofTypeDecl() + "> list2 = o.get" + otherSide().getImplAttributeName() + "();\n"); sb.append(ind(3) + "if (list2 != null) list2.remove(this);\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); @@ -354,15 +357,15 @@ aspect BackendBidirectionalAPI { sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); sb.append(ind(2) + "if (o != null && o.get" + otherSide().getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + "ArrayList<" + ofTypeDecl() + "> list2 = o.get" + sb.append(ind(3) + ASTNode.listClass + "<" + ofTypeDecl() + "> list2 = o.get" + otherSide().getImplAttributeName() + "().get" + getImplAttributeName() + "();\n"); sb.append(ind(3) + "if (list2.remove(o))\n"); sb.append(ind(4) + "o.get" + otherSide().getImplAttributeName() + "().set" + getImplAttributeName() + "(list2);\n"); sb.append(ind(2) + "}\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list == null) {\n"); - sb.append(ind(3) + "list = new ArrayList<>();\n"); + sb.append(ind(3) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(2) + "}\n"); sb.append(ind(2) + "list.add(o);\n"); sb.append(ind(2) + "set" + getImplAttributeName() + "(list);\n"); @@ -373,7 +376,7 @@ aspect BackendBidirectionalAPI { sb.append(ind(1) + "public void " + toTypeDecl() + ".removeFrom"); sb.append(nameCapitalized() + "(" + ofTypeDecl() + " o) {\n"); sb.append(ind(2) + "assertNotNull(o);\n"); - sb.append(ind(2) + "ArrayList<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); + sb.append(ind(2) + ASTNode.listClass + "<" + ofTypeDecl() + "> list = get" + getImplAttributeName() + "();\n"); sb.append(ind(2) + "if (list != null && list.remove(o)) {\n"); sb.append(ind(3) + "set" + getImplAttributeName() + "(list);\n"); sb.append(ind(3) + "if (o.get" + otherSide().getImplAttributeName() + "() == this) {\n"); @@ -394,7 +397,7 @@ aspect BackendBidirectionalAPI { sb.append(ind(2) + "assertNotNull(o);\n"); } sb.append(ind(2) + "if (get" + getImplAttributeName() + "() != null) {\n"); - sb.append(ind(3) + "ArrayList<" + toTypeDecl() + "> list2 = get" + getImplAttributeName() + sb.append(ind(3) + ASTNode.listClass + "<" + toTypeDecl() + "> list2 = get" + getImplAttributeName() + "()." + "get" + otherSide().getImplAttributeName() + "();\n"); sb.append(ind(3) + "list2.remove(this);\n"); sb.append(ind(3) + "get" + getImplAttributeName() + "()." + "set" @@ -406,10 +409,10 @@ aspect BackendBidirectionalAPI { if (isOpt) { sb.append(ind(2) + "if (o != null) {\n"); } - sb.append(ind(ind) + "ArrayList<" + toTypeDecl() + "> list = o.get" + sb.append(ind(ind) + ASTNode.listClass + "<" + toTypeDecl() + "> list = o.get" + otherSide().getImplAttributeName() + "();\n"); sb.append(ind(ind) + "if (list == null) {\n"); - sb.append(ind(ind+1) + "list = new ArrayList<>();\n"); + sb.append(ind(ind+1) + "list = new " + ASTNode.listClass + "<>();\n"); sb.append(ind(ind) + "}\n"); sb.append(ind(ind) + "list.add(this);\n"); sb.append(ind(ind) + "o.set" + otherSide().getImplAttributeName() + "(list);\n"); diff --git a/src/java/org/jastadd/relast/compiler/Compiler.java b/src/java/org/jastadd/relast/compiler/Compiler.java index a6f8a1d..f5ff3c3 100644 --- a/src/java/org/jastadd/relast/compiler/Compiler.java +++ b/src/java/org/jastadd/relast/compiler/Compiler.java @@ -21,6 +21,7 @@ public class Compiler { protected ArrayList<Option<?>> options; protected FlagOption optionWriteToFile; protected FlagOption optionPrintAST; + protected StringOption optionListClass; protected CommandLine commandLine; public Compiler(String args[]) throws CommandLineException { @@ -47,6 +48,12 @@ public class Compiler { } System.exit(1); } else { + + if (optionListClass.isSet()) { + System.out.println("ListClass is set to " + optionListClass.getValue()); + p.listClass = optionListClass.getValue(); + } + if (optionWriteToFile.isSet()) { File file = new File(filename); String absPath = file.getAbsolutePath(); @@ -76,6 +83,7 @@ public class Compiler { protected void addOptions() { optionWriteToFile = addOption(new FlagOption("file", "write output to files <filename>Gen.ast and <filename>Gen.jadd")); optionPrintAST = addOption(new FlagOption("ast", "print AST")); + optionListClass = addOption(new StringOption("listClass", "determine the class name of the nonterminal reference list")); } protected <OptionType extends Option<?>> OptionType addOption(OptionType option) { -- GitLab