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

(readgram): here.
This commit is contained in:
Akim Demaille
2002-06-11 08:08:06 +00:00
parent da4160c30a
commit 1485e106a4
2 changed files with 50 additions and 34 deletions

View File

@@ -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):

View File

@@ -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;
} }