, const std::string &n
, const std::string &c
, uint32_t l
- , tagver_t maxver
)
: accepts ()
, skeleton (skel)
, 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;
, const std::string &n
, const std::string &c
, uint32_t l
- , tagver_t maxver
);
~DFA ();
void reorder();
insert_fallback_tags(dfa);
// try to minimize the number of tag variables
- const tagver_t maxtagver = optimize_tags(dfa);
+ optimize_tags(dfa);
minimization(dfa);
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();
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,
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);
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,
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
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,
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
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(),