bison-patches
[Top][All Lists]
Advanced

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

03-grammar-midrule-action.patch


From: Akim Demaille
Subject: 03-grammar-midrule-action.patch
Date: Tue, 11 Jun 2002 10:05:54 +0200

Index: ChangeLog
from  Akim Demaille  <address@hidden>

        * src/reader.c (grammar_midrule_action): New, Eved out from
        (readgram): here.

Index: src/reader.c
--- src/reader.c Mon, 10 Jun 2002 21:38:01 +0200 akim (bison/b/5_reader.c 
1.77.1.3.1.18.1.7.1.2 664)
+++ src/reader.c Mon, 10 Jun 2002 21:43:25 +0200 akim (bison/b/5_reader.c 
1.77.1.3.1.18.1.7.1.2 664)
@@ -1126,6 +1126,50 @@
     complain (_("rule given for %s, which is a token"), lhs->tag);
 }

+/* The previous action turns out the be a mid-rule action.  Attach it
+   to the current rule, i.e., create a dummy symbol, attach it this
+   mid-rule action, and append this dummy nonterminal to the current
+   rule.  */
+
+static void
+grammar_midrule_action (void)
+{
+  /* Since the action was written out with this rule's number, we must
+     give the new rule this number by inserting the new rule before
+     it.  */
+
+  /* Make a dummy nonterminal, a gensym.  */
+  symbol_t *sdummy = gensym ();
+  symbol_list *midrule_action = symbol_list_new (sdummy);
+
+  /* Make a new rule, whose body is empty, before the current one, so
+     that the action just read can belong to it.  */
+  ++nrules;
+  ++nritems;
+  /* Attach its lineno to that of the host rule.  */
+  midrule_action->line = current_rule->line;
+  /* Move the action from the host rule to this one.  */
+  midrule_action->action = current_rule->action;
+  midrule_action->action_line = current_rule->action_line;
+  current_rule->action = NULL;
+
+  if (previous_rule)
+    previous_rule->next = midrule_action;
+  else
+    grammar = midrule_action;
+
+  /* End of the rule. */
+  previous_rule = symbol_list_new (NULL);
+  previous_rule->next = current_rule;
+
+  midrule_action->next = previous_rule;
+
+  /* Insert the dummy generated by that rule into this rule.  */
+  ++nritems;
+  grammar_symbol_append (sdummy);
+}
+
+
 static void
 readgram (void)
 {
@@ -1204,40 +1248,7 @@
               non-terminal.  */
            if (action_flag)
              {
-               /* Since the action was written out with this rule's
-                  number, we must give the new rule this number by
-                  inserting the new rule before it.  */
-
-               /* Make a dummy nonterminal, a gensym.  */
-               symbol_t *sdummy = gensym ();
-               symbol_list *p = symbol_list_new (sdummy);
-
-               /* Make a new rule, whose body is empty, before the
-                  current one, so that the action just read can
-                  belong to it.  */
-               ++nrules;
-               ++nritems;
-               /* Attach its lineno to that of the host rule. */
-               p->line = current_rule->line;
-               /* Move the action from the host rule to this one. */
-               p->action = current_rule->action;
-               p->action_line = current_rule->action_line;
-               current_rule->action = NULL;
-
-               if (previous_rule)
-                 previous_rule->next = p;
-               else
-                 grammar = p;
-               /* End of the rule. */
-               previous_rule = symbol_list_new (NULL);
-               previous_rule->next = current_rule;
-
-               p->next = previous_rule;
-
-               /* Insert the dummy generated by that rule into this
-                  rule.  */
-               ++nritems;
-               grammar_symbol_append (sdummy);
+               grammar_midrule_action ();
                action_flag = 0;
              }



reply via email to

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