package project.nfa;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
/**
* An NFA State.
*
* @author toriscope
*/
public class State {
public String name;
public boolean isFinal;
private final Set<Transition> transitions;
/**
* Create an NFA State
*
* @param name name of the state
* @param isFinal is the state an end state?
*/
public State(final String name, final boolean isFinal) {
this.name = name;
this.isFinal = isFinal;
this.transitions = new HashSet<Transition>();
}
/**
* Factory method for new state
*
* @param name
* @param isFinal
* @return State object
*/
public static State createState(final String name, final boolean isFinal) {
return new State(name, isFinal);
}
public String getName() {
return name;
}
/**
* Is the state an end state?
*
* @return true if final state, false otherwise.
*/
public boolean isFinal() {
return this.isFinal;
}
public Set<Transition> getTransitions() {
return this.transitions;
}
public Transition getTransByString(String string) {
for (Transition transition : transitions) {
if (!transition.isEmptyTransition() && string.equals(transition.getString())) {
return transition;
}
}
return null;
}
public List<Transition> getNonEmptyTransitions() {
List<Transition> t = new LinkedList<Transition>();
for (Transition transition : transitions) {
if (!transition.isEmptyTransition()) {
t.add(transition);
}
}
return t;
}
public List<Transition> getEmptyTransitions() {
List<Transition> t = new LinkedList<Transition>();
for (Transition transition : transitions) {
if (transition.isEmptyTransition()) {
t.add(transition);
}
}
return t;
}
public void addTransition(final Transition... t) {
for (Transition tr : t) {
if (!transitions.contains(t))
transitions.add(tr);
}
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("[").append(name).append("]").append(isFinal() ? "*" : "").append(" ");
for (Transition tr : this.transitions) {
b.append("{").append(tr.toString()).append("}");
}
return b.toString();
}
}