]> granicus.if.org Git - re2c/commitdiff
Final tag versions in unreachable rules should be marked as unused.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 12 Apr 2017 12:26:15 +0000 (13:26 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 12 Apr 2017 12:26:15 +0000 (13:26 +0100)
re2c/src/dfa/cfg/compact.cc
re2c/src/dfa/cfg/rename.cc
re2c/src/re/fixed_tags.cc

index 294a1572aabd9853b85b26c1bf20a2eb5a739136..f55c0aaea627d32a3ef538d165a972f20e81674a 100644 (file)
@@ -14,7 +14,8 @@ tagver_t cfg_t::compact(const cfg_t &cfg, tagver_t *ver2new)
 
        std::fill(used, used + nver, false);
        for (size_t t = 0; t < ntag; ++t) {
-               used[fins[t]] = !fixed(tags[t]);
+               const tagver_t f = fins[t];
+               used[f] = f != TAGVER_ZERO; // fixed tag or unreachable rule
        }
        for (size_t i = 0; i < cfg.nbbfall; ++i) {
                const cfg_bb_t &b = cfg.bblocks[i];
@@ -29,9 +30,7 @@ tagver_t cfg_t::compact(const cfg_t &cfg, tagver_t *ver2new)
 
        tagver_t maxver = 0;
        for (size_t v = 0; v < nver; ++v) {
-               if (used[v]) {
-                       ver2new[v] = ++maxver;
-               }
+               ver2new[v] = used[v] ? ++maxver : TAGVER_ZERO;
        }
 
        delete[] used;
index 55680cc55cc6c5e3b5bc1492375b3e3e6203ee4d..64f5fc4bfa412f1a21b56e355fc6d152690ddf91 100644 (file)
@@ -30,8 +30,9 @@ void cfg_t::renaming(cfg_t &cfg, const tagver_t *ver2new, tagver_t maxver)
        tagver_t *fins = cfg.dfa.finvers;
        const std::vector<Tag> &tags = cfg.dfa.tags;
        for (size_t t = 0; t < tags.size(); ++t) {
-               if (!fixed(tags[t])) {
-                       fins[t] = ver2new[fins[t]];
+               tagver_t &f = fins[t];
+               if (f != TAGVER_ZERO) { // fixed tag or unreachable rule
+                       f = ver2new[f];
                }
        }
 }
index 148a0adb95d0a8634a0edabcc1d503d542148b00..b1fec6e60ada4a7b2ddc6fda7c33b2f02adf3898 100644 (file)
@@ -15,6 +15,8 @@ namespace re2c {
  * Furthermore, fixed tags are fobidden with generic API because it cannot
  * express fixed offsets.
  *
+ * Tags with history also cannot be fixed.
+ *
  * One special case is pre-orbit tags: tags that correspond to the opening
  * of capturing group under iteration. We don't need to know the value of
  * such tags: we only need the last iteration which is captured by the
@@ -52,7 +54,7 @@ static void find_fixed_tags(RE *re, std::vector<Tag> &tags,
                case RE::TAG: {
                        // see note [fixed and variable tags]
                        Tag &tag = tags[re->tag.idx];
-                       if (toplevel && dist != Tag::VARDIST) {
+                       if (toplevel && dist != Tag::VARDIST && !history(tag)) {
                                tag.base = base;
                                tag.dist = dist;
                        } else if (preorbit(tags, re->tag.idx)) {