12 return std::lexicographical_compare(
a.begin(),
a.end(), b.begin(), b.end(), NFANode::Lt{});
40 auto dfa = std::make_unique<DFA>();
41 std::map<NFASet, DFANode*, NFASetLt> dfaStates;
42 std::queue<NFASet> stateQueue;
44 dfaStates.emplace(startState, dfa->add_state());
45 stateQueue.push(startState);
46 while (!stateQueue.empty()) {
47 auto currentState = stateQueue.front();
49 auto currentDfaState = dfaStates[currentState];
50 std::map<std::uint16_t, NFASet> nextStates;
52 for (
auto& nfaState : currentState) {
53 nfaState->for_transitions([&](
auto c,
auto to) {
55 if (nextStates.find(c) == nextStates.end())
56 nextStates.try_emplace(c,
NFASet{to});
58 nextStates[c].insert(to);
62 for (
auto& [c, tos] : nextStates) {
64 if (dfaStates.find(toStateClosure) == dfaStates.end()) {
65 dfaStates.emplace(toStateClosure, dfa->add_state());
66 stateQueue.push(toStateClosure);
68 currentDfaState->add_transition(dfaStates[toStateClosure], c);
71 dfa->set_start(dfaStates[startState]);
72 for (
auto& [state, dfaState] : dfaStates) {
73 for (
auto& nfaState : state) {
74 if (nfaState->is_accepting()) dfaState->set_accepting(
true);
75 if (nfaState->is_erroring()) {
76 dfaState->set_accepting(
false);
77 dfaState->set_erroring(
true);