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>
|
2002-06-11 Akim Demaille <akim@epita.fr>
|
||||||
|
|
||||||
* src/reader.c (grammar_rule_begin, previous_rule, current_rule):
|
* 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);
|
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
|
static void
|
||||||
readgram (void)
|
readgram (void)
|
||||||
{
|
{
|
||||||
@@ -1204,40 +1248,7 @@ readgram (void)
|
|||||||
non-terminal. */
|
non-terminal. */
|
||||||
if (action_flag)
|
if (action_flag)
|
||||||
{
|
{
|
||||||
/* Since the action was written out with this rule's
|
grammar_midrule_action ();
|
||||||
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);
|
|
||||||
action_flag = 0;
|
action_flag = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user