/** * * @param set * @return */ private Set<NFAState<T>> epsilonClosure(Scope<DFAState<T>> scope, Set<NFAState<T>> set) { StateVisitSet<NFAState<T>> marked = new StateVisitSet<>(); Set<NFAState<T>> result = new HashSet<>(); result.addAll(set); for (NFAState<T> nfa : set) { result.addAll(nfa.epsilonTransitions(marked)); } return result; }
/** * Returns a set of states that can be reached by epsilon transitions. * @param marked * @return */ private Set<NFAState<T>> epsilonTransitions(StateVisitSet<NFAState<T>> marked) { marked.add(this); Set<NFAState<T>> set = new HashSet<>(); for (NFAState<T> nfa : epsilonTransit()) { if (!marked.contains(nfa)) { set.add(nfa); set.addAll(nfa.epsilonTransitions(marked)); } } return set; } /**