]> granicus.if.org Git - re2c/commitdiff
Comments and minor code rearrangements; nothing serious.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 28 Sep 2016 16:07:28 +0000 (17:07 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 28 Sep 2016 16:07:28 +0000 (17:07 +0100)
re2c/src/ir/dfa/determinization.cc
re2c/src/ir/dfa/find_state.cc
re2c/src/ir/dfa/find_state.h

index a33ec73b0cbf9d5a761a25fc487ce526333c84a9..171b239bcc99047432faaf0c560f31aee06cf0f3 100644 (file)
@@ -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);
index 2ab0637a628b7c1a7b0f82ae26abe7db38addae0..fe7621560d318436696cbda5c3a549b319688d82 100644 (file)
@@ -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
index 039c9ec97765d21e0e893be6bb30cffb996b84c4..a68061ee2400caab0d10ca99fd49194fe27f9950 100644 (file)
@@ -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_