From: Ulya Trofimovich Date: Wed, 28 Sep 2016 16:07:28 +0000 (+0100) Subject: Comments and minor code rearrangements; nothing serious. X-Git-Tag: 1.0~39^2~269 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=aa67fff35310fca64dadc50c3e3fa93921c37d9e;p=re2c Comments and minor code rearrangements; nothing serious. --- diff --git a/re2c/src/ir/dfa/determinization.cc b/re2c/src/ir/dfa/determinization.cc index a33ec73b..171b239b 100644 --- a/re2c/src/ir/dfa/determinization.cc +++ b/re2c/src/ir/dfa/determinization.cc @@ -62,27 +62,33 @@ dfa_t::dfa_t(const nfa_t &nfa, clos1.push_back(clos_t(nfa.root, ZERO_TAGS)); closure(clos1, clos2, tagpool, rules, badtags); - find_state(clos2, clospool); + clospool.insert(clos2); + // closures are in sync with DFA states for (size_t i = 0; i < clospool.size(); ++i) { const closure_t &clos0 = clospool[i]; + + // create new DFA state dfa_state_t *s = new dfa_state_t(nchars); states.push_back(s); - for (size_t c = 0; c < nchars; ++c) { - reach(clos0, clos1, charset[c]); - s->tags[c] = closure(clos1, clos2, tagpool, rules, badtags); - s->arcs[c] = find_state(clos2, clospool); - } - + // check if the new state is final // see note [at most one final item per closure] - cclositer_t - e = clos0.end(), + cclositer_t e = clos0.end(), f = std::find_if(clos0.begin(), e, clos_t::final); if (f != e) { s->rule = f->state->rule; s->rule_tags = f->tagidx; } + + // for each alphabet symbol, build tagged epsilon-closure + // of all NFA states reachable on that symbol, then try to + // find identical closure or add the new one + for (size_t c = 0; c < nchars; ++c) { + reach(clos0, clos1, charset[c]); + s->tags[c] = closure(clos1, clos2, tagpool, rules, badtags); + s->arcs[c] = clospool.insert(clos2); + } } warn_bad_tags(badtags, tags, rules, cond); diff --git a/re2c/src/ir/dfa/find_state.cc b/re2c/src/ir/dfa/find_state.cc index 2ab0637a..fe762156 100644 --- a/re2c/src/ir/dfa/find_state.cc +++ b/re2c/src/ir/dfa/find_state.cc @@ -56,6 +56,11 @@ const closure_t& clospool_t::operator[](size_t idx) const size_t clospool_t::insert(const closure_t &clos) { + // empty closure corresponds to default state + if (clos.empty()) { + return dfa_t::NIL; + } + const uint32_t hash = hashclos(clos); // try to find an identical DFA state @@ -68,14 +73,4 @@ size_t clospool_t::insert(const closure_t &clos) return lookup.push(hash, new closure_t(clos)); } -size_t find_state(const closure_t &clos, clospool_t &clospool) -{ - // empty closure corresponds to default state - if (clos.empty()) { - return dfa_t::NIL; - } - - return clospool.insert(clos); -} - } // namespace re2c diff --git a/re2c/src/ir/dfa/find_state.h b/re2c/src/ir/dfa/find_state.h index 039c9ec9..a68061ee 100644 --- a/re2c/src/ir/dfa/find_state.h +++ b/re2c/src/ir/dfa/find_state.h @@ -23,8 +23,6 @@ public: size_t insert(const closure_t &clos); }; -size_t find_state(const closure_t &clos, clospool_t &clospool); - } // namespace re2c #endif // _RE2C_IR_DFA_FIND_STATE_