]> granicus.if.org Git - re2c/commitdiff
Introduced a distinct type for labels.
authorUlya Trofimovich <skvadrik@gmail.com>
Thu, 28 May 2015 10:45:11 +0000 (11:45 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Thu, 28 May 2015 10:45:11 +0000 (11:45 +0100)
14 files changed:
re2c/src/codegen/emit.h
re2c/src/codegen/emit_action.cc
re2c/src/codegen/emit_dfa.cc
re2c/src/codegen/go.h
re2c/src/codegen/go_emit.cc
re2c/src/codegen/go_used_labels.cc
re2c/src/codegen/label.cc
re2c/src/codegen/label.h
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/src/dfa/action.h
re2c/src/dfa/dfa.h
re2c/src/dfa/state.h
re2c/src/parse/scanner.cc

index 908b4bd3214718e69097643fd69c2d409fc1421b..f7860c4954dde20a8895cbbfa62e582c17ce7e93 100644 (file)
@@ -16,7 +16,7 @@ void emit_action
        , bool & readCh
        , const State * const s
        , const std::string & condName
-       , const std::set<uint32_t> & used_labels
+       , const std::set<label_t> & used_labels
        );
 
 // helpers
index 77825c23b1d91a272931f46b62be875d13995c31..a8a9ade50dd6f6fd439a7435c768ac8069a34396 100644 (file)
@@ -9,7 +9,7 @@ namespace re2c
 
 static void need               (OutputFile & o, uint32_t ind, bool & readCh, uint32_t n, bool bSetMarker);
 static void emit_match         (OutputFile & o, uint32_t ind, bool & readCh, const State * const s);
-static void emit_initial       (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & init, const std::set<uint32_t> & used_labels);
+static void emit_initial       (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & init, const std::set<label_t> & used_labels);
 static void emit_save          (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, uint32_t save);
 static void emit_accept_binary (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept, uint32_t l, uint32_t r);
 static void emit_accept        (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const accept_t & accept);
@@ -24,7 +24,7 @@ void emit_action
        , bool & readCh
        , const State * const s
        , const std::string & condName
-       , const std::set<uint32_t> & used_labels
+       , const std::set<label_t> & used_labels
        )
 {
        switch (action.type)
@@ -81,7 +81,7 @@ void emit_match (OutputFile & o, uint32_t ind, bool & readCh, const State * cons
        }
 }
 
-void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & initial, const std::set<uint32_t> & used_labels)
+void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, const State * const s, const Initial & initial, const std::set<label_t> & used_labels)
 {
        if (DFlag)
        {
@@ -104,7 +104,7 @@ void emit_initial (OutputFile & o, uint32_t ind, bool & readCh, const State * co
        {
                o << labelPrefix << initial.label << ":\n";
        }
-       else if (!initial.label)
+       else if (initial.label == label_counter_t::FIRST)
        {
                o << "\n";
        }
index 8379c3aa64306f2e0a2974684622170741198b33..b1582f96b20c8ca1a4436adb435a230a8c71ff28 100644 (file)
@@ -65,12 +65,12 @@ void emit_state (OutputFile & o, uint32_t ind, const State * s, bool used_label)
        }
 }
 
-void DFA::count_used_labels (std::set<uint32_t> & used, uint32_t start, uint32_t initial, bool force_start) const
+void DFA::count_used_labels (std::set<label_t> & used, label_t start, label_t initial, bool force_start) const
 {
        // In '-f' mode, default state is always state 0
        if (fFlag)
        {
-               used.insert (Label::FIRST_LABEL);
+               used.insert (label_counter_t::FIRST);
        }
        if (force_start)
        {
@@ -100,17 +100,17 @@ void DFA::emit(Output & output, uint32_t& ind, const RegExpMap* specMap, const s
        // start_label points to the beginning of current re2c block
        // (prior to condition dispatch in '-c' mode)
        // it can forced by configuration 're2c:startlabel = <integer>;'
-       uint32_t start_label = o.label.new_label ();
+       label_t start_label = o.label_counter.next ();
        // initial_label points to the beginning of DFA
        // in '-c' mode this is NOT equal to start_label
-       uint32_t initial_label = bProlog && cFlag
-               ? o.label.new_label ()
+       label_t initial_label = bProlog && cFlag
+               ? o.label_counter.next ()
                : start_label;
        for (State * s = head; s; s = s->next)
        {
-               s->label = o.label.new_label ();
+               s->label = o.label_counter.next ();
        }
-       std::set<uint32_t> used_labels;
+       std::set<label_t> used_labels;
        count_used_labels (used_labels, start_label, initial_label, o.get_force_start_label ());
 
        head->action.set_initial (initial_label, bSaveOnHead);
index 77cd2bea5091e3d89efff1069c4b86cd94640031..7bd04d6914163d793a6875cddd2bc41bb5ac3f0a 100644 (file)
@@ -48,7 +48,7 @@ struct Cases
        Cases (const Span * s, uint32_t n);
        ~Cases ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
        FORBID_COPY (Cases);
 };
@@ -68,7 +68,7 @@ struct Binary
        Binary (const Span * s, uint32_t n, const State * next);
        ~Binary ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
        FORBID_COPY (Binary);
 };
@@ -79,7 +79,7 @@ struct Linear
        Linear (const Span * s, uint32_t n, const State * next);
        ~Linear ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 };
 
 struct If
@@ -97,7 +97,7 @@ struct If
        If (type_t t, const Span * sp, uint32_t nsp, const State * next);
        ~If ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 };
 
 struct SwitchIf
