]> granicus.if.org Git - re2c/commitdiff
Update struct field instead of passing return value.
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 31 Oct 2016 13:44:43 +0000 (13:44 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 31 Oct 2016 13:44:43 +0000 (13:44 +0000)
re2c/src/ir/adfa/adfa.cc
re2c/src/ir/adfa/adfa.h
re2c/src/ir/compile.cc
re2c/src/ir/dfa/determinization.cc
re2c/src/ir/dfa/dfa.h
re2c/src/ir/dfa/tag_optimize.cc
re2c/src/ir/dfa/tag_renaming.cc

index aeef7b5a976650d7d586fda3909cce76e76584a8..226c5bdf939f22c6f5f1fa749cf627d4b61e4385 100644 (file)
@@ -23,7 +23,6 @@ DFA::DFA
        , const std::string &n
        , const std::string &c
        , uint32_t l
-       , tagver_t maxver
        )
        : accepts ()
        , skeleton (skel)
@@ -41,7 +40,7 @@ DFA::DFA
        , need_backup (false)
        , need_accept (false)
        , oldstyle_ctxmarker (false)
-       , maxtagver (maxver)
+       , maxtagver (dfa.maxtagver)
 {
        const size_t nstates = dfa.states.size();
        const size_t nchars = dfa.nchars;
index 1864b9ed0b1cd17dc8e9a8642020c1d1755ac083..fb0d8f7fcfdc492e161b3b57dc0a8ac8f64a56b7 100644 (file)
@@ -82,7 +82,6 @@ struct DFA
                , const std::string &n
                , const std::string &c
                , uint32_t l
-               , tagver_t maxver
                );
        ~DFA ();
        void reorder();
index 66da0f2ab22c22b8d81d243692aec058d0b0ca94..658eb23c6d564bb2f048b9c07005360a20b432c4 100644 (file)
@@ -69,7 +69,7 @@ static smart_ptr<DFA> compile_rules(
        insert_fallback_tags(dfa);
 
        // try to minimize the number of tag variables
-       const tagver_t maxtagver = optimize_tags(dfa);
+       optimize_tags(dfa);
 
        minimization(dfa);
 
@@ -78,7 +78,7 @@ static smart_ptr<DFA> compile_rules(
        fillpoints(dfa, fill);
 
        // ADFA stands for 'DFA with actions'
-       DFA *adfa = new DFA(dfa, fill, skeleton, cs, name, cond, line, maxtagver);
+       DFA *adfa = new DFA(dfa, fill, skeleton, cs, name, cond, line);
 
        // see note [reordering DFA states]
        adfa->reorder();
index 38863da933f636b51d02b82d79df44a47211e0e4..3a93da4acc1210c4e5972e3652260d410e860acf 100644 (file)
@@ -14,6 +14,7 @@
 namespace re2c
 {
 
+static tagver_t vartag_maxver(const std::valarray<Tag> &tags);
 static nfa_state_t *transition(nfa_state_t *state, uint32_t symbol);
 static void reach(const closure_t &clos1, closure_t &clos2, uint32_t symbol);
 static void warn_bad_tags(const bool *badtags, const std::valarray<Tag> &tags,
@@ -62,7 +63,7 @@ dfa_t::dfa_t(const nfa_t &nfa,
        closure_t clos1, clos2;
        bool *badtags = new bool[ntag]();
 
-       maxtagver = static_cast<tagver_t>(ntag);
+       maxtagver = vartag_maxver(tags);
        clos1.push_back(clos_t(nfa.root, ZERO_TAGS));
        closure(clos1, clos2, tagpool, rules, badtags);
        clospool.insert(clos2);
@@ -98,6 +99,16 @@ dfa_t::dfa_t(const nfa_t &nfa,
        delete[] badtags;
 }
 
+tagver_t vartag_maxver(const std::valarray<Tag> &tags)
+{
+       for (size_t t = tags.size(); t > 0; --t) {
+               if (tags[t - 1].type == Tag::VAR) {
+                       return static_cast<tagver_t>(t);
+               }
+       }
+       return 0;
+}
+
 void warn_bad_tags(const bool *badtags,
        const std::valarray<Tag> &tags,
        const std::valarray<Rule> &rules,
index 4bd7b0fd5d7c7f0746336caef06ca62c7500aa16..7fa5eb244ca6b859c30f48659c4783e64704aaf0 100644 (file)
@@ -70,7 +70,7 @@ void minimization(dfa_t &dfa);
 void fillpoints(const dfa_t &dfa, std::vector<size_t> &fill);
 void cutoff_dead_rules(dfa_t &dfa, size_t defrule, const std::string &cond);
 void insert_fallback_tags(dfa_t &dfa);
-tagver_t optimize_tags(dfa_t &dfa);
+void optimize_tags(dfa_t &dfa);
 
 } // namespace re2c
 
index c1ea88b5bdb81eeb5fa187dbf896aee58edf3bab..2f43ac613edd1fb3f64d97269d755414a46850b4 100644 (file)
@@ -6,11 +6,9 @@
 namespace re2c
 {
 
-static size_t count_variable_tags(const std::valarray<Tag> &tags);
-
-tagver_t optimize_tags(dfa_t &dfa)
+void optimize_tags(dfa_t &dfa)
 {
-       if (count_variable_tags(dfa.tags) == 0) return 0;
+       if (dfa.maxtagver == 0) return;
 
        const size_t
                narc = dfa.states.size() * dfa.nchars,
@@ -29,18 +27,6 @@ tagver_t optimize_tags(dfa_t &dfa)
        delete[] live;
        delete[] interf;
        delete[] ver2new;
-       return maxver;
-}
-
-size_t count_variable_tags(const std::valarray<Tag> &tags)
-{
-       size_t nvar = 0, ntag = tags.size();
-       for (size_t t = 0; t < ntag; ++t) {
-               if (tags[t].type == Tag::VAR) {
-                       ++nvar;
-               }
-       }
-       return nvar;
 }
 
 } // namespace re2c
index e56b03d0c1752d0f61d798caa4b47cb7000cbd10..13f8646a20e561ef1972ec386cb4915c9120b1e1 100644 (file)
@@ -9,10 +9,12 @@ static void rename_copy(tagcopy_t **pcopy, const tagver_t *ver2new);
 
 void tag_renaming(dfa_t &dfa, const tagver_t *ver2new, tagver_t maxver)
 {
-       if (maxver >= dfa.maxtagver) {
-               assert(maxver == dfa.maxtagver);
+       tagver_t &oldmax = dfa.maxtagver;
+       if (maxver >= oldmax) {
+               assert(maxver == oldmax);
                return;
        }
+       oldmax = maxver;
 
        const size_t
                nstate = dfa.states.size(),