diff --git a/statemachine.solution/build.gradle b/statemachine.solution/build.gradle index c3cd01ee142c60cbdb00f3729ac19b3149638097..4fb46120bd6bdc2271d6b377df225f6797e98a4c 100644 --- a/statemachine.solution/build.gradle +++ b/statemachine.solution/build.gradle @@ -24,7 +24,7 @@ sourceSets.main.java.srcDir genSrc jar { from { sourceSets.main.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) } } - manifest.attributes('Main-Class': 'de.tudresden.inf.st.statemachine.Main') + manifest.attributes('Main-Class': 'de.tudresden.inf.st.statemachine.BankMain') } dependencies { @@ -38,15 +38,15 @@ dependencies { // Default run configuration run { - mainClassName = 'de.tudresden.inf.st.statemachine.Main' + mainClassName = 'de.tudresden.inf.st.statemachine.BankMain' } // Generated files -def ecoreFile = "./src/main/resources/StateMachine.relast" -def relastFile = "./src/gen/jastadd/StateMachine.relast" +def roleragFile = "./src/main/resources/Bank.relast" +def relastFile = "./src/gen/jastadd/Bank.relast" // First phase: Ecore -> RelAst -task ecoreToRelast(type: JavaExec) { +task roleragToRelast(type: JavaExec) { group = 'Build' main = "-jar" @@ -58,9 +58,9 @@ task ecoreToRelast(type: JavaExec) { //args "../libs/ecore2relast-0.1.jar", ecoreFile, relastFile args "../libs/RoleRag-0.2.0.jar", "--inputBaseDir=src/main/resources", - "--outputBaseDir=src/gen/jastadd", "StateMachine.relast" + "--outputBaseDir=src/gen/jastadd", "Bank.relast" - inputs.files file(ecoreFile) + inputs.files file(roleragFile) outputs.files file(relastFile) } @@ -93,7 +93,7 @@ task relastToJastAdd(type: JavaExec) { main = "-jar" args "../libs/relast.jar", - "--grammarName=./src/gen/jastadd/StateMachine", + "--grammarName=./src/gen/jastadd/Bank", "--useJastAddNames", "--listClass=ArrayList", "--jastAddList=JastAddList", @@ -102,14 +102,14 @@ task relastToJastAdd(type: JavaExec) { relastFile inputs.files relastFile - outputs.files file("./src/gen/jastadd/StateMachine.ast"), file("./src/gen/jastadd/StateMachine.jadd") + outputs.files file("./src/gen/jastadd/Bank.ast"), file("./src/gen/jastadd/Bank.jadd") } // Third phase: JastAdd -> Java (using JastAdd Gradle plugin) jastadd { configureModuleBuild() modules { - module("statemachine") { + module("bank") { java { basedir "src/" @@ -128,11 +128,11 @@ jastadd { } scanner { - include "src/main/jastadd/StateMachineScanner.flex" + include "src/main/jastadd/BankScanner.flex" } parser { - include "src/main/jastadd/StateMachineParser.parser" + include "src/main/jastadd/BankParser.parser" } } } @@ -142,11 +142,11 @@ jastadd { delete "src/gen-res/BuildInfo.properties" } - module = "statemachine" + module = "bank" astPackage = 'de.tudresden.inf.st.statemachine.jastadd.model' - parser.name = 'StateMachineParser' + parser.name = 'BankParser' genDir = 'src/gen/java' @@ -160,7 +160,7 @@ jastadd { } // Workflow configuration for phases -relastToJastAdd.dependsOn ecoreToRelast +relastToJastAdd.dependsOn roleragToRelast generateAst.dependsOn relastToJastAdd //// always run jastadd diff --git a/statemachine.solution/src/main/jastadd/BankParser.parser b/statemachine.solution/src/main/jastadd/BankParser.parser new file mode 100644 index 0000000000000000000000000000000000000000..fcf625fceccfdd1af9270befff7332fe839a173f --- /dev/null +++ b/statemachine.solution/src/main/jastadd/BankParser.parser @@ -0,0 +1,26 @@ +%header {: +// this code is inlined before the generated parser +package de.tudresden.inf.st.statemachine.jastadd.parser; +import de.tudresden.inf.st.statemachine.jastadd.model.*; +import java.util.*; +:}; +// Documentation links: http://beaver.sourceforge.net/spec.html and https://bitbucket.org/jastadd/jastaddparser + +%embed {: + // this code is inlined in the generated parser class + State initial; + List<State> finals = new ArrayList<>(); +:}; + +%goal goal; + +// Productions with semantic actions building the JastAdd AST + +bank goal = + NAME.name + {: + Bank result = new Bank(); + result.setName(name); + return result; + :} + ; diff --git a/statemachine.solution/src/main/jastadd/BankScanner.flex b/statemachine.solution/src/main/jastadd/BankScanner.flex new file mode 100644 index 0000000000000000000000000000000000000000..dbbccf626add052a39763ae670f65b50dca2b7e9 --- /dev/null +++ b/statemachine.solution/src/main/jastadd/BankScanner.flex @@ -0,0 +1,46 @@ +package de.tudresden.inf.st.statemachine.jastadd.scanner; + +import de.tudresden.inf.st.statemachine.jastadd.parser.BankParser.Terminals; // The terminals are implicitly defined in the parser +%% +// Documentation links: https://www.jflex.de/manual.html and http://beaver.sourceforge.net/scanners.html + +// define the signature for the generated scanner +%public +%final +%class BankScanner +%extends beaver.Scanner + +// the interface between the scanner and the parser is the nextToken() method +%type beaver.Symbol +%function nextToken +%yylexthrow beaver.Scanner.Exception + +// store line and column information in the tokens +%line +%column + +// this code will be inlined in the body of the generated scanner class +%{ + private beaver.Symbol sym(short id) { + return new beaver.Symbol(id, yyline + 1, yycolumn + 1, yylength(), yytext()); + } +%} + +WhiteSpace = [ ] | \t | \f | \n | \r | \r\n +Identifier = [:jletter:][:jletterdigit:]* + +%% + +// discard whitespace information +{WhiteSpace} { } + +// token definitions +"initial" { return sym(Terminals.INITIAL); } +"final" { return sym(Terminals.FINAL); } +"state" { return sym(Terminals.STATE); } +"trans" { return sym(Terminals.TRANS); } +{Identifier} { return sym(Terminals.NAME); } +";" { return sym(Terminals.SEMI); } +":" { return sym(Terminals.COLON); } +"->" { return sym(Terminals.ARROW); } +<<EOF>> { return sym(Terminals.EOF); } diff --git a/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java b/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java new file mode 100644 index 0000000000000000000000000000000000000000..d6e16f8202012549f8544e5fd3d9b20ee1a13fe0 --- /dev/null +++ b/statemachine.solution/src/main/java/de/tudresden/inf/st/statemachine/BankMain.java @@ -0,0 +1,43 @@ +package de.tudresden.inf.st.statemachine; + +import beaver.Parser; +import de.tudresden.inf.st.jastadd.dumpAst.ast.Dumper; +//import de.tudresden.inf.st.statemachine.jastadd.model.State; +//import de.tudresden.inf.st.statemachine.jastadd.model.StateMachine; +//import de.tudresden.inf.st.statemachine.jastadd.model.Transition; +import de.tudresden.inf.st.statemachine.jastadd.model.Bank; + +import java.io.IOException; +import java.nio.file.Paths; +import java.util.Set; + +public class BankMain { + + @SuppressWarnings("WeakerAccess") + public static Object DrAST_root_node; + + public static void main(String[] args) throws IOException, Parser.Exception { + Bank bank; + if (args.length == 0) { + bank = createExample(); + } else { + // load the file given as first argument + bank = ParserUtils.load(Paths.get(args[0])); + } + + System.out.println("Bankname: " + bank.getName()); + } + + private static Bank createExample() { + // manual construction of a simple statemachine + // (S) -- e --> (B) -- 1 --> (E) + // ^ | + // \ / + // `---- 2 ----* + Bank b = new Bank(); + b.setName("Peters Bank"); + + return b; + } + +} diff --git a/statemachine.solution/src/main/resources/Bank.relast b/statemachine.solution/src/main/resources/Bank.relast new file mode 100644 index 0000000000000000000000000000000000000000..7446e71dcdada607ed03681bcb8e803755a54e2b --- /dev/null +++ b/statemachine.solution/src/main/resources/Bank.relast @@ -0,0 +1 @@ +Bank ::= <Name>; diff --git a/statemachine.solution/src/main/resources/Example.relast b/statemachine.solution/src/main/resources/Example.relast deleted file mode 100644 index 41f688a9b1d75f13fdad593bf7e606a50c6f3d5f..0000000000000000000000000000000000000000 --- a/statemachine.solution/src/main/resources/Example.relast +++ /dev/null @@ -1,9 +0,0 @@ -StateMachine ::= Element*; -abstract Element ::= <Label:String>; -State : Element ::=; -Transition : Element ::=; - -rel StateMachine.initial -> State; -rel StateMachine.final* -> State; -rel State.outgoing* <-> Transition.from; -rel State.incoming* <-> Transition.to;