namespace re2c {
-static void insert_default_tags(RESpec &spec, RE *re, size_t &tidx)
+static void insert_default_tags(RESpec &spec, RE *re, size_t *&tidx)
{
RE::alc_t &alc = spec.alc;
switch (re->type) {
case RE::NIL: break;
case RE::SYM: break;
case RE::ALT: {
- size_t i = tidx;
+ size_t *i = tidx;
RE *x = re_nil(alc), *y = re_nil(alc);
insert_default_tags(spec, re->alt.re1, tidx);
for (; i < tidx; ++i) {
- x = re_cat(alc, x, re_tag(alc, i, true));
+ x = re_cat(alc, x, re_tag(alc, *i, true));
}
insert_default_tags(spec, re->alt.re2, tidx);
for (; i < tidx; ++i) {
- y = re_cat(alc, y, re_tag(alc, i, true));
+ y = re_cat(alc, y, re_tag(alc, *i, true));
}
re->alt.re1 = re_cat(alc, re->alt.re1, y);
re->alt.re2 = re_cat(alc, re->alt.re2, x);
insert_default_tags(spec, re->iter.re, tidx);
break;
case RE::TAG:
- assert(re->tag.idx == tidx);
- ++tidx;
+ *tidx++ = re->tag.idx;
break;
}
}
void insert_default_tags(RESpec &spec)
{
- size_t tidx = 0;
+ size_t *tidx0 = new size_t[spec.tags.size()], *tidx = tidx0;
std::vector<RE*>::iterator
i = spec.res.begin(),
e = spec.res.end();
for (; i != e; ++i) {
insert_default_tags(spec, *i, tidx);
}
+ delete[] tidx0;
}
} // namespace re2c