mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
* src/reader.c (grammar_midrule_action): New, Eved out from
(readgram): here.
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
2002-06-11 Akim Demaille <akim@epita.fr>
|
||||
|
||||
* src/reader.c (grammar_midrule_action): New, Eved out from
|
||||
(readgram): here.
|
||||
|
||||
2002-06-11 Akim Demaille <akim@epita.fr>
|
||||
|
||||
* src/reader.c (grammar_rule_begin, previous_rule, current_rule):
|
||||
|
||||
79
src/reader.c
79
src/reader.c
@@ -1126,6 +1126,50 @@ grammar_rule_begin (symbol_t *lhs)
|
||||
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 @@ readgram (void)
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user