diff options
author | Akim Demaille <akim@lrde.epita.fr> | 2015-01-14 13:41:32 +0100 |
---|---|---|
committer | Akim Demaille <akim@lrde.epita.fr> | 2015-01-14 17:05:35 +0100 |
commit | 875ef1b90c4cbdc637b6944d4d6eb5b2b7bb7eef (patch) | |
tree | 0db0ee9890d3ebc879bc0469d8954d3be73b8e87 | |
parent | 650af77812fc55ffc7c45e271b45a9b13a62dfd3 (diff) | |
download | bison-875ef1b90c4cbdc637b6944d4d6eb5b2b7bb7eef.tar.gz |
symbol: use the first occurrence as an LHS as defining location
Currently on the following grammar:
%type <foo> foo
%%
start: foo | bar | "baz"
foo: foo
bar: bar
bison reports:
warning: 2 nonterminals useless in grammar [-Wother]
warning: 4 rules useless in grammar [-Wother]
1.13-15: warning: nonterminal useless in grammar: foo [-Wother]
%type <foo> foo
^^^
3.14-16: warning: nonterminal useless in grammar: bar [-Wother]
start: foo | bar | "baz"
^^^
[...]
i.e., the location of the first occurrence of a symbol is taken as its
definition point. In the case of nonterminals, the first occurrence
as a left-hand side of a rule makes more sense:
warning: 2 nonterminals useless in grammar [-Wother]
warning: 4 rules useless in grammar [-Wother]
4.1-3: warning: nonterminal useless in grammar: foo [-Wother]
foo: foo
^^^
5.1-3: warning: nonterminal useless in grammar: bar [-Wother]
bar: bar
^^^
[...]
* src/symtab.h, src/symtab.c (symbol::location_of_lhs): New.
(symbol_location_as_lhs_set): New.
* src/parse-gram.y (current_lhs): Use it.
* tests/reduce.at: Update locations.
-rw-r--r-- | NEWS | 9 | ||||
-rw-r--r-- | src/parse-gram.c | 6 | ||||
-rw-r--r-- | src/parse-gram.h | 2 | ||||
-rw-r--r-- | src/parse-gram.y | 2 | ||||
-rw-r--r-- | src/symtab.c | 9 | ||||
-rw-r--r-- | src/symtab.h | 19 | ||||
-rw-r--r-- | tests/reduce.at | 16 |
7 files changed, 46 insertions, 17 deletions
@@ -33,13 +33,14 @@ GNU Bison NEWS ^^^^^^^^^^^ Now, rules whose left-hand side symbol is useless are no longer reported - as useless. + as useless. The locations of the errors have also been adjusted to point + to the first use of the nonterminal as a left-hand side of a rule: warning: 1 nonterminal useless in grammar [-Wother] warning: 4 rules useless in grammar [-Wother] - 2.14-16: warning: nonterminal useless in grammar: exp [-Wother] - input: '0' | exp - ^^^ + 3.1-3: warning: nonterminal useless in grammar: exp [-Wother] + exp: exp '+' exp | exp '-' exp | '(' exp ')' + ^^^ 2.14-16: warning: rule useless in grammar [-Wother] input: '0' | exp ^^^ diff --git a/src/parse-gram.c b/src/parse-gram.c index 825e2b09..43eeaeb5 100644 --- a/src/parse-gram.c +++ b/src/parse-gram.c @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.0.2.13-975bb-dirty. */ +/* A Bison parser, made by GNU Bison 3.0.2.29-9a91e. */ /* Bison implementation for Yacc-like parsers in C @@ -44,7 +44,7 @@ #define YYBISON 1 /* Bison version. */ -#define YYBISON_VERSION "3.0.2.13-975bb-dirty" +#define YYBISON_VERSION "3.0.2.29-9a91e" /* Skeleton name. */ #define YYSKELETON_NAME "yacc.c" @@ -3118,6 +3118,8 @@ current_lhs (symbol *sym, location loc, named_ref *ref) { current_lhs_symbol = sym; current_lhs_location = loc; + if (sym) + symbol_location_as_lhs_set (sym, loc); /* In order to simplify memory management, named references for lhs are always assigned by deep copy into the current symbol_list node. This is because a single named-ref in the grammar may diff --git a/src/parse-gram.h b/src/parse-gram.h index c40151da..26bb3c54 100644 --- a/src/parse-gram.h +++ b/src/parse-gram.h @@ -1,4 +1,4 @@ -/* A Bison parser, made by GNU Bison 3.0.2.13-975bb-dirty. */ +/* A Bison parser, made by GNU Bison 3.0.2.29-9a91e. */ /* Bison interface for Yacc-like parsers in C diff --git a/src/parse-gram.y b/src/parse-gram.y index 9184d5f8..5a0b2006 100644 --- a/src/parse-gram.y +++ b/src/parse-gram.y @@ -865,6 +865,8 @@ current_lhs (symbol *sym, location loc, named_ref *ref) { current_lhs_symbol = sym; current_lhs_location = loc; + if (sym) + symbol_location_as_lhs_set (sym, loc); /* In order to simplify memory management, named references for lhs are always assigned by deep copy into the current symbol_list node. This is because a single named-ref in the grammar may diff --git a/src/symtab.c b/src/symtab.c index 02b3eaed..95247733 100644 --- a/src/symtab.c +++ b/src/symtab.c @@ -105,6 +105,7 @@ symbol_new (uniqstr tag, location loc) res->tag = tag; res->location = loc; + res->location_of_lhs = false; res->alias = NULL; res->content = sym_content_new (res); res->is_alias = false; @@ -189,6 +190,7 @@ code_props_type_string (code_props_type kind) assert (0); } + /*----------------------------------------. | Create a new semantic type, named TAG. | `----------------------------------------*/ @@ -307,6 +309,13 @@ semantic_type_redeclaration (semantic_type *s, const char *what, location first, } +void +symbol_location_as_lhs_set (symbol *sym, location loc) +{ + if (!sym->location_of_lhs) + sym->location = loc; +} + /*-----------------------------------------------------------------. | Set the TYPE_NAME associated with SYM. Does nothing if passed 0 | diff --git a/src/symtab.h b/src/symtab.h index 9719cd32..42d479c2 100644 --- a/src/symtab.h +++ b/src/symtab.h @@ -87,10 +87,19 @@ struct symbol { /** The key, name of the symbol. */ uniqstr tag; - /** The location of its first occurrence. */ + + /** The "defining" location. */ location location; - /* Points to the other in the symbol-string pair for an alias. */ + /** Whether \a location is about the first uses as left-hand side + symbol of a rule (true), or simply the first occurrence (e.g., + in a %type, or as a rhs symbol of a rule). The former type of + location is more natural in error messages. This Boolean helps + moving from location of the first occurrence to first use as + lhs. */ + bool location_of_lhs; + + /** Points to the other in the symbol-string pair for an alias. */ symbol *alias; /** Whether this symbol is the alias of another or not. */ @@ -177,6 +186,12 @@ uniqstr symbol_id_get (symbol const *sym); */ void symbol_make_alias (symbol *sym, symbol *str, location loc); +/** + * This symbol is used as the lhs of a rule. Record this location + * as definition point, if not already done. + */ +void symbol_location_as_lhs_set (symbol *sym, location loc); + /** Set the \c type_name associated with \c sym. Do nothing if passed 0 as \c type_name. */ diff --git a/tests/reduce.at b/tests/reduce.at index c7edb10b..d197dc63 100644 --- a/tests/reduce.at +++ b/tests/reduce.at @@ -254,9 +254,9 @@ not-reduced.y: warning: 3 rules useless in grammar [-Wother] not-reduced.y:14.1-13: warning: nonterminal useless in grammar: not_reachable [-Wother] not_reachable: useful { /* A not reachable action. */ } ^^^^^^^^^^^^^ -not-reduced.y:11.6-19: warning: nonterminal useless in grammar: non_productive [-Wother] - | non_productive { /* A non productive action. */ } - ^^^^^^^^^^^^^^ +not-reduced.y:17.1-14: warning: nonterminal useless in grammar: non_productive [-Wother] + non_productive: non_productive useless_token + ^^^^^^^^^^^^^^ not-reduced.y:11.6-57: warning: rule useless in grammar [-Wother] | non_productive { /* A non productive action. */ } ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -330,12 +330,12 @@ indirection: underivable; AT_BISON_CHECK([[-fcaret input.y]], 0, [], [[input.y: warning: 2 nonterminals useless in grammar [-Wother] input.y: warning: 3 rules useless in grammar [-Wother] -input.y:5.15-25: warning: nonterminal useless in grammar: underivable [-Wother] - exp: useful | underivable; - ^^^^^^^^^^^ -input.y:6.14-24: warning: nonterminal useless in grammar: indirection [-Wother] +input.y:6.1-11: warning: nonterminal useless in grammar: underivable [-Wother] underivable: indirection; - ^^^^^^^^^^^ + ^^^^^^^^^^^ +input.y:7.1-11: warning: nonterminal useless in grammar: indirection [-Wother] + indirection: underivable; + ^^^^^^^^^^^ input.y:5.15-25: warning: rule useless in grammar [-Wother] exp: useful | underivable; ^^^^^^^^^^^ |