Skip to content
Snippets Groups Projects
Commit 404e5c0b authored by René Schöne's avatar René Schöne
Browse files

Telephone example and transformation to dot.

parent d7cc25e1
No related branches found
No related tags found
No related merge requests found
...@@ -46,9 +46,6 @@ dependencies { ...@@ -46,9 +46,6 @@ dependencies {
run { run {
mainClassName = 'de.tudresden.inf.st.statemachine.Main' mainClassName = 'de.tudresden.inf.st.statemachine.Main'
standardInput = System.in standardInput = System.in
if (project.hasProperty("appArgs")) {
args Eval.me(appArgs)
}
} }
buildscript { buildscript {
......
aspect Analysis { aspect Analysis {
syn Map<String, State> StateMachine.stateMap() { syn Set<State> State.reachableWithin(int n) { //circular [new HashSet<>()]
Map<String, State> map = new HashMap<>(); if (n == 0) {
for (State s : states()) { return new HashSet<>();
map.put(s.getLabel(), s);
} }
return map; Set<State> result = new HashSet<>();
for (State succ : successors()) {
result.add(succ);
result.addAll(succ.reachableWithin(n - 1));
}
return result;
} }
syn Map<String, Transition> StateMachine.transitionMap() { public void StateMachine.printSomeAnalysis() {
Map<String, Transition> map = new HashMap<>(); // analysis
for (Transition t : transitions()) { Set<Set<State>> sccs = this.SCC();
map.put(t.getLabel(), t); System.out.println("SCCs found:");
for (Set<State> scc : sccs) {
System.out.println(scc);
} }
return map;
}
syn StateMachine ASTNode.root(); for (State s : this.states()) {
eq StateMachine.root() = this; System.out.println(s + ".successors() = " + s.successors());
eq ASTNode.root() = getParent().root(); }
refine RefResolverStubs eq ASTNode.globallyResolveStateByToken(String id) { Set<State> current;
return root().stateMap().get(id); int lastSize = 0;
} for (int i = 1; i < this.states().size() + 1; i++) {
current = this.getInitial().reachableWithin(i);
if (current.size() == lastSize) {
break;
}
System.out.println(this.getInitial() + ".reachableWithin(" + i + ") = " + current);
lastSize = current.size();
}
refine RefResolverStubs eq ASTNode.globallyResolveTransitionByToken(String id) { for (State finalState : this.getFinalList()) {
return root().transitionMap().get(id); System.out.println("initial state "+ this.getInitial() + " can reach " + finalState + " = " +
this.getInitial().reachableWithin(this.states().size()).contains(finalState));
}
} }
syn boolean State.isInitial() = root().getInitial().equals(this);
syn boolean State.isFinal() = root().getFinalList().contains(this);
} }
aspect NameAnalysis {
syn Map<String, State> StateMachine.stateMap() {
Map<String, State> map = new HashMap<>();
for (State s : states()) {
map.put(s.getLabel(), s);
}
return map;
}
syn Map<String, Transition> StateMachine.transitionMap() {
Map<String, Transition> map = new HashMap<>();
for (Transition t : transitions()) {
map.put(t.getLabel(), t);
}
return map;
}
refine RefResolverStubs eq ASTNode.globallyResolveStateByToken(String id) {
return root().stateMap().get(id);
}
refine RefResolverStubs eq ASTNode.globallyResolveTransitionByToken(String id) {
return root().transitionMap().get(id);
}
}
...@@ -31,4 +31,13 @@ aspect Navigation { ...@@ -31,4 +31,13 @@ aspect Navigation {
} }
return transitions; return transitions;
} }
syn StateMachine ASTNode.root();
eq StateMachine.root() = this;
eq ASTNode.root() = getParent().root();
syn boolean State.isInitial() = root().getInitial().equals(this);
syn boolean State.isFinal() = root().getFinalList().contains(this);
syn Collection<State> State.successors() = getOutgoingList().stream().map(Transition::getTo).collect(Collectors.toList());
} }
aspect StateMachinetoDotG {
syn String StateMachine.toDot() {
StringBuilder b = new StringBuilder();
b.append("strict digraph cycles {\n");
for (State from : states()) {
b.append(" ").append(from.getLabel()).append("[label=\"").append(from.getLabel()).append("\"];\n");
for (Transition out : from.getOutgoingList()) {
b.append(" ").append(from.getLabel()).append(" -> ").append(out.getTo().getLabel())
.append("[label=\"").append(out.getLabel()).append("\"];\n");
}
}
b.append("}\n");
return b.toString();
}
}
package de.tudresden.inf.st.statemachine; package de.tudresden.inf.st.statemachine;
import beaver.Parser; import beaver.Parser;
import de.tudresden.inf.st.statemachine.jastadd.model.DotGraph;
import de.tudresden.inf.st.statemachine.jastadd.model.State; 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.StateMachine;
import de.tudresden.inf.st.statemachine.jastadd.model.Transition; import de.tudresden.inf.st.statemachine.jastadd.model.Transition;
...@@ -21,7 +22,7 @@ public class Main { ...@@ -21,7 +22,7 @@ public class Main {
// ^ | // ^ |
// \ / // \ /
// `---- 2 ----* // `---- 2 ----*
StateMachine statemachine = new StateMachine(); StateMachine stateMachine = new StateMachine();
State start = new State(); State start = new State();
start.setLabel("S"); start.setLabel("S");
State stateB = new State(); State stateB = new State();
...@@ -40,24 +41,26 @@ public class Main { ...@@ -40,24 +41,26 @@ public class Main {
t2.setTo(start); t2.setTo(start);
t3.setFrom(stateB); t3.setFrom(stateB);
t3.setTo(end); t3.setTo(end);
statemachine.addElement(start); stateMachine.addElement(start);
statemachine.addElement(stateB); stateMachine.addElement(stateB);
statemachine.addElement(end); stateMachine.addElement(end);
statemachine.setInitial(start); stateMachine.addElement(t1);
statemachine.addFinal(end); stateMachine.addElement(t2);
stateMachine.addElement(t3);
stateMachine.setInitial(start);
stateMachine.addFinal(end);
// reachability analysis System.out.println(stateMachine.prettyPrint());
Set<Set<State>> sccs = statemachine.SCC(); stateMachine.printSomeAnalysis();
System.out.println("SCCs found:"); DrAST_root_node = stateMachine;
for (Set<State> scc : sccs) {
System.out.println(scc);
}
DrAST_root_node = statemachine;
} else { } else {
// load the file given as first argument // load the file given as first argument
try { try {
StateMachine stateMachine = ParserUtils.load(Paths.get(args[0])); StateMachine stateMachine = ParserUtils.load(Paths.get(args[0]));
stateMachine.treeResolveAll(); stateMachine.treeResolveAll();
stateMachine.printSomeAnalysis();
System.out.println("> toDotGraph():");
System.out.println(stateMachine.toDot());
DrAST_root_node = stateMachine; DrAST_root_node = stateMachine;
} catch (IOException | Parser.Exception e) { } catch (IOException | Parser.Exception e) {
e.printStackTrace(); e.printStackTrace();
......
initial state start;
state onHook;
state dialing;
state ringing;
state waitingForConnection;
state communicating;
state onHold;
final state end;
trans start -> onHook : start ;
trans onHook -> dialing : startDialing ;
trans dialing -> onHook : hangUp ;
trans onHook -> ringing : incomingCall ;
trans ringing -> onHook : otherPartyHangUp ;
trans dialing -> waitingForConnection : completeNumber ;
trans waitingForConnection -> onHook : hangUp ;
trans waitingForConnection -> onHook : timeOut ;
trans waitingForConnection -> communicating : otherPartyPickUp ;
trans ringing -> communicating : pickUp ;
trans communicating -> onHook : hangUp ;
trans communicating -> onHold : putOnHold ;
trans onHold -> communicating : takeOffHold ;
trans communicating -> end : otherPartyHangUp ;
trans onHold -> end : otherPartyHangUp ;
trans onHold -> end : hangUp ;
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment