]> granicus.if.org Git - re2c/commitdiff
'--skeleton --posix-captures': use correct capture index when checking tags.
authorUlya Trofimovich <skvadrik@gmail.com>
Fri, 3 Mar 2017 23:09:19 +0000 (23:09 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Fri, 3 Mar 2017 23:09:19 +0000 (23:09 +0000)
Instead of skipping fixed tags, skip orbit tags. For each orbit tag there is
a tag fixed on it, so if we check all fixed tags we'll surely check all orbit
tags. Anyway, with '--skeleton' all fixed tags correspond to orbit tags: other
fixed tags are forbidden with generic API (even zero-offset ones for now).

re2c/src/ir/skeleton/generate_code.cc
re2c/src/ir/skeleton/generate_data.cc

index 7a3082115baacd5bad5aa1c1e3115b33906bbe9e..b235555eed3ed4bed8c996954338ff1ee8205d6c 100644 (file)
@@ -358,7 +358,7 @@ void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, size_t rid)
        const size_t rkey = rule2key(rid, dfa.key_size, dfa.def_rule);
        size_t ntag = 3;
        for (size_t t = r.ltag; t < r.htag; ++t) {
-               if (t != r.ttag && !fixed(dfa.tags[t])) ++ntag;
+               if (t != r.ttag && !orbit(dfa.tags[t])) ++ntag;
        }
 
        o.wind(ind).ws("status = check_key_count_").wstring(name).ws("(keys_count, i, ")
@@ -367,7 +367,7 @@ void emit_action(OutputFile &o, uint32_t ind, const DFA &dfa, size_t rid)
 
        for (size_t t = r.ltag; t < r.htag; ++t) {
                const Tag &tag = dfa.tags[t];
-               if (t == r.ttag || fixed(tag)) continue;
+               if (t == r.ttag || orbit(tag)) continue;
                const std::string tname = tagname(tag);
                o.ws("\n").wind(ind + 1).ws(" || check_tag_").wstring(name)
                        .ws("(&i, keys, ").wstring(tname).ws(", input, token, \"")
index 2646432789a3b1df03ef4899cc94f1112bc189aa..7846538a512c672f52b378b3515e6230b73f8b24 100644 (file)
@@ -199,7 +199,7 @@ static void write_keys(const path_t &path, const Skeleton &skel,
        // keys: 1 - scanned length, 2 - matched length, 3 - matched rule, the rest - tags
        size_t nkey = 3;
        for (size_t t = ltag; t < htag; ++t) {
-               if (t != trail && !fixed(skel.tags[t])) ++nkey;
+               if (t != trail && !orbit(skel.tags[t])) ++nkey;
        }
        key_t *keys = new key_t[nkey * width], *k = keys;
        for (size_t w = 0; w < width; ++w) {
@@ -208,8 +208,10 @@ static void write_keys(const path_t &path, const Skeleton &skel,
                *k++ = to_le(rule2key<key_t>(rule, skel.defrule));
                const size_t *ts = &tags[w * nver];
                for (size_t t = ltag; t < htag; ++t) {
-                       if (t != trail && !fixed(skel.tags[t])) {
-                               *k++ = to_le(static_cast<key_t>(ts[skel.finvers[t]]));
+                       const Tag &tag = skel.tags[t];
+                       if (t != trail && !orbit(tag)) {
+                               const size_t base = fixed(tag) ? tag.base : t;
+                               *k++ = to_le(static_cast<key_t>(ts[skel.finvers[base]]));
                        }
                }
        }