]> granicus.if.org Git - re2c/commitdiff
Unified location output in warning messages.
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 27 Jul 2015 14:12:49 +0000 (15:12 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 27 Jul 2015 14:12:49 +0000 (15:12 +0100)
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/src/codegen/prepare_dfa.cc
re2c/src/conf/msg.cc
re2c/src/conf/msg.h
re2c/src/conf/warn.cc
re2c/src/conf/warn.h
re2c/src/parse/parser.ypp

index 520e62b7b79b8c4447777d7dd5b005ddd566a294..e8e26c4d7bf54586b8362e56b286dd50cd2d3cc4 100644 (file)
@@ -37,6 +37,7 @@ OutputBlock::OutputBlock ()
        , used_yyaccept (false)
        , force_start_label (false)
        , user_start_label ()
+       , line (0)
 {
        fragments.push_back (new OutputFragment (OutputFragment::CODE, 0));
 }
@@ -227,6 +228,16 @@ bool OutputFile::get_force_start_label () const
        return blocks.back ()->force_start_label;
 }
 
+void OutputFile::set_block_line (uint32_t l)
+{
+       blocks.back ()->line = l;
+}
+
+uint32_t OutputFile::get_block_line () const
+{
+       return blocks.back ()->line;
+}
+
 void OutputFile::new_block ()
 {
        blocks.push_back (new OutputBlock ());
index 4890a7f4649ccc95b0055b71e8375c95a89af8fd..1f584da196c2a53089f2ddeeb0208cdd8b65b541 100644 (file)
@@ -40,6 +40,7 @@ struct OutputBlock
        bool used_yyaccept;
        bool force_start_label;
        std::string user_start_label;
+       uint32_t line;
 
        OutputBlock ();
        ~OutputBlock ();
@@ -92,6 +93,8 @@ public:
        void set_force_start_label (bool force);
        void set_user_start_label (const std::string & label);
        bool get_force_start_label () const;
+       void set_block_line (uint32_t l);
+       uint32_t get_block_line () const;
 
        void emit (const std::vector<std::string> & types, uint32_t max_fill);
 
index 4b9049894c2a2df199a5c1d2998ebca55acc9e7d..4286419e7c0120f1fdaa25ba73c0a85de2e0b3c9 100644 (file)
@@ -251,7 +251,7 @@ void DFA::prepare(OutputFile & o, uint32_t & max_fill)
        // warn if default case is not handled
        if (default_state && !stray_cunits.empty () && !empty_rule)
        {
-               warn.naked_default (stray_cunits);
+               warn.naked_default (o.get_block_line (), stray_cunits);
        }
 
        // warn about not shadowed rule that matches empty string
index b16e6ff06e1ce4b4b59eef794eef2969ffef1c55..b8a20c69b24c1f4cfbf8004323d3fa734a8691cf 100644 (file)
@@ -24,9 +24,9 @@ void error_encoding ()
        error ("only one of switches -e, -w, -x, -u and -8 must be set");
 }
 
-void warning (const char * type, const char * fmt, ...)
+void warning (const char * type, uint32_t line, const char * fmt, ...)
 {
-       fprintf (stderr, "re2c: warning: ");
+       fprintf (stderr, "re2c: warning: line %u: ", line);
 
        va_list args;
        va_start (args, fmt);
index 75239545dce24062b33a641f139ec8cde1adef59..c3eed6087238cfd7a6173cc4adffeca542294ff5 100644 (file)
@@ -2,12 +2,13 @@
 #define _RE2C_CONF_MSG_
 
 #include "src/util/attribute.h"
+#include "src/util/c99_stdint.h"
 
 namespace re2c {
 
 void error (const char * fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 1, 2)));
 void error_encoding ();
-void warning (const char * type, const char * fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 2, 3)));
+void warning (const char * type, uint32_t line, const char * fmt, ...) RE2C_GXX_ATTRIBUTE ((format (printf, 3, 4)));
 void usage ();
 void vernum ();
 void version ();
index 15cfdc06671d86608070e816ca230e7f05e5fa4b..23714d04d4be9f8298a4bc7e8dc982fdf7983e9a 100644 (file)
@@ -70,7 +70,7 @@ void Warn::empty_class (uint32_t line)
                {
                        error_accuml = true;
                }
-               warning (names[EMPTY_CHARACTER_CLASS], "empty character class at line %u", line);
+               warning (names[EMPTY_CHARACTER_CLASS], line, "empty character class");
        }
 }
 
@@ -82,11 +82,11 @@ void Warn::match_empty_string (uint32_t line)
                {
                        error_accuml = true;
                }
-               warning (names[MATCH_EMPTY_STRING], "rule matches empty string at line %u", line);
+               warning (names[MATCH_EMPTY_STRING], line, "rule matches empty string");
        }
 }
 
-void Warn::naked_default (const std::vector<std::pair<uint32_t, uint32_t> > & stray_cunits)
+void Warn::naked_default (uint32_t line, const std::vector<std::pair<uint32_t, uint32_t> > & stray_cunits)
 {
        if (mask[NAKED_DEFAULT] & WARNING)
        {
@@ -99,7 +99,7 @@ void Warn::naked_default (const std::vector<std::pair<uint32_t, uint32_t> > & st
                {
                        printSpan (s, stray_cunits[i].first, stray_cunits[i].second);
                }
-               warning (names[NAKED_DEFAULT], "naked default case (stray code units: %s), better add default rule *", s.str ().c_str ());
+               warning (names[NAKED_DEFAULT], line, "naked default case (stray code units: %s), better add default rule *", s.str ().c_str ());
        }
 }
 
index e74ae220e3975f09c175f5879534c2ee72b2669f..69a477a5a97165fa428d2240a7e5ec2229cfd498 100644 (file)
@@ -45,7 +45,7 @@ public:
        void set_all (option_t o);
        void empty_class (uint32_t line);
        void match_empty_string (uint32_t line);
-       void naked_default (const std::vector<std::pair<uint32_t, uint32_t> > & stray_cunits);
+       void naked_default (uint32_t line, const std::vector<std::pair<uint32_t, uint32_t> > & stray_cunits);
 };
 
 } // namespace re2c
index 14c3f941dc900cf771de78e8ca089dae65828347..e29204b8bee0653756d8cedd427465350b981c61 100644 (file)
@@ -577,6 +577,7 @@ void parse(Scanner& i, Output & o)
                        }
                        encodingOld = encoding;
                }
+               o.source.set_block_line (in->get_cline ());
                if (cFlag)
                {
                        RegExpMap::iterator it;