X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/da4160c30ae623f732447afa85ea08984abc2315..1485e106a4617cd9c50bcd322baa4cea81a63e50:/src/reader.c diff --git a/src/reader.c b/src/reader.c index 884f043b..949d74bb 100644 --- a/src/reader.c +++ b/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; }