]> granicus.if.org Git - re2c/commitdiff
Make skeleton a part of DFA.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 9 Sep 2015 14:30:09 +0000 (15:30 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 9 Sep 2015 14:30:09 +0000 (15:30 +0100)
This let us create skeletom right after DFA creation (but befor DFA
has been mangled in different ways), but call skeleton methods any time.

Undefined control flow is now checked at the time of real code generation,
that's why all those tests that use '-r' changed: re2c stopped reporting
'rules:re2c' blocks and reports 'use:re2c' blocks instead.

20 files changed:
re2c/bootstrap/src/parse/parser.cc
re2c/src/codegen/emit_dfa.cc
re2c/src/codegen/skeleton/generate_code.cc
re2c/src/codegen/skeleton/skeleton.h
re2c/src/ir/bytecode/bytecode.cc
re2c/src/ir/bytecode/bytecode.h
re2c/src/ir/dfa/dfa.cc
re2c/src/ir/dfa/dfa.h
re2c/src/parse/parser.ypp
re2c/test/repeat-01.cgir.c
re2c/test/repeat-02.cgir.c
re2c/test/repeat-03.cgir.c
re2c/test/repeat-04.cgir.c
re2c/test/repeat-06.gir.c
re2c/test/repeat-07.gir.c
re2c/test/repeat-07_error.gir.c
re2c/test/reuse_conds_default_0.cgir.c
re2c/test/reuse_conds_default_1.cgir.c
re2c/test/reuse_conds_setup_0.cgir.c
re2c/test/reuse_conds_setup_1.cgir.c

index 6448acd8c886995af4c797837492c3a76b437d42..3393999e423326417f02dd77a87025cd5d809c3a 100644 (file)
@@ -2778,7 +2778,7 @@ void parse(Scanner& i, Output & o)
                                                it->second = it->second ? mkAlt (def_rule, it->second) : def_rule;
                                        }
 
