mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 20:33:03 +00:00
Get action warnings (grammar_rule_check) right even when symbol
declarations appear after the rules. Don't mistake the type of $$ in a midrule to be that of its parent rule's $$. * src/reader.c (grammar_current_rule_end): Don't invoke grammar_rule_check yet since not all symbol declarations may have been parsed yet. (grammar_midrule_action): Likewise. Don't record whether the midrule's $$ has been used yet since actions haven't been translated yet. Record the midrule's parent rule and its RHS index within the parent rule. (grammar_current_rule_action_append): Don't translate the action yet since not all symbol declarations may have been parsed yet and, thus, warnings about types for $$, $n, @$, and @n can't be reported yet. (packgram): Translate the action and invoke grammar_rule_check now that all symbol declarations have been parsed. * src/scan-code.l (handle_action_dollar): Now that this is invoked after parsing the entire grammar file, the symbol list here in the case of a midrule is actually the midrule's empty RHS, so reference its parent rule's RHS where necessary. On the other hand, now that you can already know it's a midrule, you aren't forced to think $$ has the same type as its parent rule's $$. (handle_action_at): In the case of a midrule, reference the parent rule where necessary. * src/symlist.c (symbol_list_new): Initialize new midrule-related members. (symbol_list_length): Now that this is invoked after all rules have been parsed, a NULL symbol (rather than a NULL symbol list node) terminates a rule. symbol_list_print already does this correctly. * src/symlist.h (symbol_list.midrule_parent_rule, symbol_list.midrule_parent_rhs_index): New members so that midrules can remember their relationships with their parents. * tests/input.at (Type Clashes): Extend to catch the midrule $$ error fixed by the above patch. (_AT_UNUSED_VALUES_DECLARATIONS, AT_CHECK_UNUSED_VALUES): New m4 macros implementing... (Unused values): ... this old test case and... (Unused values before symbol declarations): ... this new test case. This one is the same as `Unused values' except that all symbol declarations appear after the rules in order to catch the rest of the errors fixed by the above patch.
This commit is contained in:
23
src/reader.c
23
src/reader.c
@@ -293,7 +293,6 @@ grammar_current_rule_end (location loc)
|
||||
/* Put an empty link in the list to mark the end of this rule */
|
||||
grammar_symbol_append (NULL, grammar_end->location);
|
||||
current_rule->location = loc;
|
||||
grammar_rule_check (current_rule);
|
||||
}
|
||||
|
||||
|
||||
@@ -326,10 +325,9 @@ grammar_midrule_action (void)
|
||||
midrule->action = current_rule->action;
|
||||
midrule->action_location = dummy_location;
|
||||
current_rule->action = NULL;
|
||||
/* If $$ was used in the action, the LHS of the enclosing rule was
|
||||
incorrectly flagged as used. */
|
||||
midrule->used = current_rule->used;
|
||||
current_rule->used = false;
|
||||
/* The action has not been translated yet, so $$ use hasn't been
|
||||
detected yet. */
|
||||
midrule->used = false;
|
||||
|
||||
if (previous_rule_end)
|
||||
previous_rule_end->next = midrule;
|
||||
@@ -338,7 +336,6 @@ grammar_midrule_action (void)
|
||||
|
||||
/* End the dummy's rule. */
|
||||
midrule->next = symbol_list_new (NULL, dummy_location);
|
||||
grammar_rule_check (midrule);
|
||||
midrule->next->next = current_rule;
|
||||
|
||||
previous_rule_end = midrule->next;
|
||||
@@ -347,6 +344,8 @@ grammar_midrule_action (void)
|
||||
the current rule. Bind it to its dedicated rule. */
|
||||
grammar_current_rule_symbol_append (dummy, dummy_location);
|
||||
grammar_end->midrule = midrule;
|
||||
midrule->midrule_parent_rule = current_rule;
|
||||
midrule->midrule_parent_rhs_index = symbol_list_length (current_rule->next);
|
||||
}
|
||||
|
||||
/* Set the precedence symbol of the current rule to PRECSYM. */
|
||||
@@ -405,9 +404,10 @@ grammar_current_rule_action_append (const char *action, location loc)
|
||||
{
|
||||
if (current_rule->action)
|
||||
grammar_midrule_action ();
|
||||
/* After all symbol declarations have been parsed, packgram invokes
|
||||
translate_rule_action. */
|
||||
current_rule->action = action;
|
||||
current_rule->action_location = loc;
|
||||
current_rule->action = translate_rule_action (current_rule);
|
||||
}
|
||||
|
||||
|
||||
@@ -444,9 +444,16 @@ packgram (void)
|
||||
rules[ruleno].precsym = NULL;
|
||||
rules[ruleno].location = p->location;
|
||||
rules[ruleno].useful = true;
|
||||
rules[ruleno].action = p->action;
|
||||
rules[ruleno].action = p->action ? translate_rule_action (p) : NULL;
|
||||
rules[ruleno].action_location = p->action_location;
|
||||
|
||||
/* If this rule contains midrules, rest assured that
|
||||
grammar_midrule_action inserted the midrules into grammar before this
|
||||
rule. Thus, the midrule actions have already been scanned in order to
|
||||
set `used' flags for this rule's rhs, so grammar_rule_check will work
|
||||
properly. */
|
||||
grammar_rule_check (p);
|
||||
|
||||
for (p = p->next; p && p->sym; p = p->next)
|
||||
{
|
||||
++rule_length;
|
||||
|
||||
Reference in New Issue
Block a user