From 519d000408fc583144fb9c7a18d3718cefaf0de7 Mon Sep 17 00:00:00 2001 From: "Joel E. Denny" Date: Sat, 21 Oct 2006 02:31:50 +0000 Subject: [PATCH] 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. --- ChangeLog | 13 +++++++++++++ src/reader.c | 26 +++++++++++++++++++------- tests/input.at | 19 +++++++++++-------- 3 files changed, 43 insertions(+), 15 deletions(-) diff --git a/ChangeLog b/ChangeLog index a8912a45..0b026dfe 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2006-10-20 Joel E. Denny + + 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 More improvements to the documentation of the prologue alternatives: diff --git a/src/reader.c b/src/reader.c index d0e9ea2c..604c03b1 100644 --- a/src/reader.c +++ b/src/reader.c @@ -252,7 +252,10 @@ static bool symbol_should_be_used (symbol_list const *s) { 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); + /* 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) { int rule_length = 0; @@ -472,14 +489,9 @@ packgram (void) rules[ruleno].precsym = NULL; rules[ruleno].location = p->location; 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; - /* 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 symbols may appear unused, but the parsing algorithm ensures that %destructor's are invoked appropriately. */ diff --git a/tests/input.at b/tests/input.at index dedd6563..adc38d72 100644 --- a/tests/input.at +++ b/tests/input.at @@ -103,8 +103,8 @@ start: a: INT | INT { } INT { } INT { }; b: INT | /* empty */; -c: INT | INT { $]1[ } INT { } INT { }; -d: INT | INT { } INT { $]1[ } INT { }; +c: INT | INT { $]1[ } INT { $2 } INT { $4 }; +d: INT | INT { } INT { $]1[ } INT { $2 }; e: INT | INT { } INT { } INT { $]1[ }; f: INT | INT { } INT { } INT { $]$[ = $]1[ + $]3[ + $]5[; }; g: INT | INT { $$; } INT { $$; } 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: $]5[ input.y:12.9: warning: empty rule for typed nonterminal, and no action -input.y:13.10-35: warning: unset value: $]$[ -input.y:13.10-35: warning: unused value: $]3[ -input.y:13.10-35: warning: unused value: $]5[ -input.y:14.10-35: warning: unset value: $]$[ -input.y:14.10-35: warning: unused value: $]3[ -input.y:14.10-35: warning: unused value: $]5[ +input.y:13.14-19: warning: unset value: $$ +input.y:13.25-39: warning: unset value: $$ +input.y:13.10-59: warning: unset value: $]$[ +input.y:13.10-59: warning: unused value: $]3[ +input.y:13.10-59: 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: unused value: $]3[ input.y:15.10-36: warning: unused value: $]5[ -- 2.45.2