]> git.saurik.com Git - bison.git/commitdiff
Inform m4 whether a tag is a valid id.
authorAkim Demaille <demaille@gostai.com>
Mon, 18 Aug 2008 13:48:45 +0000 (15:48 +0200)
committerAkim Demaille <demaille@gostai.com>
Tue, 11 Nov 2008 14:12:28 +0000 (15:12 +0100)
* src/output.c (is_identifier): New.
(symbol_definitions_output): Use it to define tag_is_id.
But maybe this should be done at m4 level?

ChangeLog
src/output.c

index 4d59ee0385f9588b952be7f2aa65bfee77f766a0..2aa7ec7f670d810951c9f868be1825ab06ce0467 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2008-11-11  Akim Demaille  <demaille@gostai.com>
+
+       Inform m4 whether a tag is a valid id.
+       * src/output.c (is_identifier): New.
+       (symbol_definitions_output): Use it to define tag_is_id.
+       But maybe this should be done at m4 level?
+
 2008-11-11  Akim Demaille  <demaille@gostai.com>
 
        Test 214 was failing: it greps with a pattern containing [     ]*
 2008-11-11  Akim Demaille  <demaille@gostai.com>
 
        Test 214 was failing: it greps with a pattern containing [     ]*
index a7003edf99c59deac98191e7cd412a78514b6107..afcec94956b05cce53ea896b3533438c82c5d076 100644 (file)
@@ -396,6 +396,26 @@ merger_output (FILE *out)
 }
 
 
 }
 
 
+/*----------------------------------.
+| Whether S is a valid identifier.  |
+`----------------------------------*/
+
+static bool
+is_identifier (uniqstr s)
+{
+  static char const alphanum[26 + 26 + 1 + 10] =
+    "abcdefghijklmnopqrstuvwxyz"
+    "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+    "_"
+    "0123456789";
+  if (!s || ! memchr (alphanum, *s, sizeof alphanum - 10))
+    return false;
+  for (++s; *s; ++s)
+    if (! memchr (alphanum, *s, sizeof alphanum))
+      return false;
+  return true;
+}
+
 /*---------------------------------------.
 | Output the symbol definitions to OUT.  |
 `---------------------------------------*/
 /*---------------------------------------.
 | Output the symbol definitions to OUT.  |
 `---------------------------------------*/
@@ -414,6 +434,11 @@ symbol_definitions_output (FILE *out)
       obstack_1grow (&format_obstack, 0);                               \
       key = obstack_finish (&format_obstack);
 
       obstack_1grow (&format_obstack, 0);                               \
       key = obstack_finish (&format_obstack);
 
+      // Whether the tag is a valid identifier.
+      SET_KEY("tag_is_id");
+      MUSCLE_INSERT_INT (key, is_identifier(sym->tag));
+
+      // The inner tag.
       SET_KEY("tag");
       MUSCLE_INSERT_STRING (key, sym->tag);
 
       SET_KEY("tag");
       MUSCLE_INSERT_STRING (key, sym->tag);