Improve error messages for $' or @' followed by .' or -'.

Previously, for this special case of an invalid reference, the
usual "symbol not found in production:" was printed.  However,
because the symbol name was parsed as the empty string, that
message was followed immediately by a newline instead of a symbol
name.  In reality, this is a syntax error, so the reference is
invalid regardless of the symbols actually appearing in the
production.  Discussed at
<http://lists.gnu.org/archive/html/bison-patches/2011-01/msg00012.html>.
* src/scan-code.l (parse_ref): Report the above case as a syntax
error.  Other than that, continue to handle this case like any
other invalid reference that Bison manages to parse because
"possibly meant" messages can still be helpful to the user.
* tests/named-refs.at ($ or @ followed by . or -): New test group.
(cherry picked from commit 5c9efc755e)
This commit is contained in:
Joel E. Denny
2011-01-09 18:06:19 -05:00
parent 354303787c
commit 8cbbf1786f
3 changed files with 57 additions and 1 deletions

View File

@@ -1,3 +1,20 @@
2011-01-09 Joel E. Denny <joeldenny@joeldenny.org>
Improve error messages for `$' or `@' followed by `.' or `-'.
Previously, for this special case of an invalid reference, the
usual "symbol not found in production:" was printed. However,
because the symbol name was parsed as the empty string, that
message was followed immediately by a newline instead of a symbol
name. In reality, this is a syntax error, so the reference is
invalid regardless of the symbols actually appearing in the
production. Discussed at
<http://lists.gnu.org/archive/html/bison-patches/2011-01/msg00012.html>.
* src/scan-code.l (parse_ref): Report the above case as a syntax
error. Other than that, continue to handle this case like any
other invalid reference that Bison manages to parse because
"possibly meant" messages can still be helpful to the user.
* tests/named-refs.at ($ or @ followed by . or -): New test group.
2011-01-08 Joel E. Denny <joeldenny@joeldenny.org> 2011-01-08 Joel E. Denny <joeldenny@joeldenny.org>
doc: don't use @acronym. doc: don't use @acronym.

View File

@@ -620,7 +620,17 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
complain_at_indent (text_loc, &indent, _("invalid reference: %s"), complain_at_indent (text_loc, &indent, _("invalid reference: %s"),
quote (text)); quote (text));
indent += SUB_INDENT; indent += SUB_INDENT;
if (midrule_rhs_index) if (len == 0)
{
location sym_loc = text_loc;
sym_loc.start.column += 1;
sym_loc.end = sym_loc.start;
const char *format =
_("syntax error after `%c', expecting integer, letter,"
" `_', `[', or `$'");
complain_at_indent (sym_loc, &indent, format, dollar_or_at);
}
else if (midrule_rhs_index)
{ {
const char *format = const char *format =
_("symbol not found in production before $%d: %.*s"); _("symbol not found in production before $%d: %.*s");

View File

@@ -561,3 +561,32 @@ test.y:57.8-17: invalid reference: `$<aa>[sym]'
test.y:54.1-57.21: symbol not found in production: sym test.y:54.1-57.21: symbol not found in production: sym
]]) ]])
AT_CLEANUP AT_CLEANUP
#######################################################################
AT_SETUP([[$ or @ followed by . or -]])
AT_DATA([[test.y]],
[[
%%
start:
.field { $.field; }
| -field { @-field; }
| 'a' { @.field; }
| 'a' { $-field; }
;
.field: ;
-field: ;
]])
AT_BISON_CHECK([[test.y]], [[1]], [],
[[test.y:4.12-18: invalid reference: `$.field'
test.y:4.13: syntax error after `$', expecting integer, letter, `_', `@<:@', or `$'
test.y:4.3-8: possibly meant: $[.field] at $1
test.y:5.12-18: invalid reference: `@-field'
test.y:5.13: syntax error after `@', expecting integer, letter, `_', `@<:@', or `$'
test.y:5.3-8: possibly meant: @[-field] at $1
test.y:6.12-18: invalid reference: `@.field'
test.y:6.13: syntax error after `@', expecting integer, letter, `_', `@<:@', or `$'
test.y:7.12-18: invalid reference: `$-field'
test.y:7.13: syntax error after `$', expecting integer, letter, `_', `@<:@', or `$'
]])
AT_CLEANUP