public DFA toDFA() { StateSet start = startState(); // System.out.println("start:" + start); DFA dfa = new DFA(new DFA.State(start)); // 构建DFA Stack<StateSet> frontier = new Stack<StateSet>(); frontier.add(start); HashSet<DFA.State> seen = new HashSet<DFA.State>(); while (!frontier.isEmpty()) { StateSet current = frontier.pop(); HashSet<Character> inputs = getInputs(current); if (inputs == null) continue; for (char input : inputs) { StateSet newState = nextState(current, input); if (!seen.contains(newState)) { frontier.add(newState); seen.add(new DFA.State(newState)); if (isFinal(newState)) { dfa.addFinalState(new DFA.State(newState)); } } dfa.addTransition(new DFA.State(current), input, new DFA.State(newState)); } // 处理任意转移 StateSet anyStates = new StateSet(n, k); for (int state = current.table.nextSetBit(0); state >= 0; state = current.table.nextSetBit(state + 1)) { anyStates.add(state); } dfa.setDefaultTransition(new DFA.State(current), new DFA.State(anyStates)); } return dfa; }