package project.nfa; import java.util.HashSet; import java.util.List; /** * An NFA. * * @author toriscope */ public class NFA { private State startState; /** * Create an NFA. * * @param startState the initial state. */ public NFA(final State startState) { this.startState = startState; } public NFA(NFAUtil.NFASegment segment) { this(segment.start); } /** * Factory method of creating NFA * * @param startState * @return */ public static NFA createNFA(final State startState) { return new NFA(startState); } public State getStartState() { return this.startState; } public void setStartState(State startState) { this.startState = startState; } /** * Returns whether this NFA is a valid DFA. * * @return true if no states contain an empty transition or multiple * same-character transitions. */ public boolean isDFA() { for (final State stateTuple : NFAUtil.getAllReachableStates(startState)) { HashSet<String> chars = new HashSet<String>(); for (Transition state : stateTuple.getTransitions()) { if (state.isEmptyTransition() || chars.contains(state.getString())) { return false; } chars.add(state.getString()); } } return true; } public int numberOfStates() { return getStates().size(); } public List<State> getStates() { return NFAUtil.getAllReachableStates(startState); } @Override public String toString() { StringBuilder b = new StringBuilder(); b.append("Starting state: [").append(this.startState.getName()).append("]").append("\n"); for (State state : NFAUtil.getAllReachableStates(startState)) { b.append(state.toString()).append("\n"); } return b.toString(); } }