Warn about unset midrule $$ if the corresponding $n is used.

* src/reader.c (symbol_should_be_used): Check midrule parent rule for
$n usage.
(packgram): Before invoking grammar_rule_check on any rule, make sure
all actions have already been scanned in order to set `used' flags.
Otherwise, checking that a midrule's $$ is set will not always work
properly because the midrule check must forward-reference the midrule's
parent rule.
* tests/input.at (AT_CHECK_UNUSED_VALUES): Extend to check the new
warning.
This commit is contained in:
Joel E. Denny
2006-10-21 02:31:50 +00:00
parent a501eca911
commit 519d000408
3 changed files with 43 additions and 15 deletions

View File

@@ -1,3 +1,16 @@
2006-10-20 Joel E. Denny <jdenny@ces.clemson.edu>
Warn about unset midrule $$ if the corresponding $n is used.
* src/reader.c (symbol_should_be_used): Check midrule parent rule for
$n usage.
(packgram): Before invoking grammar_rule_check on any rule, make sure
all actions have already been scanned in order to set `used' flags.
Otherwise, checking that a midrule's $$ is set will not always work
properly because the midrule check must forward-reference the midrule's
parent rule.
* tests/input.at (AT_CHECK_UNUSED_VALUES): Extend to check the new
warning.
2006-10-20 Joel E. Denny <jdenny@ces.clemson.edu> 2006-10-20 Joel E. Denny <jdenny@ces.clemson.edu>
More improvements to the documentation of the prologue alternatives: More improvements to the documentation of the prologue alternatives:

View File

@@ -252,7 +252,10 @@ static bool
symbol_should_be_used (symbol_list const *s) symbol_should_be_used (symbol_list const *s)
{ {
return (symbol_destructor_get (s->content.sym) return (symbol_destructor_get (s->content.sym)
|| (s->midrule && s->midrule->used)); || (s->midrule && s->midrule->used)
|| (s->midrule_parent_rule
&& symbol_list_n_get (s->midrule_parent_rule,
s->midrule_parent_rhs_index)->used));
} }
/*----------------------------------------------------------------. /*----------------------------------------------------------------.
@@ -456,6 +459,20 @@ packgram (void)
rules = xnmalloc (nrules, sizeof *rules); rules = xnmalloc (nrules, sizeof *rules);
/* Before invoking grammar_rule_check on any rule, make sure
all actions have already been scanned in order to set `used' flags.
Otherwise, checking that a midrule's $$ is set will not always work
properly because the midrule check must forward-reference the midrule's
parent rule. */
while (p)
{
if (p->action)
p->action = translate_rule_action (p);
if (p)
p = p->next;
}
p = grammar;
while (p) while (p)
{ {
int rule_length = 0; int rule_length = 0;
@@ -472,14 +489,9 @@ packgram (void)
rules[ruleno].precsym = NULL; rules[ruleno].precsym = NULL;
rules[ruleno].location = p->location; rules[ruleno].location = p->location;
rules[ruleno].useful = true; rules[ruleno].useful = true;
rules[ruleno].action = p->action ? translate_rule_action (p) : NULL; rules[ruleno].action = p->action;
rules[ruleno].action_location = p->action_location; 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. */
/* Don't check the generated rule 0. It has no action, so some rhs /* Don't check the generated rule 0. It has no action, so some rhs
symbols may appear unused, but the parsing algorithm ensures that symbols may appear unused, but the parsing algorithm ensures that
%destructor's are invoked appropriately. */ %destructor's are invoked appropriately. */

View File

@@ -103,8 +103,8 @@ start:
a: INT | INT { } INT { } INT { }; a: INT | INT { } INT { } INT { };
b: INT | /* empty */; b: INT | /* empty */;
c: INT | INT { $]1[ } INT { } INT { }; c: INT | INT { $]1[ } INT { $<integer>2 } INT { $<integer>4 };
d: INT | INT { } INT { $]1[ } INT { }; d: INT | INT { } INT { $]1[ } INT { $<integer>2 };
e: INT | INT { } INT { } INT { $]1[ }; e: INT | INT { } INT { } INT { $]1[ };
f: INT | INT { } INT { } INT { $]$[ = $]1[ + $]3[ + $]5[; }; f: INT | INT { } INT { } INT { $]$[ = $]1[ + $]3[ + $]5[; };
g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { }; g: INT | INT { $<integer>$; } INT { $<integer>$; } INT { };
@@ -122,12 +122,15 @@ input.y:11.10-32: warning: unused value: $]1[
input.y:11.10-32: warning: unused value: $]3[ input.y:11.10-32: warning: unused value: $]3[
input.y:11.10-32: warning: unused value: $]5[ input.y:11.10-32: warning: unused value: $]5[
input.y:12.9: warning: empty rule for typed nonterminal, and no action input.y:12.9: warning: empty rule for typed nonterminal, and no action
input.y:13.10-35: warning: unset value: $]$[ input.y:13.14-19: warning: unset value: $$
input.y:13.10-35: warning: unused value: $]3[ input.y:13.25-39: warning: unset value: $$
input.y:13.10-35: warning: unused value: $]5[ input.y:13.10-59: warning: unset value: $]$[
input.y:14.10-35: warning: unset value: $]$[ input.y:13.10-59: warning: unused value: $]3[
input.y:14.10-35: warning: unused value: $]3[ input.y:13.10-59: warning: unused value: $]5[
input.y:14.10-35: warning: unused value: $]5[ input.y:14.14-16: warning: unset value: $$
input.y:14.10-47: warning: unset value: $]$[
input.y:14.10-47: warning: unused value: $]3[
input.y:14.10-47: warning: unused value: $]5[
input.y:15.10-36: warning: unset value: $]$[ input.y:15.10-36: warning: unset value: $]$[
input.y:15.10-36: warning: unused value: $]3[ input.y:15.10-36: warning: unused value: $]3[
input.y:15.10-36: warning: unused value: $]5[ input.y:15.10-36: warning: unused value: $]5[