]> granicus.if.org Git - re2c/commitdiff
Make 'Go' hierarchy independent of relabelling.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 18 Mar 2015 15:01:41 +0000 (15:01 +0000)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 18 Mar 2015 15:01:41 +0000 (15:01 +0000)
This allows to move 'Go' initialization loop to 'DFA::prepare'
and thus avoid ugly check if it is already initialized (it can
happen in '-r' mode when the same DFA is used multiple times).
Now that we store 'State *' pointers instead of labels in
'CpgotoTable', relabelling won't affect the generated code.

re2c/code.cc
re2c/go.h
re2c/go_construct.cc
re2c/go_destruct.cc
re2c/go_emit.cc
re2c/go_used_labels.cc

index dba7dbd6f4d152ee1069b2d4679edb59e6ba78c7..7fb6da1f95f9a8f28bd8f10ced649de2ada5f0c7 100644 (file)
@@ -1076,6 +1076,11 @@ void DFA::prepare(uint & max_fill)
 
        delete head->action;
        head->action = NULL;
+
+       for (s = head; s; s = s->next)
+       {
+               s->go.init (s);
+       }
 }
 
 
@@ -1117,15 +1122,6 @@ void DFA::emit(Output & output, uint& ind, const RegExpMap* specMap, const std::
 
        for (s = head; s; s = s->next)
        {
-               // This awkward check is necessary in '-r' mode,
-               // when the same DFA is used multiple times.
-               // If this for-loop was moved to 'prepare', check
-               // could be avoided, but in 'prepare' labels are
-               // not renamed properly yet.
-               if (s->go.type == Go::NOT_INITIALIZED)
-               {
-                       s->go.init (s);
-               }
                s->go.used_labels ();
        }
 
index 9f5d6599586c2925565eb73e61b2e5a652876bde..51493cecac5ec5fe6f858047b80d810219f7a93a 100644 (file)
--- a/re2c/go.h
+++ b/re2c/go.h
@@ -118,7 +118,7 @@ struct Bitmap
 struct CpgotoTable
 {
        static const uint TABLE_SIZE;
-       uint * table;
+       const State ** table;
        CpgotoTable (const Span * span, uint nSpans);
        ~CpgotoTable ();
        void emit (OutputFile & o, uint ind);
@@ -150,7 +150,6 @@ struct Go
        Span * span;
        enum
        {
-               NOT_INITIALIZED,
                EMPTY,
                SWITCH_IF,
                BITMAP,
index 53d231e989e33a64014b7df151bff6241405bcbb..04e8a481e622cf6378028ae3439b3e26120d1f10 100644 (file)
@@ -135,14 +135,14 @@ Bitmap::Bitmap (const Span * span, uint nSpans, const Span * hspan, uint hSpans,
 const uint CpgotoTable::TABLE_SIZE = 0x100;
 
 CpgotoTable::CpgotoTable (const Span * span, uint nSpans)
-       : table (new uint [TABLE_SIZE])
+       : table (new const State * [TABLE_SIZE])
 {
        uint c = 0;
        for (uint i = 0; i < nSpans; ++i)
        {
                for(; c < span[i].ub && c < TABLE_SIZE; ++c)
                {
-                       table[c] = span[i].to->label;
+                       table[c] = span[i].to;
                }
        }
 }
@@ -160,7 +160,7 @@ Dot::Dot (const Span * sp, uint nsp, const State * s)
 Go::Go ()
        : nSpans (0)
        , span (NULL)
-       , type (NOT_INITIALIZED)
+       , type (EMPTY)
        , info ()
 {}
 
@@ -168,7 +168,6 @@ void Go::init (const State * from)
 {
        if (nSpans == 0)
        {
-               type = EMPTY;
                return;
        }
 
index 1eaefff4fa31eca9568a256476876978af347f9a..6b91d391fd7ff2f79fc1eb5615306fb942817765 100644 (file)
@@ -76,7 +76,6 @@ Go::~Go ()
 {
        switch (type)
        {
-               case NOT_INITIALIZED:
                case EMPTY:
                        break;
                case SWITCH_IF:
index 82ae4fa50122c951db11a69f60d8ace9b4bc27da..8d2264b20ef798b198d7d6a92503ad93de4e8e4b 100644 (file)
@@ -189,7 +189,7 @@ void CpgotoTable::emit (OutputFile & o, uint ind)
        o << indent (++ind);
        for (uint i = 0; i < TABLE_SIZE; ++i)
        {
-               o << "&&" << labelPrefix << table[i];
+               o << "&&" << labelPrefix << table[i]->label;
                if (i == TABLE_SIZE - 1)
                {
                        o << "\n";
@@ -200,7 +200,7 @@ void CpgotoTable::emit (OutputFile & o, uint ind)
                }
                else
                {
-                       o << "," << space (table[i]);
+                       o << "," << space (table[i]->label);
                }
        }
        o << indent (--ind) << "};\n";
@@ -240,7 +240,6 @@ void Go::emit (OutputFile & o, uint ind, bool & readCh)
 {
        switch (type)
        {
-               case NOT_INITIALIZED:
                case EMPTY:
                        break;
                case SWITCH_IF:
index 8cb837b55d9ce5069243e964c719315b4849e501..e59184c60eddbb83f2a1b993565799d0bc16075d 100644 (file)
@@ -69,7 +69,7 @@ void CpgotoTable::used_labels ()
 {
        for (uint i = 0; i < TABLE_SIZE; ++i)
        {
-               vUsedLabels.insert (table[i]);
+               vUsedLabels.insert (table[i]->label);
        }
 }
 
@@ -86,7 +86,6 @@ void Go::used_labels ()
 {
        switch (type)
        {
-               case NOT_INITIALIZED:
                case EMPTY:
                case DOT:
                        break;