package rationals.transformations;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import rationals.Automaton;
import rationals.NoSuchStateException;
import rationals.State;
import rationals.Transition;
/**
* Compute the kleene-star closure of an automaton.
*
* @author nono
* @version $Id: Star.java 2 2006-08-24 14:41:48Z oqube $
*/
public class Star implements UnaryTransformation {
public Automaton transform(Automaton a) {
if (a.delta().size() == 0)
return Automaton.epsilonAutomaton();
Automaton b = new Automaton();
State ni = b.addState(true, true);
State nt = b.addState(true, true);
Map map = new HashMap();
Iterator i = a.states().iterator();
while (i.hasNext()) {
map.put(i.next(), b.addState(false, false));
}
i = a.delta().iterator();
while (i.hasNext()) {
Transition t = (Transition) i.next();
try {
b.addTransition(new Transition((State) map.get(t.start()), t
.label(), (State) map.get(t.end())));
} catch (NoSuchStateException x) {
}
if (t.start().isInitial() && t.end().isTerminal()) {
try {
b.addTransition(new Transition(ni, t.label(), nt));
b.addTransition(new Transition(nt, t.label(), ni));
} catch (NoSuchStateException x) {
}
} else if (t.start().isInitial()) {
try {
b.addTransition(new Transition(ni, t.label(), (State) map
.get(t.end())));
b.addTransition(new Transition(nt, t.label(), (State) map
.get(t.end())));
} catch (NoSuchStateException x) {
}
} else if (t.end().isTerminal()) {
try {
b.addTransition(new Transition((State) map.get(t.start()),
t.label(), nt));
b.addTransition(new Transition((State) map.get(t.start()),
t.label(), ni));
} catch (NoSuchStateException x) {
}
}
}
return b;
}
}