]> granicus.if.org Git - re2c/commitdiff
The generated '--skeleton' program now warns about undefined control flow.
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 14 Sep 2015 22:11:51 +0000 (23:11 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 14 Sep 2015 22:11:51 +0000 (23:11 +0100)
re2c/src/codegen/skeleton/generate_code.cc
re2c/src/codegen/skeleton/skeleton.cc

index 785bfdf4cee11a5cf20d4314aecd963adbadb368..7d849229c823bb7b1d89e221eb8b45cbaabed5b5 100644 (file)
@@ -28,6 +28,12 @@ static void exact_uint (OutputFile & o, size_t width)
 
 void Skeleton::emit_prolog (OutputFile & o, uint32_t maxfill) const
 {
+       const uint32_t default_rule = sizeof_key == 1
+               ? UINT8_MAX
+               : sizeof_key == 2
+                       ? UINT16_MAX
+                       : UINT32_MAX;
+
        o << "\n" << "#include <stdio.h>";
        o << "\n" << "#include <stdlib.h> // malloc, free";
        o << "\n" << "#include <string.h> // memset";
@@ -68,6 +74,15 @@ void Skeleton::emit_prolog (OutputFile & o, uint32_t maxfill) const
        o << "\n" << indString << "const long len_act = *cursor - token;";
        o << "\n" << indString << "const long len_exp = (long) match_length (keys, i);";
        o << "\n" << indString << "const YYKEYTYPE rule_exp = rule (keys, i);";
+       o << "\n" << indString << "if (rule_exp == " << default_rule << ")";
+       o << "\n" << indString << "{";
+       o << "\n" << indString << indString << "fprintf";
+       o << "\n" << indString << indString << indString << "( stderr";
+       o << "\n" << indString << indString << indString << ", \"warning: control flow is undefined for input\"";
+       o << "\n" << indString << indString << indString << indString << "\" at position %ld, rerun re2c with '-W'\\n\"";
+       o << "\n" << indString << indString << indString << ", pos";
+       o << "\n" << indString << indString << indString << ");";
+       o << "\n" << indString << "}";
        o << "\n" << indString << "if (len_act == len_exp && rule_act == rule_exp)";
        o << "\n" << indString << "{";
        o << "\n" << indString << indString << "*cursor = token + length (keys, i);";
@@ -77,7 +92,7 @@ void Skeleton::emit_prolog (OutputFile & o, uint32_t maxfill) const
        o << "\n" << indString << "{";
        o << "\n" << indString << indString << "fprintf";
        o << "\n" << indString << indString << indString << "( stderr";
-       o << "\n" << indString << indString << indString << ", \"error at position %ld (iteration %u):\\n\"";
+       o << "\n" << indString << indString << indString << ", \"error: at position %ld (iteration %u):\\n\"";
        o << "\n" << indString << indString << indString << indString << "\"\\texpected: match length %ld, rule %u\\n\"";
        o << "\n" << indString << indString << indString << indString << "\"\\tactual:   match length %ld, rule %u\\n\"";
        o << "\n" << indString << indString << indString << ", pos";
index 68cbc8b662dcc6ae861fb412fd22c6680b9add9f..616ada98f01590191a05db4a53b3dd4697980f0b 100644 (file)
@@ -60,7 +60,7 @@ Skeleton::Skeleton (const DFA & dfa)
        , line (dfa.line)
        , nodes_count (dfa.nStates + 1) // +1 for default state
        , nodes (new Node [nodes_count])
-       , sizeof_key (0)
+       , sizeof_key (4)
 {
        Node * n;
 
@@ -103,18 +103,14 @@ Skeleton::Skeleton (const DFA & dfa)
 
        // initialize size of key
        const uint32_t max = std::max (maxlen, maxrule);
-       if (max <= UINT8_MAX)
+       if (max < UINT8_MAX)
        {
                sizeof_key = 1;
        }
-       else if (max <= UINT16_MAX)
+       else if (max < UINT16_MAX)
        {
                sizeof_key = 2;
        }
-       else
-       {
-               sizeof_key = 4;
-       }
 }
 
 Skeleton::~Skeleton ()