Le 29 janv. 2013 à 11:39, Valentin Tolmer <[email protected]> a écrit :
> Patch correction attached (The previous one got wrapped). > <0001-grammar-warn-about-unused-precedence-for-symbols.patch> Thanks, installed with the following changes. Please, pay attention to making a richer commit message. commit 0c9752f616aed0a37c140dfbd7a7afe95d8ac67b Author: Valentin Tolmer <[email protected]> Date: Tue Jan 29 14:55:53 2013 +0100 grammar: warn about unused precedence for symbols Symbols with precedence but no associativity, and whose precedence is never used, can be declared with %token instead. The used precedence relationships are recorded and a warning about useless ones is issued. * src/conflicts.c (resolve_sr_conflict): Record precedence relation. * src/symtab.c, src/symtab.h (prec_nodes, init_prec_nodes) (symgraphlink_new, register_precedence_second_symbol) (print_precedence_warnings): New. Record relationships in a graph and warn about useless ones. * src/main.c (main): Print precedence warnings. * tests/conflicts.at: New. diff --git a/NEWS b/NEWS index 95c1437..62f834b 100644 --- a/NEWS +++ b/NEWS @@ -202,7 +202,7 @@ GNU Bison NEWS Bison now warns about symbols with a declared precedence but no declared associativity (i.e. declared with %precedence), and whose precedence is - never used. In that case, the symbol can be safely declared with a %token + never used. In that case, the symbol can be safely declared with %token instead, without modifying the parsing tables. ** Additional yylex/yyparse arguments diff --git a/src/symtab.c b/src/symtab.c index f3d8b9f..3028df9 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -984,11 +984,11 @@ symbols_pack (void) static void init_prec_nodes (void) { - prec_nodes = xcalloc (nsyms, sizeof (* prec_nodes)); int i; + prec_nodes = xcalloc (nsyms, sizeof *prec_nodes); for (i = 0; i < nsyms; ++i) { - prec_nodes[i] = xmalloc (sizeof (*prec_nodes[i])); + prec_nodes[i] = xmalloc (sizeof *prec_nodes[i]); symgraph *s = prec_nodes[i]; s->id = i; s->succ = 0; @@ -996,29 +996,30 @@ init_prec_nodes (void) } } -/*--------------------------. -| Routine to create a link. | -`--------------------------*/ +/*----------------. +| Create a link. | +`----------------*/ static symgraphlink * -create_symgraphlink (graphid id, symgraphlink *next) +symgraphlink_new (graphid id, symgraphlink *next) { - symgraphlink *l = xmalloc (sizeof (*l)); + symgraphlink *l = xmalloc (sizeof *l); l->id = id; l->next = next; return l; } -/*-----------------------------------------------------------------------. -| Registers the second symbol of the precedence relation. Should only be | -| used in add_precedence_relation. | -`-----------------------------------------------------------------------*/ + +/*------------------------------------------------------------------. +| Register the second symbol of the precedence relation, and return | +| whether this relation is new. Use only in register_precedence. | +`------------------------------------------------------------------*/ static bool register_precedence_second_symbol (symgraphlink **first, graphid sym) { if (!*first || sym < (*first)->id) - *first = create_symgraphlink (sym, *first); + *first = symgraphlink_new (sym, *first); else { symgraphlink *slist = *first; @@ -1027,10 +1028,10 @@ register_precedence_second_symbol (symgraphlink **first, graphid sym) slist = slist->next; if (slist->id == sym) - /* Relation already present. */ + /* Relation already present. */ return false; - slist->next = create_symgraphlink (sym, slist->next); + slist->next = symgraphlink_new (sym, slist->next); } return true; } @@ -1049,23 +1050,9 @@ register_precedence (graphid first, graphid snd) register_precedence_second_symbol (&(prec_nodes[snd]->pred), first); } -/*-----------------------------. -| Free a simple symgraph list. | -`-----------------------------*/ - -static void -free_symgraphlink (symgraphlink *s) -{ - if (s) - { - free_symgraphlink (s->next); - free (s); - } -} - /*--------------------------------------------------. -| Print a warning for unused precedence relations. | +| Print a warning for unused precedence relations. | `--------------------------------------------------*/ void diff --git a/tests/conflicts.at b/tests/conflicts.at index 8aaa76e..d2fb298 100644 --- a/tests/conflicts.at +++ b/tests/conflicts.at @@ -78,7 +78,15 @@ int main (void) } ]]) -AT_FULL_COMPILE([input]) +AT_BISON_CHECK([-o input.c input.y], [], [], +[[input.y:24.13: warning: useless precedence for R [-Wother] +input.y:24.15: warning: useless precedence for S [-Wother] +input.y:24.17: warning: useless precedence for T [-Wother] +input.y:24.19: warning: useless precedence for U [-Wother] +input.y:25.13: warning: useless precedence for V [-Wother] +input.y:25.15: warning: useless precedence for W [-Wother] +]]) +AT_COMPILE([input]) AT_PARSER_CHECK([./input])
