bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

FYI: Actions and Rules


From: Akim Demaille
Subject: FYI: Actions and Rules
Date: 15 Dec 2001 15:08:32 +0100
User-agent: Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.4 (Civil Service)

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        Attach actions to rules, instead of pre-outputting them to
        actions_obstack.

        * src/gram.h (rule_t): action and action_line are new members.
        * src/reader.c (symbol_list): Likewise.
        (copy_action): Save the actions within the rule.
        (packgram): Save them in rule_table.
        * src/output.c (actions_output): New.
        (output_parser): Use it on `%%actions'.
        (output_rule_data): Don't free rule_table.
        (output): Do it.
        (prepare): Don't save the `action' muscle.
        * src/bison.simple: s/%%action/%%actions/.

Index: src/bison.simple
===================================================================
RCS file: /cvsroot/bison/bison/src/bison.simple,v
retrieving revision 1.88
diff -u -u -r1.88 bison.simple
--- src/bison.simple 14 Dec 2001 01:52:50 -0000 1.88
+++ src/bison.simple 15 Dec 2001 14:13:44 -0000
@@ -891,7 +891,7 @@
 #endif
   switch (yyn)
     {
-      %%action
+%%actions
     }
 #line %%line "%%skeleton"
 
Index: src/gram.h
===================================================================
RCS file: /cvsroot/bison/bison/src/gram.h,v
retrieving revision 1.13
diff -u -u -r1.13 gram.h
--- src/gram.h 5 Dec 2001 09:29:02 -0000 1.13
+++ src/gram.h 15 Dec 2001 14:13:44 -0000
@@ -122,6 +122,8 @@
   short assoc;
   short line;
   bool useful;
+  const char *action;
+  short action_line;
 } rule_t;
 
 extern struct rule_s *rule_table;
Index: src/output.c
===================================================================
RCS file: /cvsroot/bison/bison/src/output.c,v
retrieving revision 1.88
diff -u -u -r1.88 output.c
--- src/output.c 14 Dec 2001 15:39:05 -0000 1.88
+++ src/output.c 15 Dec 2001 14:13:44 -0000
@@ -285,8 +285,6 @@
                     0, 1, nrules + 1);
   muscle_insert ("r2", obstack_finish (&output_obstack));
   XFREE (short_tab);
-
-  XFREE (rule_table + 1);
 }
 
 /*------------------------------------------------------------------.
@@ -512,6 +510,34 @@
 }
 
 
+/*-----------------------------.
+| Output the actions to OOUT.  |
+`-----------------------------*/
+
+static void
+actions_output (struct obstack *oout)
+{
+  int rule;
+  for (rule = 1; rule < nrules + 1; ++rule)
+    if (rule_table[rule].action)
+      {
+       obstack_fgrow1 (oout, "  case %d:\n", rule);
+
+       if (!no_lines_flag)
+         obstack_fgrow2 (oout, muscle_find ("linef"),
+                         rule_table[rule].action_line,
+                         quotearg_style (c_quoting_style,
+                                         muscle_find ("filename")));
+       obstack_1grow (oout, '{');
+       obstack_sgrow (oout, rule_table[rule].action);
+       /* As a Bison extension, add the ending semicolon.  Since some
+          Yacc don't do that, help people using bison as a Yacc
+          finding their missing semicolons.  */
+       obstack_fgrow1 (oout, "%s}\n    break;\n\n", yacc_flag ? ";" : "");
+      }
+}
+
+
 static void
 save_column (int symbol, int default_state)
 {
@@ -931,10 +957,12 @@
          /* Output the right value, or see if it's something special.  */
          muscle_key = obstack_finish (&muscle_obstack);
          muscle_value = muscle_find (muscle_key);
-         if (muscle_value)
-           obstack_sgrow (oout, muscle_value);
+         if (!strcmp (muscle_key, "actions"))
+           actions_output (oout);
          else if (!strcmp (muscle_key, "line"))
            obstack_fgrow1 (oout, "%d", line + 1);
+         else if (muscle_value)
+           obstack_sgrow (oout, muscle_value);
          else
            {
              obstack_sgrow (oout, "%%");
@@ -1011,11 +1039,6 @@
   MUSCLE_INSERT_INT ("ntokens", ntokens);
 
   MUSCLE_INSERT_INT ("locations-flag", locations_flag);
-
-  /* We need to save the actions in the muscle %%action.  */
-  obstack_1grow (&action_obstack, 0);
-  muscle_insert ("action", obstack_finish (&action_obstack));
-
 }
 
 /*----------------------------------------------------------.
@@ -1044,6 +1067,7 @@
 
   output_master_parser ();
 
+  free (rule_table + 1);
   obstack_free (&muscle_obstack, 0);
   obstack_free (&output_obstack, 0);
   obstack_free (&action_obstack, 0);
Index: src/reader.c
===================================================================
RCS file: /cvsroot/bison/bison/src/reader.c,v
retrieving revision 1.118
diff -u -u -r1.118 reader.c
--- src/reader.c 15 Dec 2001 11:09:05 -0000 1.118
+++ src/reader.c 15 Dec 2001 14:13:44 -0000
@@ -41,6 +41,9 @@
   struct symbol_list *next;
   bucket *sym;
   int line;
+  /* The action is attached to the LHS of a rule. */
+  const char *action;
+  int action_line;
   bucket *ruleprec;
 }
 symbol_list;
@@ -1131,16 +1134,6 @@
   if (semantic_parser)
     stack_offset = 0;
 
-  obstack_fgrow1 (&action_obstack, "\ncase %d:\n", nrules);
-
-  if (!no_lines_flag)
-    {
-      obstack_fgrow2 (&action_obstack, muscle_find ("linef"),
-                     lineno, quotearg_style (c_quoting_style,
-                                             muscle_find ("filename")));
-    }
-  obstack_1grow (&action_obstack, '{');
-
   count = 1;
   c = getc (finput);
 
@@ -1198,13 +1191,9 @@
        }
     }
 
-  /* As a Bison extension, add the ending semicolon.  Since some Yacc
-     don't do that, help people using bison as a Yacc finding their
-     missing semicolons.  */
-  if (yacc_flag)
-    obstack_sgrow (&action_obstack, "}\n    break;");
-  else
-    obstack_sgrow (&action_obstack, ";\n    break;}");
+  obstack_1grow (&action_obstack, '\0');
+  rule->action = obstack_finish (&action_obstack);
+  rule->action_line = lineno;
 }
 
 /*-------------------------------------------------------------------.
@@ -1879,6 +1868,8 @@
       rule_table[ruleno].rhs = itemno;
       rule_table[ruleno].line = p->line;
       rule_table[ruleno].useful = TRUE;
+      rule_table[ruleno].action = p->action;
+      rule_table[ruleno].action_line = p->action_line;
 
       p = p->next;
       while (p && p->sym)
Index: src/symtab.h
===================================================================
RCS file: /cvsroot/bison/bison/src/symtab.h,v
retrieving revision 1.15
diff -u -u -r1.15 symtab.h
--- src/symtab.h 23 Nov 2001 14:13:02 -0000 1.15
+++ src/symtab.h 15 Dec 2001 14:13:44 -0000
@@ -50,13 +50,13 @@
   short prec;
   associativity assoc;
   short user_token_number;
+
   /* Points to the other in the identifier-symbol pair for an
      alias. Special value SALIAS in the identifier half of the
      identifier-symbol pair for an alias.  */
   struct bucket *alias;
   symbol_class class;
-}
-bucket;
+} bucket;
 
 
 extern bucket *firstsymbol;



reply via email to

[Prev in Thread] Current Thread [Next in Thread]