From b921d92fcbdb2c19fe2c6158e9a5181d451b976a Mon Sep 17 00:00:00 2001 From: Victor Santet Date: Tue, 19 Jun 2012 16:14:55 +0200 Subject: [PATCH] warnings: used but undeclared symbols are warnings We used to raise an error if a symbol appears only in a %printer or %destructor. Make it a warning. * src/symtab.h (status): New enum. (symbol): Replace the binary "declared" with the three-state "status". Adjust dependencies. * src/symtab.c (symbol_check_defined): Needed symbols are an error, whereas "used" are simply warnings. * src/symlist.c (symbol_list_destructor_set, symbol_list_printer): Set symbol status to 'used' when associated to destructors or printers. * input.at (Undeclared symbols used for a printer or destructor): New. --- NEWS | 12 ++++++++++++ src/reader.c | 2 +- src/symlist.c | 4 ++++ src/symtab.c | 25 +++++++++++++++++-------- src/symtab.h | 9 ++++++++- tests/input.at | 24 ++++++++++++++++++++++++ 6 files changed, 66 insertions(+), 10 deletions(-) diff --git a/NEWS b/NEWS index 7b75972c..2b4ef26e 100644 --- a/NEWS +++ b/NEWS @@ -2,6 +2,18 @@ GNU Bison NEWS * Noteworthy changes in release ?.? (????-??-??) [?] +** Warnings about undeclared symbols + + Bison used to raise an error for %printer and %destructor directives for + undefined symbols. + + %printer {} symbol1 + %destructor {} symbol2 + %% + exp: "a"; + + This is now only a warning. + ** Additional yylex/yyparse arguments The new directive %param declare additional argument to both yylex diff --git a/src/reader.c b/src/reader.c index 2e0aa5ee..27ddad08 100644 --- a/src/reader.c +++ b/src/reader.c @@ -333,7 +333,7 @@ grammar_rule_check (const symbol_list *r) it for char literals and strings, which are always tokens. */ if (r->ruleprec && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"' - && !r->ruleprec->declared && !r->ruleprec->prec) + && r->ruleprec->status != declared && !r->ruleprec->prec) warn_at (r->location, _("token for %%prec is not defined: %s"), r->ruleprec->tag); } diff --git a/src/symlist.c b/src/symlist.c index 874e238a..03169450 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -232,6 +232,8 @@ symbol_list_destructor_set (symbol_list *node, char const *code, location loc) { case SYMLIST_SYMBOL: symbol_destructor_set (node->content.sym, &destructor); + if (node->content.sym->status == needed) + node->content.sym->status = used; break; case SYMLIST_TYPE: semantic_type_destructor_set ( @@ -256,6 +258,8 @@ symbol_list_printer_set (symbol_list *node, char const *code, location loc) { case SYMLIST_SYMBOL: symbol_printer_set (node->content.sym, &printer); + if (node->content.sym->status == needed) + node->content.sym->status = used; break; case SYMLIST_TYPE: semantic_type_printer_set ( diff --git a/src/symtab.c b/src/symtab.c index d25b9368..719cb9fd 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -85,7 +85,7 @@ symbol_new (uniqstr tag, location loc) res->alias = NULL; res->class = unknown_sym; - res->declared = false; + res->status = needed; if (nsyms == SYMBOL_NUMBER_MAXIMUM) fatal (_("too many symbols in input grammar (limit is %d)"), @@ -361,7 +361,7 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring) if (sym->class != unknown_sym && sym->class != class) { complain_at (loc, _("symbol %s redefined"), sym->tag); - sym->declared = false; + sym->status = needed; } if (class == nterm_sym && sym->class != nterm_sym) @@ -373,9 +373,9 @@ symbol_class_set (symbol *sym, symbol_class class, location loc, bool declaring) if (declaring) { - if (sym->declared) + if (sym->status == declared) warn_at (loc, _("symbol %s redeclared"), sym->tag); - sym->declared = true; + sym->status = declared; } } @@ -421,10 +421,19 @@ symbol_check_defined (symbol *sym) { if (sym->class == unknown_sym) { - complain_at - (sym->location, - _("symbol %s is used, but is not defined as a token and has no rules"), - sym->tag); + if (sym->status == needed) + complain_at + (sym->location, + _("symbol %s is used, but is not defined as a token and has no" + " rules"), + sym->tag); + else + warn_at + (sym->location, + _("symbol %s is used, but is not defined as a token and has no" + " rules"), + sym->tag); + sym->class = nterm_sym; sym->number = nvars++; } diff --git a/src/symtab.h b/src/symtab.h index 65155227..d9ee96ef 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -51,6 +51,13 @@ typedef int symbol_number; typedef struct symbol symbol; +typedef enum + { + needed, /**< found but not "defined". */ + used, /**< used by %printer but not declared. */ + declared, /**< defined with %type or %token. */ + } status; + /* When extending this structure, be sure to complete symbol_check_alias_consistency. */ struct symbol @@ -90,7 +97,7 @@ struct symbol symbol-string pair for an alias. */ symbol *alias; symbol_class class; - bool declared; + status status; }; /** Undefined user number. */ diff --git a/tests/input.at b/tests/input.at index d94b652e..0e0b0041 100644 --- a/tests/input.at +++ b/tests/input.at @@ -271,6 +271,30 @@ input.y:5.10-24: previous declaration AT_CLEANUP +## ---------------------------------------------------- ## +## Undeclared symbols used for a printer or destructor. ## +## ---------------------------------------------------- ## + +AT_SETUP([Undeclared symbols used for a printer or destructor]) + +AT_DATA([[input.y]], +[[%printer {} token1 +%destructor {} token2 + +%% +exp: "a"; +]]) + +AT_BISON_CHECK([input.y], [0], [], +[[input.y:1.13-18: warning: symbol token1 is used, but is not defined as a token and has no rules +input.y:2.16-21: warning: symbol token2 is used, but is not defined as a token and has no rules +input.y: warning: 2 nonterminals useless in grammar +input.y:1.13-18: warning: nonterminal useless in grammar: token1 +input.y:2.16-21: warning: nonterminal useless in grammar: token2 +]]) + +AT_CLEANUP + ## ---------------------------------------- ## ## Unused values with default %destructor. ## -- 2.47.2