]> git.saurik.com Git - bison.git/commitdiff
Use the symbol properties to output the printer/destructor for lalr1.cc.
authorAkim Demaille <demaille@gostai.com>
Thu, 27 Nov 2008 20:47:11 +0000 (21:47 +0100)
committerAkim Demaille <demaille@gostai.com>
Mon, 1 Dec 2008 21:19:11 +0000 (22:19 +0100)
Instead of defining complex list of tuples to define various properties of
the symbols, we now prefer to define symbols as "structs" in m4: using the
symbol key (its number), and the property name, b4_symbol gives it value.
Use this to handle destructors and printers.

* src/output.c (CODE_PROP): New.
(prepare_symbol_definitions): Use it to define the printer and
destructor related attributes of the symbols.
* data/lalr1.cc (b4_symbol_actions): Rename as...
(b4_symbol_action): this.
Use b4_symbol instead of 6 arguments.
(b4_symbol_printer, b4_symbol_destructor): New.
Use them instead of b4_symbol_actions.

ChangeLog
data/lalr1.cc
src/output.c

index 9890b5fabff5d640a7c6df1be6d34e5db34c1d6e..bb18059cb3e88091241a2bba2e1a29ebc967de23 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,20 @@
+2008-12-01  Akim Demaille  <demaille@gostai.com>
+
+       Use the symbol properties to output the printer/destructor for lalr1.cc.
+       Instead of defining complex list of tuples to define various properties of
+       the symbols, we now prefer to define symbols as "structs" in m4: using the
+       symbol key (its number), and the property name, b4_symbol gives it value.
+       Use this to handle destructors and printers.
+       
+       * src/output.c (CODE_PROP): New.
+       (prepare_symbol_definitions): Use it to define the printer and
+       destructor related attributes of the symbols.
+       * data/lalr1.cc (b4_symbol_actions): Rename as...
+       (b4_symbol_action): this.
+       Use b4_symbol instead of 6 arguments.
+       (b4_symbol_printer, b4_symbol_destructor): New.
+       Use them instead of b4_symbol_actions.
+
 2008-12-01  Akim Demaille  <demaille@gostai.com>
 
        Avoid capturing variables too easily.
 2008-12-01  Akim Demaille  <demaille@gostai.com>
 
        Avoid capturing variables too easily.
index 0ccf223737b0d81c452e2eb0232b85a2e0f739d3..76a0bcf2f8cb6bfaef845588219430855f248442 100644 (file)
@@ -152,23 +152,33 @@ m4_define([b4_symbol_if],
          [m4_fatal([$0: field $2 of $1 is not a Boolean:] b4_symbol([$1], [$2]))])])
 
 
          [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_action(SYMBOL-NUM, KIND)
+# ----------------------------------
+# Run the action KIND (destructor or printer) for SYMBOL-NUM.
 # Same as in C, but using references instead of pointers.
 # Same as in C, but using references instead of pointers.
-m4_define([b4_symbol_actions],
+m4_define([b4_symbol_action],
+[b4_symbol_if([$1], [has_$2],
 [m4_pushdef([b4_dollar_dollar],
 [m4_pushdef([b4_dollar_dollar],
-            [b4_symbol_value_template([yysym.value], [$6])])dnl
+    [b4_symbol_value_template([yysym.value],
+                              b4_symbol_if([$1], [has_type],
+                                           [b4_symbol([$1], [type])]))])dnl
 m4_pushdef([b4_at_dollar], [yysym.location])dnl
 m4_pushdef([b4_at_dollar], [yysym.location])dnl
-      case $4: // $3
-b4_syncline([$2], [$1])
-        $5;
+      case $1: // b4_symbol([$1], [tag])
+b4_syncline([b4_symbol([$1], [$2_line])], ["b4_symbol([$1], [$2_file])"])
+        b4_symbol([$1], [$2])
 b4_syncline([@oline@], [@ofile@])
         break;
 b4_syncline([@oline@], [@ofile@])
         break;
+
 m4_popdef([b4_at_dollar])dnl
 m4_popdef([b4_dollar_dollar])dnl
 m4_popdef([b4_at_dollar])dnl
 m4_popdef([b4_dollar_dollar])dnl
-])
+])])
+
+
+# b4_symbol_destructor(SYMBOL-NUM)
+# b4_symbol_printer(SYMBOL-NUM)
+# --------------------------------
+m4_define([b4_symbol_destructor], [b4_symbol_action([$1], [destructor])])
+m4_define([b4_symbol_printer],    [b4_symbol_action([$1], [printer])])
 
 
 # b4_symbol_case_(SYMBOL-NUM)
 
 
 # b4_symbol_case_(SYMBOL-NUM)
@@ -1027,9 +1037,9 @@ b4_percent_code_get[]dnl
     // User destructor.
     switch (yytype)
       {
     // User destructor.
     switch (yytype)
       {
-]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
-       default:
-         break;
+]m4_map([b4_symbol_destructor], m4_defn([b4_symbol_numbers]))dnl
+[       default:
+          break;
       }]b4_variant_if([
 
     // Type destructor.
       }]b4_variant_if([
 
     // Type destructor.
@@ -1048,8 +1058,8 @@ b4_percent_code_get[]dnl
         << yysym.location << ": "])[;
     switch (yytype)
       {
         << yysym.location << ": "])[;
     switch (yytype)
       {
-]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))[
-       default:
+]m4_map([b4_symbol_printer], m4_defn([b4_symbol_numbers]))dnl
+[       default:
          break;
       }
     yyo << ')';
          break;
       }
     yyo << ')';
index bcd719126f08814a572d6035a7365153f379a3ab..6fcff5ff6d9208b68036d6cf4bed03bc151344f4 100644 (file)
@@ -428,6 +428,28 @@ prepare_symbol_definitions (void)
       SET_KEY("type");
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
 
       SET_KEY("type");
       MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : "");
 
+#define CODE_PROP(PropName)                                             \
+      do {                                                              \
+        code_props const *p = symbol_ ## PropName ## _get (sym);        \
+        SET_KEY("has_" #PropName);                                      \
+        MUSCLE_INSERT_INT (key, !!p->code);                             \
+                                                                        \
+        if (p->code)                                                    \
+          {                                                             \
+            SET_KEY(#PropName "_file");                                 \
+            MUSCLE_INSERT_STRING (key, p->location.start.file);         \
+                                                                        \
+            SET_KEY(#PropName "_line");                                 \
+            MUSCLE_INSERT_INT (key, p->location.start.line);            \
+                                                                        \
+            SET_KEY(#PropName);                                         \
+            MUSCLE_INSERT_STRING_RAW (key, p->code);                    \
+          }                                                             \
+      } while (0)
+
+      CODE_PROP(destructor);
+      CODE_PROP(printer);
+#undef CODE_PROP
 #undef SET_KEY
     }
 }
 #undef SET_KEY
     }
 }