]> git.saurik.com Git - bison.git/commitdiff
symbol: provide an easy means to compare them in source order
authorAkim Demaille <akim@lrde.epita.fr>
Mon, 9 Dec 2013 14:40:07 +0000 (15:40 +0100)
committerAkim Demaille <akim@lrde.epita.fr>
Mon, 9 Dec 2013 15:03:03 +0000 (16:03 +0100)
* src/symtab.c (symbols_sort): New.
(user_token_number_redeclaration): Taken from here.

src/symtab.c

index 1c2372c12f05e7c75f7d79ea1daba4bb8e5766e1..1b446119ce99498e0598b444d7f3426c0af3c92f 100644 (file)
@@ -100,6 +100,28 @@ symbol_new (uniqstr tag, location loc)
   return res;
 }
 
+/* If needed, swap first and second so that first has the earliest
+   location (according to location_cmp).
+
+   Many symbol features (e.g., user token numbers) are not assigned
+   during the parsing, but in a second step, via a traversal of the
+   symbol table sorted on tag.
+
+   However, error messages make more sense if we keep the first
+   declaration first.
+*/
+
+static
+void symbols_sort (symbol **first, symbol **second)
+{
+  if (0 < location_cmp ((*first)->location, (*second)->location))
+    {
+      symbol* tmp = *first;
+      *first = *second;
+      *second = tmp;
+    }
+}
+
 char const *
 code_props_type_string (code_props_type kind)
 {
@@ -587,17 +609,7 @@ static void
 user_token_number_redeclaration (int num, symbol *first, symbol *second)
 {
   unsigned i = 0;
-  /* User token numbers are not assigned during the parsing, but in a
-     second step, via a traversal of the symbol table sorted on tag.
-
-     However, error messages make more sense if we keep the first
-     declaration first.  */
-  if (location_cmp (first->location, second->location) > 0)
-    {
-      symbol* tmp = first;
-      first = second;
-      second = tmp;
-    }
+  symbols_sort (&first, &second);
   complain_indent (&second->location, complaint, &i,
                    _("user token number %d redeclaration for %s"),
                    num, second->tag);