Example #1
0
  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;
  }