@@ -115,7 +115,7 @@ struct SwitchIf
        SwitchIf (const Span * sp, uint32_t nsp, const State * next);
        ~SwitchIf ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 };
 
 struct GoBitmap
@@ -127,7 +127,7 @@ struct GoBitmap
        GoBitmap (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const BitMap * bm, const State * bm_state, const State * next);
        ~GoBitmap ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
        FORBID_COPY (GoBitmap);
 };
@@ -139,10 +139,10 @@ struct CpgotoTable
        CpgotoTable (const Span * span, uint32_t nSpans);
        ~CpgotoTable ();
        void emit (OutputFile & o, uint32_t ind);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
 private:
-       uint32_t max_label ();
+       label_t max_label () const;
 
        FORBID_COPY (CpgotoTable);
 };
@@ -154,7 +154,7 @@ struct Cpgoto
        Cpgoto (const Span * span, uint32_t nSpans, const Span * hspan, uint32_t hSpans, const State * next);
        ~Cpgoto ();
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
        FORBID_COPY (Cpgoto);
 };
@@ -194,7 +194,7 @@ struct Go
        ~Go ();
        void init (const State * from);
        void emit (OutputFile & o, uint32_t ind, bool & readCh);
-       void used_labels (std::set<uint32_t> & used);
+       void used_labels (std::set<label_t> & used);
 
        Go (const Go & g)
                : nSpans (g.nSpans)
