diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 9729a314e03c730a3f31025a68ae8233c46d0a62..1a57b5395f0a99a4396e769dcb1a3392ec6c195b 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -1,3 +1,6 @@ +variables: + GIT_SUBMODULE_STRATEGY: recursive + stages: - build diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000000000000000000000000000000000000..d26b5a22d5a7098f78d4bb4cbb21b00b09ace7d0 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "relast-preprocessor"] + path = relast.preprocessor + url = ../relast-preprocessor.git diff --git a/relast.preprocessor b/relast.preprocessor new file mode 160000 index 0000000000000000000000000000000000000000..6fb98d06f2b05b735af78fe68b486c145eb730dc --- /dev/null +++ b/relast.preprocessor @@ -0,0 +1 @@ +Subproject commit 6fb98d06f2b05b735af78fe68b486c145eb730dc diff --git a/relast.preprocessor/.gitignore b/relast.preprocessor/.gitignore deleted file mode 100644 index 87b4cdd3d7c6a41502ca98703abeeb69a1d536fb..0000000000000000000000000000000000000000 --- a/relast.preprocessor/.gitignore +++ /dev/null @@ -1,5 +0,0 @@ -build -src/gen-res/ -src/gen/ -out/ -*.class diff --git a/relast.preprocessor/build.gradle b/relast.preprocessor/build.gradle deleted file mode 100644 index 21370e02d04408a00c85681827b0e913da8df782..0000000000000000000000000000000000000000 --- a/relast.preprocessor/build.gradle +++ /dev/null @@ -1,147 +0,0 @@ - -apply plugin: 'java' -apply plugin: 'jastadd' -apply plugin: 'application' -apply plugin: "idea" - -sourceCompatibility = 1.8 - -mainClassName = 'org.jastadd.relast.compiler.Compiler' - -repositories { - jcenter() -} - -buildscript { - repositories.jcenter() - dependencies { - classpath 'org.jastadd:jastaddgradle:1.13.3' - } -} - -dependencies { - testImplementation 'org.junit.jupiter:junit-jupiter-api:5.4.0' - testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.4.0' - testCompile 'org.assertj:assertj-core:3.12.1' - compile 'com.fasterxml.jackson.core:jackson-core:2.9.8' - compile 'com.fasterxml.jackson.core:jackson-databind:2.9.8' - compile 'org.jastadd:jastadd:2.3.4' - runtime 'org.jastadd:jastadd:2.3.4' - compile group: 'net.sf.beaver', name: 'beaver-rt', version: '0.9.11' -} - -sourceSets { - main { - java.srcDir "src/gen/java" - java.srcDir "buildSrc/gen/java" - } -} - -test { - useJUnitPlatform() - - maxHeapSize = '1G' -} - -jar { - manifest { - attributes "Main-Class": 'org.jastadd.relast.compiler.Compiler' - } - - from { - configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } - } -} - -task relast(type: JavaExec) { - group = 'Build' - main = "-jar" - - doFirst { - delete "src/gen/jastadd/*.ast" - delete "src/gen/jastadd/RelAst.jadd" - delete "src/gen/jastadd/RelAstRefResolver.jadd" - delete "src/gen/jastadd/RelAstResolverStubs.jrag" - mkdir "src/gen/jastadd/" - } - - args = [ - "../libs/relast.jar", - "./src/main/jastadd/RelAst.relast", - "--listClass=java.util.ArrayList", - "--jastAddList=JastAddList", - "--useJastAddNames", - "--file", - "--resolverHelper", - "--grammarName=./src/gen/jastadd/RelAst" - ] - - inputs.files file("../libs/relast.jar"), - file("src/main/jastadd/RelAst.relast") - outputs.files file("./src/gen/jastadd/RelAst.ast"), - file("src/gen/jastadd/RelAst.jadd"), - file("src/gen/jastadd/RelAstRefResolver.jadd"), - file('src/gen/jastadd/RelAstResolverStubs.jrag') -} - -jastadd { - configureModuleBuild() - modules { - //noinspection GroovyAssignabilityCheck - module("RelAst") { - - java { - basedir "." - include "src/main/**/*.java" - include "src/gen/**/*.java" - } - - jastadd { - basedir "." - include "src/main/jastadd/**/*.ast" - include "src/main/jastadd/**/*.jadd" - include "src/main/jastadd/**/*.jrag" - include "src/gen/jastadd/**/*.ast" - include "src/gen/jastadd/**/*.jadd" - include "src/gen/jastadd/**/*.jrag" - } - - scanner { - include "src/main/jastadd/RelAst.flex" - } - - parser { - include "src/main/jastadd/Preamble.parser" - include "src/main/jastadd/RelAst.parser" - } - } - } - - cleanGen.doFirst { - delete "src/gen/java/org" - delete "src/gen-res/BuildInfo.properties" - } - - preprocessParser.doFirst { - - args += ["--no-beaver-symbol"] - - } - - module = "RelAst" - - astPackage = 'org.jastadd.relast.ast' - - parser.name = 'RelAstParser' - - genDir = 'src/gen/java' - - buildInfoDir = 'src/gen-res' - - scanner.genDir = "src/gen/java/org/jastadd/relast/scanner" - parser.genDir = "src/gen/java/org/jastadd/relast/parser" - - jastaddOptions = ["--lineColumnNumbers", "--List=JastAddList", "--safeLazy", "--visitCheck=true", "--rewrite=cnta", "--cache=all"] -} - -generateAst.dependsOn relast diff --git a/relast.preprocessor/src/main/jastadd/Analysis.jrag b/relast.preprocessor/src/main/jastadd/Analysis.jrag deleted file mode 100644 index 118dd2373e1fb883c829cb8867cb3d898f574e07..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/Analysis.jrag +++ /dev/null @@ -1,3 +0,0 @@ -aspect Analysis { - -} diff --git a/relast.preprocessor/src/main/jastadd/DumpTree.jrag b/relast.preprocessor/src/main/jastadd/DumpTree.jrag deleted file mode 100644 index 4dd3985dc725e1f901499589ed1d471ca7ffa0ac..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/DumpTree.jrag +++ /dev/null @@ -1,53 +0,0 @@ -aspect DumpTree { - private static final String ASTNode.DUMP_TREE_INDENT = " "; - - public String ASTNode.dumpTree() { - java.io.ByteArrayOutputStream bytes = new java.io.ByteArrayOutputStream(); - dumpTree(new java.io.PrintStream(bytes)); - return bytes.toString(); - } - - public void ASTNode.dumpTree(java.io.PrintStream out) { - dumpTree(out, ""); - out.flush(); - } - - public void ASTNode.dumpTree(java.io.PrintStream out, String indent) { - out.print(indent + getClass().getSimpleName()); - out.print(getTokens()); - String extra = extraDumpInfo(); - if (!extra.isEmpty()) { - out.print(" " + extra); - } - out.println(); - String childIndent = indent + DUMP_TREE_INDENT; - for (ASTNode<?> child : astChildren()) { - if (child == null) { - out.println(childIndent + "null"); - } else { - child.dumpTree(out, childIndent); - } - } - } - - public String ASTNode.extraDumpInfo() { return ""; } - - public String ASTNode.getTokens() { - java.util.TreeSet<java.lang.reflect.Method> methods = new java.util.TreeSet<>(java.util.Comparator.comparing(java.lang.reflect.Method::getName)); - - methods.addAll(java.util.Arrays.asList(getClass().getMethods())); - - StringBuilder result = new StringBuilder(); - for (java.lang.reflect.Method method : methods) { - ASTNodeAnnotation.Token token = method.getAnnotation(ASTNodeAnnotation.Token.class); - if (token != null) { - try { - result.append(String.format(" %s=\"%s\"", token.name(), method.invoke(this))); - } catch (IllegalAccessException ignored) { - } catch (java.lang.reflect.InvocationTargetException ignored) { - } - } - } - return result.toString(); - } -} diff --git a/relast.preprocessor/src/main/jastadd/NameResolution.jrag b/relast.preprocessor/src/main/jastadd/NameResolution.jrag deleted file mode 100644 index e96856404fce9a3a5805df5289da7b8ba6a2ab28..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/NameResolution.jrag +++ /dev/null @@ -1,30 +0,0 @@ -aspect NameResolution { - - refine RefResolverStubs eq ASTNode.globallyResolveTypeDeclByToken(String id) = program().resolveTypeDecl(id); - - syn TypeDecl Program.resolveTypeDecl(String name) { - for (TypeDecl decl : typeDecls()) { - if (decl.getName().equals(name)) { - return decl; - } - } - throw new RuntimeException("TypeDecl " + name + " could not be resolved."); - } - - refine RefResolverStubs eq ASTNode.globallyResolveTokenComponentByToken(String id) { - // return a TokenComponent. id is of the form 'type_name + "." + token_name' - int dotIndex = id.indexOf("."); - String typeName = id.substring(0, dotIndex); - String tokenName = id.substring(dotIndex + 1); - TypeDecl type = program().resolveTypeDecl(typeName); - // iterate over components and find the matching tokenComponent - for (Component comp : type.getComponentList()) { - if (comp.isTokenComponent() && comp.getName().equals(tokenName)) { - return comp.asTokenComponent(); - } - } - System.err.println("Could not resolve TokenComponent '" + id + "'."); - return null; - } - -} diff --git a/relast.preprocessor/src/main/jastadd/Navigation.jrag b/relast.preprocessor/src/main/jastadd/Navigation.jrag deleted file mode 100644 index 37078ae3adc49d4f7560748daca2f01a608fc0fc..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/Navigation.jrag +++ /dev/null @@ -1,34 +0,0 @@ -aspect Navigation { - - // --- program --- - inh Program ASTNode.program(); - eq Program.getChild().program() = this; - - // --- typeDecls --- - coll java.util.Set<TypeDecl> Program.typeDecls() [new java.util.HashSet<>()] root Program; - TypeDecl contributes this - to Program.typeDecls() - for program(); - - // --- relations --- - coll java.util.Set<Relation> Program.relations() [new java.util.HashSet<>()] root Program; - Relation contributes this - to Program.relations() - for program(); - - // --- containingTypeDecl --- - inh TypeDecl Component.containingTypeDecl(); - eq TypeDecl.getChild().containingTypeDecl() = this; - - // --- containedFile --- - inh GrammarFile ASTNode.containedFile(); - eq GrammarFile.getChild().containedFile() = this; - - // --- isTokenComponent --- - syn boolean Component.isTokenComponent() = false; - eq TokenComponent.isTokenComponent() = true; - - // --- asTokenComponent --- - syn TokenComponent Component.asTokenComponent() = null; - eq TokenComponent.asTokenComponent() = this; -} diff --git a/relast.preprocessor/src/main/jastadd/Preamble.parser b/relast.preprocessor/src/main/jastadd/Preamble.parser deleted file mode 100644 index 0b3c902916851e76b50a47bc9bfbc18ec721a9d9..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/Preamble.parser +++ /dev/null @@ -1,6 +0,0 @@ -%header {: -package org.jastadd.relast.parser; -import org.jastadd.relast.ast.*; -:}; - -%goal goal; diff --git a/relast.preprocessor/src/main/jastadd/RelAst.flex b/relast.preprocessor/src/main/jastadd/RelAst.flex deleted file mode 100644 index f9595e97eb97245cf1c500c46c135996a33b918c..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/RelAst.flex +++ /dev/null @@ -1,72 +0,0 @@ -package org.jastadd.relast.scanner; - -import org.jastadd.relast.parser.RelAstParser.Terminals; - -%% - -%public -%final -%class RelAstScanner -%extends beaver.Scanner - -%type beaver.Symbol -%function nextToken -%yylexthrow beaver.Scanner.Exception -%scanerror RelAstScanner.ScannerError - -%line -%column -%{ - private StringBuilder stringLitSb = new StringBuilder(); - - private beaver.Symbol sym(short id) { - return new beaver.Symbol(id, yyline + 1, yycolumn + 1, yylength(), yytext()); - } - - private beaver.Symbol sym(short id, String text) { - return new beaver.Symbol(id, yyline + 1, yycolumn + 1, yylength(), text); - } - - - public static class ScannerError extends Error { - public ScannerError(String message) { - super(message); - } - } -%} - -WhiteSpace = [ ] | \t | \f | \n | \r | \r\n -TraditionalComment = [/][*][^*]*[*]+([^*/][^*]*[*]+)*[/] -EndOfLineComment = "//" [^\n\r]* -Comment = {TraditionalComment} | {EndOfLineComment} - -ID = [a-zA-Z$_][a-zA-Z0-9$_]* - -%% -{WhiteSpace} { /* ignore */ } -{Comment} { return sym(Terminals.COMMENT); } - -"abstract" { return sym(Terminals.ABSTRACT); } -"rel" { return sym(Terminals.RELATION); } - -";" { return sym(Terminals.SCOL); } -":" { return sym(Terminals.COL); } -"::=" { return sym(Terminals.ASSIGN); } -"*" { return sym(Terminals.STAR); } -"." { return sym(Terminals.DOT); } -"," { return sym(Terminals.COMMA); } -"<" { return sym(Terminals.LT); } -">" { return sym(Terminals.GT); } -"[" { return sym(Terminals.LBRACKET); } -"]" { return sym(Terminals.RBRACKET); } -"/" { return sym(Terminals.SLASH); } -"?" { return sym(Terminals.QUESTION_MARK); } -"->" { return sym(Terminals.RIGHT); } -"<-" { return sym(Terminals.LEFT); } -"<->" { return sym(Terminals.BIDIRECTIONAL); } - -// ID -{ID} { return sym(Terminals.ID); } -<<EOF>> { return sym(Terminals.EOF); } - -[^] { throw new ScannerError((yyline+1) +"," + (yycolumn+1) + ": Illegal character <"+yytext()+">"); } diff --git a/relast.preprocessor/src/main/jastadd/RelAst.parser b/relast.preprocessor/src/main/jastadd/RelAst.parser deleted file mode 100644 index f94fbef474825bbd669f89ce070b2ce8fc406c72..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/RelAst.parser +++ /dev/null @@ -1,218 +0,0 @@ -GrammarFile goal - = declaration.d goal.p {: p.getDeclarationList().insertChild(d, 0); return p; :} - | {: return new GrammarFile(); :} -; - -Declaration declaration - = type_decl - | relation - | comment -; - -Comment comment - = COMMENT {: return new Comment(COMMENT); :}; - -TypeDecl type_decl - = ID components_opt.c SCOL - {: - TypeDecl result = new TypeDecl(); - result.setName(ID); - result.setAbstract(false); - result.setComponentList(c); - return result; - :} - | ID COL ID.s components_opt.c SCOL - {: - TypeDecl result = new TypeDecl(); - result.setName(ID); - result.setAbstract(false); - result.setSuperType(TypeDecl.createRef(s)); - result.setComponentList(c); - return result; - :} - | ABSTRACT ID components_opt.c SCOL - {: - TypeDecl result = new TypeDecl(); - result.setName(ID); - result.setAbstract(true); - result.setComponentList(c); - return result; - :} - | ABSTRACT ID COL ID.s components_opt.c SCOL - {: - TypeDecl result = new TypeDecl(); - result.setName(ID); - result.setAbstract(true); - result.setSuperType(TypeDecl.createRef(s)); - result.setComponentList(c); - return result; - :} -; - -JastAddList components_opt - = /* empty */ {: return new JastAddList(); :} - | ASSIGN components.l {: return l; :} -; - -JastAddList components - = /* empty */ {: return new JastAddList(); :} - | components.l component.c {: return l.add(c); :} -; - -Component component - = SLASH actual_component.c SLASH - {: - c.setNTA(true); - return c; - :} - | actual_component -; - -Component actual_component - = ID.name COL ID.type STAR - {: - ListComponent result = new ListComponent(); - result.setName(name); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | ID.name COL ID.type - {: - NormalComponent result = new NormalComponent(); - result.setName(name); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | ID.type STAR - {: - ListComponent result = new ListComponent(); - result.setName(type); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | ID.type - {: - NormalComponent result = new NormalComponent(); - result.setName(type); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | LBRACKET ID.name COL ID.type RBRACKET - {: - OptComponent result = new OptComponent(); - result.setName(name); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | LBRACKET ID.type RBRACKET - {: - OptComponent result = new OptComponent(); - result.setName(type); - result.setTypeDecl(TypeDecl.createRef(type)); - return result; - :} - | LT ID.name COL java_type_use.type GT - {: - TokenComponent result = new TokenComponent(); - result.setName(name); - result.setJavaTypeUse(type); - return result; - :} - | LT ID.type GT - {: - TokenComponent result = new TokenComponent(); - result.setName(type); - result.setJavaTypeUse(new SimpleJavaTypeUse(type)); - return result; - :} -; - - -JavaTypeUse java_type_use - = parameterized_java_type_use - | simple_java_type_use -; - -ArrayList qualified_name - = ID - | qualified_name DOT ID -; - - -JastAddList java_type_use_list - = java_type_use.u {: return new JastAddList().add(u); :} - | java_type_use_list.l COMMA java_type_use.u {: return l.add(u); :} -; - -SimpleJavaTypeUse simple_java_type_use - = qualified_name.n - {: - return new SimpleJavaTypeUse((String)n.stream().map( x -> ((Symbol)x).value.toString()).collect(java.util.stream.Collectors.joining("."))); - :} -; - -ParameterizedJavaTypeUse parameterized_java_type_use - = simple_java_type_use.i LT java_type_use_list.l GT - {: - return new ParameterizedJavaTypeUse(i.getName(), l); - :} -; - -Relation relation - = RELATION unnamed_role.a LEFT navigable_role.b SCOL - {: - LeftDirectedRelation result = new LeftDirectedRelation(); - result.setSource(b); - result.setTarget(a); - return result; - :} - | RELATION navigable_role.a RIGHT unnamed_role.b SCOL - {: - RightDirectedRelation result = new RightDirectedRelation(); - result.setSource(a); - result.setTarget(b); - return result; - :} - | RELATION navigable_role.a BIDIRECTIONAL navigable_role.b SCOL - {: - BidirectionalRelation result = new BidirectionalRelation(); - result.setLeft(a); - result.setRight(b); - return result; - :} -; - - -UnnamedRole unnamed_role - = ID.type - {: - UnnamedRole result = new UnnamedRole(); - result.setType(TypeDecl.createRef(type)); - return result; - :} - | navigable_role -; - -NavigableRole navigable_role - = ID.type DOT ID.name - {: - NormalRole result = new NormalRole(); - result.setName(name); - result.setType(TypeDecl.createRef(type)); - return result; - :} - | ID.type DOT ID.name STAR - {: - ListRole result = new ListRole(); - result.setName(name); - result.setType(TypeDecl.createRef(type)); - return result; - :} - | ID.type DOT ID.name QUESTION_MARK - {: - OptRole result = new OptRole(); - result.setName(name); - result.setType(TypeDecl.createRef(type)); - return result; - :} -; diff --git a/relast.preprocessor/src/main/jastadd/RelAst.relast b/relast.preprocessor/src/main/jastadd/RelAst.relast deleted file mode 100644 index 2168413aef3510a889a1a2ea3f71ea4624938f1c..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/RelAst.relast +++ /dev/null @@ -1,49 +0,0 @@ - - -Program ::= GrammarFile *; - -abstract Grammar ::= Declaration*; -GrammarFile : Grammar ::= <FileName> ; - -abstract Declaration; - -TypeDecl:Declaration ::= <Name> <Abstract:boolean> Component*; - -rel TypeDecl.SuperType? <-> TypeDecl.SubType*; - -abstract Component ::= <Name> <NTA:boolean>; -abstract TypeComponent : Component; - -rel TypeComponent.TypeDecl <-> TypeDecl.PotentialParent*; - -NormalComponent : TypeComponent; -ListComponent : TypeComponent; -OptComponent : TypeComponent; - -TokenComponent : Component ::= JavaTypeUse; - -abstract JavaTypeUse ::= <Name>; -SimpleJavaTypeUse : JavaTypeUse; -ParameterizedJavaTypeUse : JavaTypeUse ::= JavaTypeUse*; - -abstract Relation : Declaration; -// rel Source.Name -> Target; -// rel Target <- Source.Name; -abstract DirectedRelation : Relation ::= Source:NavigableRole Target:UnnamedRole ; -LeftDirectedRelation : DirectedRelation; -RightDirectedRelation : DirectedRelation; -// rel Left.LeftName <-> Right.RightName; -BidirectionalRelation : Relation ::= Left:NavigableRole Right:NavigableRole ; - -abstract Role; -abstract NavigableRole : Role ::= <Name>; -NormalRole : NavigableRole; -ListRole : NavigableRole; -OptRole : NavigableRole; - -UnnamedRole : Role ; - -rel Role.Type <-> TypeDecl.Role*; - -// comments -Comment : Declaration ::= <Text>; diff --git a/relast.preprocessor/src/main/jastadd/backend/AbstractGrammar.jadd b/relast.preprocessor/src/main/jastadd/backend/AbstractGrammar.jadd deleted file mode 100644 index 870132c2cf4fa0fa6e7ec75759ec39f72872fa3c..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/jastadd/backend/AbstractGrammar.jadd +++ /dev/null @@ -1,170 +0,0 @@ -aspect BackendAbstractGrammar { - - public static String ASTNode.listInterface = "java.util.List"; - public static String ASTNode.listClass = "java.util.ArrayList"; - public static String ASTNode.jastAddListType = "List"; - public static String ASTNode.jastAddOptType = "Opt"; - - public String Program.generateAbstractGrammar() { - StringBuilder sb = new StringBuilder(); - generateAbstractGrammar(sb); - return sb.toString(); - } - - public void Program.generateAbstractGrammar(StringBuilder b) { - for (GrammarFile file : getGrammarFileList()) { - file.generateAbstractGrammar(b); - } - } - - public String GrammarFile.generateAbstractGrammar() { - StringBuilder sb = new StringBuilder(); - generateAbstractGrammar(sb); - return sb.toString(); - } - - public void Grammar.generateAbstractGrammar(StringBuilder b) { - for (Declaration decl : getDeclarationList()) { - decl.generateAbstractGrammar(b); - } - } - - abstract public void Declaration.generateAbstractGrammar(StringBuilder b); - - public void Comment.generateAbstractGrammar(StringBuilder b) { - b.append(getText()).append("\n"); - } - - public void TypeDecl.generateAbstractGrammar(StringBuilder b) { - if (getAbstract()) { - b.append("abstract "); - } - b.append(getName()).append(" "); - if (hasSuperType()) { - b.append(": ").append(getSuperType().getName()).append(" "); - } - b.append("::="); - for (Component component : getComponentList()) { - b.append(" "); - component.generateAbstractGrammar(b); - } - b.append(";\n"); - } - - public abstract void Component.generateAbstractGrammar(StringBuilder b); - - public void NormalComponent.generateAbstractGrammar(StringBuilder b) { - if (getNTA()) { - b.append("/"); - } - - if (!getName().equals("")) { - b.append(getName()).append(":"); - } - b.append(getTypeDecl().getName()); - if (getNTA()) { - b.append("/"); - } - } - - public void ListComponent.generateAbstractGrammar(StringBuilder b) { - if (getNTA()) { - b.append("/"); - } - - if (!getName().equals("")) { - b.append(getName()).append(":"); - } - b.append(getTypeDecl().getName()).append("*"); - if (getNTA()) { - b.append("/"); - } - } - - public void OptComponent.generateAbstractGrammar(StringBuilder b) { - if (getNTA()) { - b.append("/"); - } - b.append("["); - if (!getName().equals("")) { - b.append(getName()).append(":"); - } - b.append(getTypeDecl().getName()).append("]"); - if (getNTA()) { - b.append("/"); - } - } - - public void TokenComponent.generateAbstractGrammar(StringBuilder b) { - if (getNTA()) { - b.append("/"); - } - b.append("<"); - if (!getName().equals("")) { - b.append(getName()).append(":"); - } - getJavaTypeUse().generateAbstractGrammar(b); - b.append(">"); - if (getNTA()) { - b.append("/"); - } - } - - abstract public void JavaTypeUse.generateAbstractGrammar(StringBuilder b); - - public void SimpleJavaTypeUse.generateAbstractGrammar(StringBuilder b) { - b.append(getName()); - } - - public void ParameterizedJavaTypeUse.generateAbstractGrammar(StringBuilder b) { - b.append("<"); - boolean first = true; - for (JavaTypeUse javaTypeUse : getJavaTypeUseList()) { - if (first) { - first = false; - } else { - b.append(", "); - } - javaTypeUse.generateAbstractGrammar(b); - } - b.append(">"); - } - - abstract public void Relation.generateAbstractGrammar(StringBuilder b); - - public void DirectedRelation.generateAbstractGrammar(StringBuilder b) { - b.append("rel "); - getSource().generateAbstractGrammar(b); - b.append(" -> "); - getTarget().generateAbstractGrammar(b); - b.append(";\n"); - } - - public void BidirectionalRelation.generateAbstractGrammar(StringBuilder b) { - b.append("rel "); - getLeft().generateAbstractGrammar(b); - b.append(" <-> "); - getRight().generateAbstractGrammar(b); - b.append(";\n"); - } - - abstract public void Role.generateAbstractGrammar(StringBuilder b); - - public void NormalRole.generateAbstractGrammar(StringBuilder b) { - b.append(getType().getName()).append(".").append(getName()); - } - - public void ListRole.generateAbstractGrammar(StringBuilder b) { - b.append(getType().getName()).append(".").append(getName()).append("*"); - } - - public void OptRole.generateAbstractGrammar(StringBuilder b) { - b.append(getType().getName()).append(".").append(getName()).append("?"); - } - - public void UnnamedRole.generateAbstractGrammar(StringBuilder b) { - b.append(getType().getName()); - } - - -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Compiler.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Compiler.java deleted file mode 100644 index efdda319429884637beac1ff15b655a91d4cd4c6..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Compiler.java +++ /dev/null @@ -1,165 +0,0 @@ -package org.jastadd.relast.compiler; - -import beaver.Parser; -import org.jastadd.relast.ast.GrammarFile; -import org.jastadd.relast.ast.Program; -import org.jastadd.relast.compiler.options.CommandLine; -import org.jastadd.relast.compiler.options.CommandLine.CommandLineException; -import org.jastadd.relast.compiler.options.Option; -import org.jastadd.relast.compiler.options.StringOption; -import org.jastadd.relast.parser.RelAstParser; -import org.jastadd.relast.scanner.RelAstScanner; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.PrintWriter; -import java.nio.file.DirectoryStream; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; - -public class Compiler { - - private StringOption optionOutputDir; - private StringOption optionInputDir; - - private ArrayList<Option<?>> options; - private CommandLine commandLine; - - public Compiler() { - options = new ArrayList<>(); - addOptions(); - } - - public static void main(String[] args) { - try { - new Compiler().run(args); - } catch (CommandLineException | CompilerException e) { - System.err.println(e.getMessage()); - System.exit(-1); - } - } - - public int run(String[] args) throws CommandLineException, CompilerException { - options = new ArrayList<>(); - addOptions(); - commandLine = new CommandLine(options); - commandLine.parse(args); - - Path inputPath; - if (optionInputDir.isSet()) { - inputPath = Paths.get(optionInputDir.getValue()); - } else { - inputPath = Paths.get("."); - printMessage("No input dir is set. Assuming current directory '" + inputPath.toAbsolutePath().toString() + "'."); - } - - if (!inputPath.toFile().exists()) { - printMessage("Input path '" + inputPath.toAbsolutePath().toString() + "' does not exist. Exiting..."); - System.exit(-1); - } else if (!inputPath.toFile().isDirectory()) { - printMessage("Input path '" + inputPath.toAbsolutePath().toString() + "' is not a directory. Exiting..."); - System.exit(-1); - } - - Path outputPath; // should not be used, but otherwise there is a compiler warning - if (optionOutputDir.isSet()) { - outputPath = Paths.get(optionOutputDir.getValue()); - } else { - outputPath = Paths.get("./gen/"); - printMessage("No output dir is set. Assuming '" + outputPath.toAbsolutePath().toString() + "'."); - } - - if (outputPath.toFile().exists() && !outputPath.toFile().isDirectory()) { - printMessage("Output path '" + inputPath.toAbsolutePath().toString() + "' exists, but is not a directory. Exiting..."); - } - - printMessage("Running RelAST Preprocessor"); - - List<String> otherArgs = commandLine.getArguments(); - if (!otherArgs.isEmpty()) { - printMessage("Unsupported arguments will be ignored: " + otherArgs); - } - - Program program = parseProgram(inputPath); - - printMessage("Writing output files"); - - for (GrammarFile grammarFile : program.getGrammarFileList()) { - // TODO decide and document what the file name should be, the full path or a simple name? - writeToFile(outputPath + grammarFile.getFileName() + "/Grammar.relast", grammarFile.generateAbstractGrammar()); - } - - writeToFile(outputPath + "/Grammar.relast", program.generateAbstractGrammar()); - return 0; - } - - private void printMessage(String message) { - System.out.println(message); - } - - private void writeToFile(String filename, String str) throws CompilerException { - try { - PrintWriter writer = new PrintWriter(filename); - writer.print(str); - writer.close(); - } catch (Exception e) { - throw new CompilerException("Could not write to file " + filename, e); - } - } - - private void addOptions() { - optionOutputDir = addOption(new StringOption("outputDir", "target directory for the generated files.")); - optionInputDir = addOption(new StringOption("inputDir", "input directory.")); - } - - private <OptionType extends Option<?>> OptionType addOption(OptionType option) { - options.add(option); - return option; - } - - private Program parseProgram(Path inputPath) throws CompilerException { - Program program = new Program(); - - try (DirectoryStream<Path> stream = Files.newDirectoryStream(inputPath, "*.relast")) { - RelAstParser parser = new RelAstParser(); - stream.forEach(path -> { - try (BufferedReader reader = Files.newBufferedReader(path)) { - RelAstScanner scanner = new RelAstScanner(reader); - GrammarFile inputGrammar = (GrammarFile) parser.parse(scanner); - inputGrammar.dumpTree(System.out); - program.addGrammarFile(inputGrammar); - inputGrammar.treeResolveAll(); - } catch (IOException | Parser.Exception e) { - printMessage("Could not parse grammar file " + path); - e.printStackTrace(); - } - }); - } catch (IOException e) { - printMessage("Unable to iterate over input path '" + inputPath.toAbsolutePath().toString() + "'. Exiting..."); - e.printStackTrace(); - System.exit(-1); - } - - - return program; - } - - protected int error(String message) { - System.err.println("Error: " + message); - System.err.println(); - System.err.println("Usage: java -jar relast.jar [--option1] [--option2=value] ... <filename1> <filename2> ... "); - System.err.println("Options:"); - System.err.print(commandLine.printOptionHelp()); - return 1; - } - - public static class CompilerException extends Exception { - CompilerException(String message, Throwable cause) { - super(message, cause); - } - } -} - diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Utils.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Utils.java deleted file mode 100644 index 8e2ef0c8bcb8266fe5789b2608f4a6f78c47548a..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/Utils.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jastadd.relast.compiler; - -import java.util.*; -import java.util.function.Predicate; - -import static java.util.stream.Collectors.toList; - -public class Utils { - public static <T> List<T> filterToList(Collection<T> collection, Predicate<T> predicate) { - return collection.stream().filter(predicate).collect(toList()); - } - - public static <T> Set<T> asSet(T... t) { - return new HashSet<T>(Arrays.asList(t)); - } -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/CommandLine.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/CommandLine.java deleted file mode 100644 index c3f02bf56d4fb4c779e489cfaa7fb150c6ea68cb..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/CommandLine.java +++ /dev/null @@ -1,97 +0,0 @@ -package org.jastadd.relast.compiler.options; - -import java.util.*; - -public class CommandLine { - private final Collection<Option<?>> options; - private final Map<String, Option<?>> mapping; - private final List<String> arguments; - - public CommandLine(Collection<Option<?>> options) { - this.options = options; - this.mapping = new HashMap<>(); - for (Option<?> option : options) { - mapping.put(option.getName(), option); - } - this.arguments = new ArrayList<>(); - } - - public void parse(String[] args) throws CommandLineException { - int i = 0; - while (i < args.length) { - if (args[i].startsWith(Option.PREFIX)) { - int argumentIndex = args[i].indexOf("="); - String name; - String argument = null; - if (argumentIndex > 0) { - name = args[i].substring(2, argumentIndex); - argument = args[i].substring(argumentIndex + 1); - } else { - name = args[i].substring(2); - } - Option<?> option = mapping.get(name); - if (option == null) { - throw new CommandLineException("Option " + Option.PREFIX + name + " not found"); - } - match(option, argument); - } else { - arguments.add(args[i]); - } - i++; - } - } - - public void match(Option<?> option, String argument) throws CommandLineException { - try { - switch (option.hasArgument()) { - case NO: - if (argument == null) { - option.match(null); - } else { - throw new CommandLineException("Option " + option + " is not allowed to have an argument"); - } - break; - case OPTIONAL: - option.match(argument); - break; - case YES: - if (argument != null) { - option.match(argument); - } else { - throw new CommandLineException("Option " + option + " requires an argument"); - } - break; - } - } catch (Option.IllegalMatchException e) { - throw new CommandLineException("Invalid value for option " + option + ": " + e.getMessage()); - } - } - - public List<String> getArguments() { - return arguments; - } - - public String printOptionHelp() { - StringBuilder sb = new StringBuilder(); - int longestOption = 0; - for (Option<?> option : options) { - if (longestOption < option.getName().length()) { - longestOption = option.getName().length(); - } - } - for (Option<?> option : new TreeSet<>(options)) { - String s = String.format(" %s%-" + (longestOption + 6) + "s %s%n", - Option.PREFIX, option.getName(), option.getDescription()); - sb.append(s); - } - return sb.toString(); - } - - public static class CommandLineException extends Exception { - private static final long serialVersionUID = 1L; - - public CommandLineException(String message) { - super(message); - } - } -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/EnumOption.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/EnumOption.java deleted file mode 100644 index 92b5149a9c3d36cf2053f0a7d0a2cadfd52129ec..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/EnumOption.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.relast.compiler.options; - -import java.util.Collection; -import java.util.TreeSet; - -public class EnumOption extends Option<String> { - private final TreeSet<String> allowedValues; - private final String defaultValue; - private String value; - private boolean isSet; - - public EnumOption(String name, String description, Collection<String> allowedValues, String defaultValue) { - super(name, description); - this.allowedValues = new TreeSet<>(allowedValues); - this.defaultValue = defaultValue; - this.value = defaultValue; - this.isSet = false; - } - - public boolean addAllowedValue(String allowedValue) { - return allowedValues.add(allowedValue); - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.OPTIONAL; - } - - @Override - public void match(String argument) throws IllegalMatchException { - if (argument == null) { - isSet = true; - value = defaultValue; - } else if (allowedValues.contains(argument)) { - isSet = true; - value = argument; - } else { - throw new IllegalMatchException(argument - + " is not allowed, allowed values are " + allowedValues); - } - } - - @Override - public boolean isSet() { - return isSet; - } - - @Override - public String getDescription() { - String allowedValuesStr = allowedValues.toString(); - allowedValuesStr = allowedValuesStr.substring(1); - allowedValuesStr = allowedValuesStr.substring(0, allowedValuesStr.length() - 1); - return super.getDescription() + " (allowed values: " + allowedValuesStr + ")"; - } -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/FlagOption.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/FlagOption.java deleted file mode 100644 index 80c2f0cb0313cc05ca9b05795fc3acc3ebd5d849..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/FlagOption.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.jastadd.relast.compiler.options; - -public class FlagOption extends Option<Boolean> { - private boolean value; - - public FlagOption(String name, String description) { - super(name, description); - value = false; - } - - @Override - public Boolean getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.NO; - } - - @Override - public void match(String string) throws IllegalMatchException { - value = true; - } - - @Override - public boolean isSet() { - return getValue(); - } -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/Option.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/Option.java deleted file mode 100644 index e20354e973e5ec11568041291242c2699ec0ab4d..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/Option.java +++ /dev/null @@ -1,60 +0,0 @@ -package org.jastadd.relast.compiler.options; - -abstract public class Option<ValueType> implements Comparable<Option<?>> { - public final static String PREFIX = "--"; - private final String name; - private final String description; - - public Option(String name, String description) { - this.name = name; - this.description = description; - } - - public String getName() { - return name; - } - - public String getDescription() { - return description; - } - - @Override - public int compareTo(Option<?> o) { - return name.compareTo(o.name); - } - - @Override - public boolean equals(Object other) { - if (other instanceof Option) { - return compareTo((Option<?>) other) == 0; - } - return false; - } - - @Override - public String toString() { - return PREFIX + name; - } - - abstract public boolean isSet(); - - abstract public ValueType getValue(); - - abstract public HasArgument hasArgument(); - - abstract public void match(String input) throws IllegalMatchException; - - public enum HasArgument { - NO, - OPTIONAL, - YES - } - - public static class IllegalMatchException extends Exception { - private static final long serialVersionUID = 1L; - - public IllegalMatchException(String message) { - super(message); - } - } -} diff --git a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/StringOption.java b/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/StringOption.java deleted file mode 100644 index a1298aeaadc259e5ecca3f1ffbade77de9a8315b..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/java/org/jastadd/relast/compiler/options/StringOption.java +++ /dev/null @@ -1,37 +0,0 @@ -package org.jastadd.relast.compiler.options; - -public class StringOption extends Option<String> { - private String value; - private boolean isSet; - - public StringOption(String name, String description) { - this(name, description, ""); - } - - public StringOption(String name, String description, String defaultValue) { - super(name, description); - value = defaultValue; - isSet = false; - } - - @Override - public String getValue() { - return value; - } - - @Override - public Option.HasArgument hasArgument() { - return Option.HasArgument.YES; - } - - @Override - public void match(String value) { - this.value = value; - isSet = true; - } - - @Override - public boolean isSet() { - return isSet; - } -} diff --git a/relast.preprocessor/src/main/resources/log4j2.xml b/relast.preprocessor/src/main/resources/log4j2.xml deleted file mode 100644 index 98cfd73c75df58d8598521bc10b043e214ec4ad8..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/main/resources/log4j2.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Configuration status="INFO"> - <Appenders> - <Console name="Console" target="SYSTEM_OUT"> - <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> - </Console> - </Appenders> - <Loggers> - <Root level="info"> - <AppenderRef ref="Console"/> - </Root> - </Loggers> -</Configuration> \ No newline at end of file diff --git a/relast.preprocessor/src/test/java/org/jastadd/ros2rag/tests/RelAstTest.java b/relast.preprocessor/src/test/java/org/jastadd/ros2rag/tests/RelAstTest.java deleted file mode 100644 index 85fc911d779fef34f56e6cb0802a55072e9d7fdd..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/test/java/org/jastadd/ros2rag/tests/RelAstTest.java +++ /dev/null @@ -1,43 +0,0 @@ -package org.jastadd.ros2rag.tests; - -import org.jastadd.relast.compiler.Compiler; -import org.jastadd.relast.compiler.options.CommandLine; -import org.junit.jupiter.api.Test; - -import java.io.File; -import java.nio.file.Paths; -import java.util.Objects; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -public class RelAstTest { - - void transform(String inputDir, String outputDir) throws CommandLine.CommandLineException, Compiler.CompilerException { - - System.out.println("Running test in directory '" + Paths.get(".").toAbsolutePath() + "'."); - assertTrue(Paths.get(inputDir).toFile().exists(), "input directory does not exist"); - assertTrue(Paths.get(inputDir).toFile().isDirectory(), "input directory is not a directory"); - - File outputDirFile = Paths.get(outputDir).toFile(); - if (outputDirFile.exists()) { - assertTrue(outputDirFile.isDirectory()); - if (Objects.requireNonNull(outputDirFile.list(), "Could not read output directory").length != 0) { - System.out.println("output directory is not empty!"); - } - } else { - assertTrue(outputDirFile.mkdir()); - } - - String[] args = { - "--outputDir=" + outputDir, - "--inputDir=" + inputDir - }; - - new Compiler().run(args); - } - - @Test - void transformMinimalExample() throws CommandLine.CommandLineException, Compiler.CompilerException { - transform("src/test/resources/in", "src/test/resources/out"); - } -} diff --git a/relast.preprocessor/src/test/resources/in/Example.relast b/relast.preprocessor/src/test/resources/in/Example.relast deleted file mode 100644 index aa17ad814128cf155d844e0f36f1114b1b1afa33..0000000000000000000000000000000000000000 --- a/relast.preprocessor/src/test/resources/in/Example.relast +++ /dev/null @@ -1,13 +0,0 @@ -Model ::= RobotArm ZoneModel ; - -ZoneModel ::= <Size:IntPosition> SafetyZone:Zone* ; - -Zone ::= Coordinate* ; - -RobotArm ::= Joint* EndEffector <_AttributeTestSource:int> /<_AppropriateSpeed:double>/ ; // normally this would be: <AttributeTestSource:int> ; - -Joint ::= <Name> <CurrentPosition:IntPosition> ; // normally this would be: <CurrentPosition:IntPosition> - -EndEffector : Joint; - -Coordinate ::= <Position:IntPosition> ;