]> git.saurik.com Git - bison.git/commitdiff
More information about the symbols.
authorAkim Demaille <demaille@gostai.com>
Sat, 16 Aug 2008 18:32:37 +0000 (20:32 +0200)
committerAkim Demaille <demaille@gostai.com>
Mon, 10 Nov 2008 10:58:01 +0000 (11:58 +0100)
* src/output.c (type_names_output): Document all the symbols,
including those that don't have a type-name.
(symbol_definitions_output): Define "is_token" and
"has_type_name".
* data/lalr1.cc (b4_type_action_): Skip symbols that have an empty
type-name, now that they are defined too in b4_type_names.

ChangeLog
data/lalr1.cc
src/output.c

index 380aa416bae09a596292f31209bea70dc5481568..df7bde07224865435817dd3b40ebf3227fbbc95e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2008-11-10  Akim Demaille  <demaille@gostai.com>
+
+       More information about the symbols.
+       * src/output.c (type_names_output): Document all the symbols,
+       including those that don't have a type-name.
+       (symbol_definitions_output): Define "is_token" and
+       "has_type_name".
+       * data/lalr1.cc (b4_type_action_): Skip symbols that have an empty
+       type-name, now that they are defined too in b4_type_names.
+
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Regen.
 2008-11-10  Akim Demaille  <demaille@gostai.com>
 
        Regen.
index 24b011bbd93c0903c5477cb923a894514d722567..40cdde23e8f4c084ba23377f3f791ab7579a28a8 100644 (file)
@@ -113,6 +113,17 @@ m4_define([b4_symbol],
 [m4_indir([b4_symbol($1, $2)])])
 
 
 [m4_indir([b4_symbol($1, $2)])])
 
 
+# b4_symbol_if(NUM, FIELD, IF-TRUE, IF-FALSE)
+# -------------------------------------------
+# If FIELD about symbol #NUM is 1 expand IF-TRUE, if is 0, expand IF-FALSE.
+# Otherwise an error.
+m4_define([b4_symbol_if],
+[m4_case(b4_symbol([$1], [$2]),
+         [1], [$3],
+         [0], [$4],
+         [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
+
+
 # b4_symbol_actions(FILENAME, LINENO,
 #                   SYMBOL-TAG, SYMBOL-NUM,
 #                   SYMBOL-ACTION, SYMBOL-TYPENAME)
 # b4_symbol_actions(FILENAME, LINENO,
 #                   SYMBOL-TAG, SYMBOL-NUM,
 #                   SYMBOL-ACTION, SYMBOL-TYPENAME)
@@ -143,14 +154,16 @@ m4_define([b4_symbol_case_],
 # b4_type_action_(NUMS)
 # ---------------------
 # Run actions for the symbol NUMS that all have the same type-name.
 # b4_type_action_(NUMS)
 # ---------------------
 # Run actions for the symbol NUMS that all have the same type-name.
+# Skip NUMS that have no type-name.
 m4_define([b4_type_action_],
 m4_define([b4_type_action_],
+[b4_symbol_if([$1], [has_type_name],
 [m4_map([b4_symbol_case_], [$@])[]dnl
         b4_dollar_dollar([b4_symbol([$1], [number])],
                          [b4_symbol([$1], [tag])],
                          [b4_symbol([$1], [type_name])]);
        break;
 
 [m4_map([b4_symbol_case_], [$@])[]dnl
         b4_dollar_dollar([b4_symbol([$1], [number])],
                          [b4_symbol([$1], [tag])],
                          [b4_symbol([$1], [type_name])]);
        break;
 
-])
+])])
 
 
 # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
 
 
 # b4_symbol_variant(YYTYPE, YYVAL, ACTION, [ARGS])
index 5950b4f71156af9eaee61aa11af329c79bd9de82..a7003edf99c59deac98191e7cd412a78514b6107 100644 (file)
@@ -320,28 +320,17 @@ static void
 type_names_output (FILE *out)
 {
   int i;
 type_names_output (FILE *out)
 {
   int i;
-  const char *isep = "";
   symbol **syms = symbols_by_type_name ();
   fputs ("m4_define([b4_type_names],\n[", out);
   symbol **syms = symbols_by_type_name ();
   fputs ("m4_define([b4_type_names],\n[", out);
-  for (i = 0; i < nsyms; )
-    if (syms[i]->type_name)
-      {
-        int j;
-        const char *jsep = "";
-        fprintf (out, "%s[", isep);
-        isep = ",\n";
-        for (j = i; j < nsyms; ++j)
-          {
-            if (syms[i]->type_name != syms[j]->type_name)
-              break;
-            fprintf (out, "%s%d", jsep, syms[j]->number);
-            jsep = ", ";
-          }
-        fputs ("]", out);
-        i = j;
-      }
-    else
-      ++i;
+  for (i = 0; i < nsyms; /* nothing */)
+    {
+      // The index of the first symbol of the current type-name.
+      int i0 = i;
+      fputs (i ? ",\n[" : "[", out);
+      for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i)
+        fprintf (out, "%s%d", i != i0 ? ", " : "", syms[i]->number);
+      fputs ("]", out);
+    }
   fputs ("])\n\n", out);
   free (syms);
 }
   fputs ("])\n\n", out);
   free (syms);
 }
@@ -431,9 +420,16 @@ symbol_definitions_output (FILE *out)
       SET_KEY("user_number");
       MUSCLE_INSERT_INT (key, sym->user_token_number);
 
       SET_KEY("user_number");
       MUSCLE_INSERT_INT (key, sym->user_token_number);
 
+      SET_KEY("is_token");
+      MUSCLE_INSERT_INT (key,
+                         i < ntokens && sym != errtoken && sym != undeftoken);
+
       SET_KEY("number");
       MUSCLE_INSERT_INT (key, sym->number);
 
       SET_KEY("number");
       MUSCLE_INSERT_INT (key, sym->number);
 
+      SET_KEY("has_type_name");
+      MUSCLE_INSERT_INT (key, !!sym->type_name);
+
       SET_KEY("type_name");
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
 
       SET_KEY("type_name");
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");