-                                       dfa_map[it->first] = genCode(it->second, o, it->first);
+                                       dfa_map[it->first] = genCode(it->second, o);
                                }
                                if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end())
                                {
@@ -2805,7 +2805,7 @@ void parse(Scanner& i, Output & o)
                        {
                                if (parseMode != Scanner::Reuse)
                                {
-                                       dfa_map[""] = genCode(spec, o, "");
+                                       dfa_map[""] = genCode(spec, o);
                                }
                                if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end())
                                {
index 9ef8283e6585fc2a9d5f729e614fac77674ba8a7..aad95af21c6520983c664f4b6e30e054f020c1bc 100644 (file)
@@ -115,9 +115,11 @@ void DFA::emit(Output & output, uint32_t& ind, const std::string& condName, bool
        head->action.set_initial (initial_label, head->action.type == Action::SAVE);
 
        // Generate prolog
+       skeleton->warn_undefined_control_flow (o.get_block_line (), condName);
        if (flag_skeleton)
        {
-               emit_prolog (o, ind, output.max_fill);
+               skeleton->emit_data (o.get_block_line (), condName, o.file_name);
+               Skeleton::emit_prolog (o, ind, output.max_fill);
        }
        if (bProlog)
        {
@@ -233,7 +235,7 @@ void DFA::emit(Output & output, uint32_t& ind, const std::string& condName, bool
        }
        if (flag_skeleton)
        {
-               emit_epilog (o, ind);
+               Skeleton::emit_epilog (o, ind);
        }
 
        // Cleanup
index 4f74340d130da1debc0d03fd960cb0b0ceb27790..1c6421dfab02c07bc4b31542ef7747a21d282adc 100644 (file)
@@ -4,7 +4,7 @@
 namespace re2c
 {
 
-void emit_prolog (OutputFile & o, uint32_t ind, uint32_t maxfill)
+void Skeleton::emit_prolog (OutputFile & o, uint32_t ind, uint32_t maxfill)
 {
        std::string yyctype;
        switch (encoding.szCodeUnit ())
@@ -60,7 +60,7 @@ void emit_prolog (OutputFile & o, uint32_t ind, uint32_t maxfill)
        o << indent (ind + 2) << "const YYCTYPE * token = cursor;\n";
 }
 
-void emit_epilog (OutputFile & o, uint32_t ind)
+void Skeleton::emit_epilog (OutputFile & o, uint32_t ind)
 {
        o << indent (ind + 1) << "}\n";
        o << "#undef " << mapCodeName["YYCTYPE"]      << "\n";
index a9ae9f7f7eab45dcb580909474ae0aadce0f693c..ef11f470def8a21c2258ab7ff54caf4dce516b0b 100644 (file)
@@ -57,6 +57,8 @@ struct Skeleton
        ~Skeleton ();
        void warn_undefined_control_flow (uint32_t line, const std::string & cond);
        void emit_data (uint32_t line, const std::string & cond, const char * fname);
+       static void emit_prolog (OutputFile & o, uint32_t ind, uint32_t maxfill);
+       static void emit_epilog (OutputFile & o, uint32_t ind);
 
 private:
        void generate_paths (uint32_t line, const std::string & cond, FILE * input, std::ofstream & keys);
@@ -64,9 +66,6 @@ private:
        FORBID_COPY (Skeleton);
 };
 
-void emit_prolog (OutputFile & o, uint32_t ind, uint32_t maxfill);
-void emit_epilog (OutputFile & o, uint32_t ind);
-
 } // namespace re2c
 
 #endif // _RE2C_CODEGEN_SKELETON_SKELETON_
index c769f5021cf1651bc0b2f8edc95d7ceec2b1d5b2..afb592dc65b7e4ac38c9e7171a6696a6e8396db3 100644 (file)
@@ -8,7 +8,7 @@ namespace re2c {
 
 static void optimize (Ins * i);
 
-smart_ptr<DFA> genCode (RegExp *re, Output & output, const std::string & cond)
+smart_ptr<DFA> genCode (RegExp *re, Output & output)
 {
        CharSet cs;
        re->split(cs);
@@ -56,17 +56,7 @@ smart_ptr<DFA> genCode (RegExp *re, Output & output, const std::string & cond)
 
        smart_ptr<DFA> dfa = make_smart_ptr(new DFA(ins, size, 0, encoding.nCodeUnits(), rep));
 
-       OutputFile & o = output.source;
-
-       Skeleton skeleton (*dfa);
-       skeleton.warn_undefined_control_flow (o.get_block_line (), cond);
-
-       if (flag_skeleton)
-       {
-               skeleton.emit_data (o.get_block_line (), cond, o.file_name);
-       }
-
-       dfa->prepare (o, output.max_fill);
+       dfa->prepare (output.source, output.max_fill);
 
        return dfa;
 }
index 933319490b33ca0da2523e45f6b30e52d61c7c74..d4a9f4ba600ff3d73ed268287c870e69b1c15aac 100644 (file)
@@ -9,7 +9,7 @@
 namespace re2c
 {
 
-smart_ptr<DFA> genCode (RegExp * re, Output & output, const std::string & cond);
+smart_ptr<DFA> genCode (RegExp * re, Output & output);
 
 } // namespace re2c
 
index 91b53333ccc82d0c3f314b5882206816dec27ac9..17df5a459080c06d1ad125ff2e5d037fd019f216 100644 (file)
@@ -1,5 +1,6 @@
 #include <string.h>
 
+#include "src/codegen/skeleton/skeleton.h"
 #include "src/ir/dfa/dfa.h"
 #include "src/ir/regexp/regexp_rule.h"
 #include "src/util/allocate.h"
@@ -37,7 +38,9 @@ struct GoTo
 };
 
 DFA::DFA(Ins *ins, uint32_t ni, uint32_t lb, uint32_t ub, const Char *rep)
-       : lbChar(lb)
+       : accepts ()
+       , skeleton (NULL)
+       , lbChar(lb)
        , ubChar(ub)
        , nStates(0)
        , head(NULL)
@@ -45,8 +48,6 @@ DFA::DFA(Ins *ins, uint32_t ni, uint32_t lb, uint32_t ub, const Char *rep)
        , toDo(NULL)
        , free_ins(ins)
        , free_rep(rep)
-       , accepts ()
-
 {
        Ins **work = new Ins * [ni + 1];
        uint32_t nc = ub - lb;
@@ -126,6 +127,10 @@ DFA::DFA(Ins *ins, uint32_t ni, uint32_t lb, uint32_t ub, const Char *rep)
        delete [] work;
        delete [] goTo;
        operator delete (span);
+
+       // skeleton must be constructed after DFA construction
+       // but prior to any other DFA transformations
+       skeleton = new Skeleton (*this);
 }
 
 DFA::~DFA()
@@ -139,6 +144,8 @@ DFA::~DFA()
        }
        delete [] free_ins;
        delete [] free_rep;
+
+       delete skeleton;
 }
 
 void DFA::addState(State **a, State *s)
index 90acd5f7606a069bc729e24010e6f588a2cefd7c..49b228c6a19f288e1c97967f1a03f155fd27d65d 100644 (file)
@@ -8,8 +8,13 @@
 namespace re2c
 {
 
+struct Skeleton;
+
 class DFA
 {
+       accept_t accepts;
+       Skeleton * skeleton;
+
 public:
        uint32_t lbChar;
        uint32_t ubChar;
@@ -20,9 +25,6 @@ public:
        const Ins * free_ins;
        const Char * free_rep;
 
-protected:
-       accept_t accepts;
-
 public:
        DFA (Ins *, uint32_t, uint32_t, uint32_t, const Char *);
        ~DFA ();
index 43ad837fe3c234be3f13e9fc37cb104ff3fee7c8..22bbd52b046b007b75fa51807101bd59ca5c4a22 100644 (file)
@@ -913,7 +913,7 @@ void parse(Scanner& i, Output & o)
                                                it->second = it->second ? mkAlt (def_rule, it->second) : def_rule;
                                        }
 
-                                       dfa_map[it->first] = genCode(it->second, o, it->first);
+                                       dfa_map[it->first] = genCode(it->second, o);
                                }
                                if (parseMode != Scanner::Rules && dfa_map.find(it->first) != dfa_map.end())
                                {
@@ -940,7 +940,7 @@ void parse(Scanner& i, Output & o)
                        {
                                if (parseMode != Scanner::Reuse)
                                {
-                                       dfa_map[""] = genCode(spec, o, "");
+                                       dfa_map[""] = genCode(spec, o);
                                }
                                if (parseMode != Scanner::Rules && dfa_map.find("") != dfa_map.end())
                                {
index 88c9b718c960bb2c3fdb32d9a29e9d98fbdc69ac..74fe8b426ef0fc9574bd83b09d9a7de2c329ad5a 100644 (file)
@@ -1,5 +1,9 @@
-re2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 22: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 22: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 34: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 34: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 46: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 46: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
 /* Generated by re2c */
 // multiple scanners
 
index fd22eaa5b67885c2756d7f24b30eb53f56202b58..23b7cda89e3b9a52856b90d151ce8f84e8d28a20 100644 (file)
@@ -1,5 +1,9 @@
-re2c: warning: line 13: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 13: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 20: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 20: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 32: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 32: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 44: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 44: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
 /* Generated by re2c */
 // multiple scanners
 
index d6d021db9865e8f7eba6d7a6e5de1bd9e2802013..5277df8bd1591b92cd3c2e5b8e7e45aedbac5f43 100644 (file)
@@ -1,5 +1,3 @@
-re2c: warning: line 14: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 14: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 18: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 18: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 28: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
index c4e18734ae0688576030cf21b74ec7cbf042632d..532e6b7a872a3b235e44f6db007744e859190342 100644 (file)
@@ -1,3 +1,3 @@
-re2c: warning: line 14: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 14: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 18: control flow in condition 'r1' is undefined for strings that match '[\x0-\x30\x33-\x60\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
+re2c: warning: line 18: control flow in condition 'r2' is undefined for strings that match '[\x0-\x30\x33-\x61\x63-\xFF]', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 20, column 1: cannot have a second 'rules:re2c' block
index 3d4b6b1874329034294a67f7d47384dc949c73d5..87b8fddb38b93dcd3ca0b3f3d9f04c63547c0e83 100644 (file)
@@ -1,4 +1,3 @@
-re2c: warning: line 14: control flow is undefined for strings that match '[\x0-\x60\x65-\xFF]', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 24: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 39: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 54: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
index 384698c025abd68eaf1255f310aed23fc3b22bac..4d8ba7d1c49e2e46de7fc83b4c958254f1835b8e 100644 (file)
@@ -1,4 +1,3 @@
-re2c: warning: line 14: control flow is undefined for strings that match '[\x0-\x60\x65-\xFF]', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 27: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 45: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 63: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
index 63daf4a70898fd04af49de6f43e0fbd9e2779b91..b91feac192105a4f884112515e50db05c20f3d7e 100644 (file)
@@ -1,4 +1,3 @@
-re2c: warning: line 14: control flow is undefined for strings that match '[\x0-\x60\x65-\xFF]', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 27: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: warning: line 45: control flow is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 52, column 17: Cannot set UTF32 encoding: please reset USC2 encoding first
index acf7550efbb8b3646f14c83f6d4aacaea10847b7..932b60ed2c76f879bcf6e9a00132d5da7c964f50 100644 (file)
@@ -1,3 +1 @@
-re2c: warning: line 10: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 10: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 13, column 9: code to default rule 'r1' is already defined
index 82f773046c5652dac2731e4fa444929f25794007..87194fd8812a8d755a5ceb6046203fb9edceeca9 100644 (file)
@@ -1,2 +1 @@
-re2c: warning: line 17: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 11, column 9: code to default rule 'r1' is already defined
index 47807d229a73dd38f12995bd9b8b619f5f88b162..8d084737883f66fc90f17aa3b8d8444c0f4ff206 100644 (file)
@@ -1,3 +1 @@
-re2c: warning: line 10: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 10: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 13, column 9: code to setup rule 'r1' is already defined
index f39bb25e6033d3df614f15dbab2e2763ab9018a2..e927119a4bfd761a6c95da97559992b4bf99c523 100644 (file)
@@ -1,3 +1 @@
-re2c: warning: line 17: control flow in condition 'r1' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
-re2c: warning: line 17: control flow in condition 'r2' is undefined for strings that match '\xA', use default rule '*' [-Wundefined-control-flow]
 re2c: error: line 11, column 9: code to setup rule 'r1' is already defined