index 3a2fa708edfc84e0f02130e353c7535fbdb1ca88..1521a523883ea17a7f869ca3343f7cde5b8d3d90 100644 (file)
@@ -7,19 +7,11 @@
 namespace re2c
 {
 
-static uint32_t digits (uint32_t n);
 static void output_if (OutputFile & o, uint32_t ind, bool & readCh, const std::string & compare, uint32_t value);
-static void output_goto (OutputFile & o, uint32_t ind, bool & readCh, uint32_t to);
+static void output_goto (OutputFile & o, uint32_t ind, bool & readCh, label_t to);
 static std::string output_yych (bool & readCh);
 static std::string output_hgo (OutputFile & o, uint32_t ind, bool & readCh, SwitchIf * hgo);
 
-uint32_t digits (uint32_t n)
-{
-       uint32_t digits = 0;
-       while (n /= 10) ++digits;
-       return digits;
-}
-
 std::string output_yych (bool & readCh)
 {
        if (readCh)
@@ -40,7 +32,7 @@ void output_if (OutputFile & o, uint32_t ind, bool & readCh, const std::string &
        o << ") ";
 }
 
-void output_goto (OutputFile & o, uint32_t ind, bool & readCh, uint32_t to)
+void output_goto (OutputFile & o, uint32_t ind, bool & readCh, label_t to)
 {
        if (readCh)
        {
@@ -196,12 +188,12 @@ void GoBitmap::emit (OutputFile & o, uint32_t ind, bool & readCh)
        }
 }
 
-uint32_t CpgotoTable::max_label ()
+label_t CpgotoTable::max_label () const
 {
-       uint32_t max = 0;
+       label_t max = label_counter_t::FIRST;
        for (uint32_t i = 0; i < TABLE_SIZE; ++i)
        {
-               if (table[i]->label > max)
+               if (max < table[i]->label)
                {
                        max = table[i]->label;
                };
@@ -213,7 +205,7 @@ void CpgotoTable::emit (OutputFile & o, uint32_t ind)
 {
        o << indent (ind) << "static void *" << mapCodeName["yytarget"] << "[256] = {\n";
        o << indent (++ind);
-       const uint32_t max_digits = digits (max_label ());
+       const uint32_t max_digits = width (max_label ());
        for (uint32_t i = 0; i < TABLE_SIZE; ++i)
        {
                o << "&&" << labelPrefix << table[i]->label;
@@ -227,7 +219,7 @@ void CpgotoTable::emit (OutputFile & o, uint32_t ind)
                }
                else
                {
-                       const uint32_t padding = max_digits - digits (table[i]->label) + 1;
+                       const uint32_t padding = max_digits - width (table[i]->label) + 1;
                        o << "," << std::string (padding, ' ');
                }
        }
index 31fe54bc038516d519ebe8805882fe5d67a01a11..d17ab92ea45011c2d08b28c6d7b85ddde9c4c8a7 100644 (file)
@@ -4,7 +4,7 @@
 namespace re2c
 {
 
-void Cases::used_labels (std::set<uint32_t> & used)
+void Cases::used_labels (std::set<label_t> & used)
 {
        for (uint32_t i = 0; i < cases_size; ++i)
        {
@@ -12,13 +12,13 @@ void Cases::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void Binary::used_labels (std::set<uint32_t> & used)
+void Binary::used_labels (std::set<label_t> & used)
 {
        thn->used_labels (used);
        els->used_labels (used);
 }
 
-void Linear::used_labels (std::set<uint32_t> & used)
+void Linear::used_labels (std::set<label_t> & used)
 {
        for (uint32_t i = 0; i < branches.size (); ++i)
        {
@@ -26,7 +26,7 @@ void Linear::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void If::used_labels (std::set<uint32_t> & used)
+void If::used_labels (std::set<label_t> & used)
 {
        switch (type)
        {
@@ -39,7 +39,7 @@ void If::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void SwitchIf::used_labels (std::set<uint32_t> & used)
+void SwitchIf::used_labels (std::set<label_t> & used)
 {
        switch (type)
        {
@@ -52,7 +52,7 @@ void SwitchIf::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void GoBitmap::used_labels (std::set<uint32_t> & used)
+void GoBitmap::used_labels (std::set<label_t> & used)
 {
        if (hgo != NULL)
        {
@@ -65,7 +65,7 @@ void GoBitmap::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void CpgotoTable::used_labels (std::set<uint32_t> & used)
+void CpgotoTable::used_labels (std::set<label_t> & used)
 {
        for (uint32_t i = 0; i < TABLE_SIZE; ++i)
        {
@@ -73,7 +73,7 @@ void CpgotoTable::used_labels (std::set<uint32_t> & used)
        }
 }
 
-void Cpgoto::used_labels (std::set<uint32_t> & used)
+void Cpgoto::used_labels (std::set<label_t> & used)
 {
        if (hgo != NULL)
        {
@@ -82,7 +82,7 @@ void Cpgoto::used_labels (std::set<uint32_t> & used)
        table->used_labels (used);
 }
 
-void Go::used_labels (std::set<uint32_t> & used)
+void Go::used_labels (std::set<label_t> & used)
 {
        switch (type)
        {
index e566e09d1e3abc0539efd376de91dea9ef6d93d6..281c6d5421263de8d914bebb6f06c3b3b5d1d1d2 100644 (file)
@@ -1,7 +1,32 @@
+#include <ostream>
+
 #include "src/codegen/label.h"
 
 namespace re2c {
 
-const uint32_t Label::FIRST_LABEL = 0;
+const label_t label_counter_t::FIRST (0);
+
+std::ostream & operator << (std::ostream & o, label_t l)
+{
+       o << l.value;
+       return o;
+}
+
+bool operator < (const label_t & l1, const label_t & l2)
+{
+       return l1.value < l2.value;
+}
+
+bool operator == (const label_t & l1, const label_t & l2)
+{
+       return l1.value == l2.value;
+}
+
+uint32_t width (label_t l)
+{
+       uint32_t digits = 0;
+       while (l.value /= 10) ++digits;
+       return digits;
+}
 
 } // namespace re2c
index 205c2d2a5953230b76ee5cc7310f5292970cfa69..dc6d5fcf66866390169653822a75bb8e76f42f1c 100644 (file)
@@ -1,29 +1,46 @@
 #ifndef __LABEL__
 #define __LABEL__
 
+#include <iosfwd>
+
 #include "src/util/c99_stdint.h"
 
 namespace re2c {
 
-class Label
+class label_t
+{
+       uint32_t value;
+       explicit label_t (uint32_t v)
+               : value (v)
+       {}
+       friend class label_counter_t;
+       friend std::ostream & operator << (std::ostream & o, label_t l);
+       friend bool operator < (const label_t & l1, const label_t & l2);
+       friend bool operator == (const label_t & l1, const label_t & l2);
+       friend uint32_t width (label_t l);
+};
+
+class label_counter_t
 {
 public:
-       static const uint32_t FIRST_LABEL;
+       static const label_t FIRST;
 
 private:
-       uint32_t next;
+       label_t label;
 
 public:
-       Label ()
-               : next (FIRST_LABEL)
+       label_counter_t ()
+               : label (FIRST)
        {}
-       uint32_t new_label ()
+       label_t next ()
        {
-               return next++;
+               label_t l = label;
+               ++label.value;
+               return l;
        }
        void reset ()
        {
-               next = FIRST_LABEL;
+               label = FIRST;
        }
 };
 
index 71e34edb5f0a30cdf0a9c15c9be8cca7f02aab27..36dc723b41c9d54af73eb6bd5bc8cce25730c073 100644 (file)
@@ -53,7 +53,7 @@ OutputFile::OutputFile (const char * fn)
        : file_name (fn)
        , file (NULL)
        , blocks ()
-       , label ()
+       , label_counter ()
 {
        new_block ();
 }
@@ -150,6 +150,12 @@ OutputFile & operator << (OutputFile & u, const char * s)
        return u;
 }
 
+OutputFile & operator << (OutputFile & u, label_t l)
+{
+       u.stream () << l;
+       return u;
+}
+
 void OutputFile::insert_code ()
 {
        blocks.back ()->fragments.push_back (new OutputFragment (OutputFragment::CODE, 0));
index fbff9b9732807aaf1db7eb7221135e825694c302..262a2ca9bed935565d8dfdff812c3c173cac876d 100644 (file)
@@ -59,7 +59,7 @@ private:
        std::vector<OutputBlock *> blocks;
 
 public:
-       Label label;
+       label_counter_t label_counter;
 
 private:
        std::ostream & stream ();
@@ -84,6 +84,7 @@ public:
        friend OutputFile & operator << (OutputFile & o, uint32_t n);
        friend OutputFile & operator << (OutputFile & o, const std::string & s);
        friend OutputFile & operator << (OutputFile & o, const char * s);
+       friend OutputFile & operator << (OutputFile & o, label_t l);
 
        void insert_line_info ();
        void insert_state_goto (uint32_t ind);
index f464c84203d3ed2210cc60355d1a4fd1c7f1327a..87331d9a3df13db40679fe3727f92eb1b12fb9ed 100644 (file)
@@ -3,6 +3,7 @@
 
 #include <map>
 
+#include "src/codegen/label.h"
 #include "src/util/c99_stdint.h"
 
 namespace re2c
@@ -14,10 +15,10 @@ class State;
 
 struct Initial
 {
-       uint32_t label;
+       label_t label;
        bool setMarker;
 
-       inline Initial (uint32_t l, bool b)
+       inline Initial (label_t l, bool b)
                : label (l)
                , setMarker (b)
        {}
@@ -54,7 +55,7 @@ public:
        {
                clear ();
        }
-       void set_initial (uint32_t label, bool used_marker)
+       void set_initial (label_t label, bool used_marker)
        {
                clear ();
                type = INITIAL;
index bb20a7b4c607e1ccf13cc83d787308c64b49ab10..46ec519ff8939a654649da8a2936a4fceaa31f62 100644 (file)
@@ -37,7 +37,7 @@ public:
        void findSCCs ();
        void findBaseState ();
        void prepare (uint32_t &);
-       void count_used_labels (std::set<uint32_t> & used, uint32_t prolog, uint32_t start, bool force_start) const;
+       void count_used_labels (std::set<label_t> & used, label_t prolog, label_t start, bool force_start) const;
        void emit (Output &, uint32_t &, const RegExpMap *, const std::string &, bool, bool &);
 
        friend std::ostream & operator << (std::ostream &, const DFA &);
index 9c11b0a5b9800e8cf71c32295acadba948440266..bb06b71c2fb8be025817d38dd9da21f12e5f1e62 100644 (file)
@@ -12,7 +12,7 @@ namespace re2c
 class State
 {
 public:
-       uint32_t label;
+       label_t label;
        RuleOp * rule;
        State * next;
        State * link;
@@ -26,7 +26,7 @@ public:
        Action action;
 
        State ()
-               : label (0)
+               : label (label_counter_t::FIRST)
                , rule (NULL)
                , next (0)
                , link (NULL)
index 4080a3b0948102d9408de4a1a35480122ceb6a4e..cf4f85494a2f83ffdfb320e0dd4ec6d50db49d2f 100644 (file)
@@ -449,7 +449,7 @@ Scanner::~Scanner()
 
 void Scanner::reuse()
 {
-       out.label.reset ();
+       out.label_counter.reset ();
        last_fill_index = 0;
        bWroteGetState = false;
        bWroteCondCheck = false;