[Top][All Lists]
[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;
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- 03-grammar-midrule-action.patch,
Akim Demaille <=