I would like to generate a visitor and a pre-order traversal algorithm starting from the root node (DefaultRule). Given the simple statemachine example, i would like to have something similar to this in the end:
interface MyDslVisitor {
void visitStatemachine(Statemachine sm);
void visitEndStatemachine(Statemachine sm);
void visitState(State s);
void visitEndState(State s);
void visitTransition(Transition t);
void visitEndTransition(Transition t);
}
class MyDslPreOrderTraversal {
void traverse(Statemachine sm, MyDslVisitor visitor) {
visitor.visitStatemachine(sm);
for (State s : sm.getStates()) {
visitor.visitState(s);
for (Transition t : s.getTransitions()) {
visitor.visitTransition(t);
// ...
visitor.visitEndTransition(t);
}
visitor.visitEndState(s);
}
visitor.visitEndStatemachine(sm);
}
}
Example usage of this visitor could be a pretty-printer, where each child is indented.
class PrettyPrinter implements MyDslVisitor {
int indent = 0;
void visitStatemachine(Statemachine sm) {
println(sm.getName());
}
void visitEndStatemachine(Statemachine sm) {}
void visitState(State s) {
indent += 2;
println(s.getName);
}
void visitEndState(State s) {
indent -= 2;
}
void visitTransition(Transition t) {
indent += 2;
println(t.getName());
}
void visitEndTransition(Transition t) {
indent -= 2;
}
void println(String str) {
System.out.println(Strings.repeat(" ", indent) + str);
}
}
An output would look like this:
MyStatemachine
state-A
transition A -> B
state-B
transition B -> C
transition B -> A
state-C
transition C -> A
I tried to come up with an overly simplified example, to show where I got stuck. I looked at the generated MyDslSwitch but it won't suffice if I would like to achieve a pretty-printer such as above. (Obviously, I want to use it in a more complicated tree traversal with stacks and stuff.)
Is there any way to hook onto the mwe2 workflow and generate something similar to the MyDslSwitch?