summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoel E. Denny <joeldenny@joeldenny.org>2011-01-09 18:06:19 -0500
committerJoel E. Denny <joeldenny@joeldenny.org>2011-01-09 18:08:56 -0500
commit5c9efc755e61e47011a71b022ad232e28af67bd0 (patch)
tree5af162b6b065cfddfae980e7ab97fd7f28fc26ee
parent8a4281b987577d911e418e8a37aef0c9c7121bf8 (diff)
downloadbison-5c9efc755e61e47011a71b022ad232e28af67bd0.tar.gz
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.
-rw-r--r--ChangeLog17
-rw-r--r--src/scan-code.l12
-rw-r--r--tests/named-refs.at29
3 files changed, 57 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index ac74891f..1f500fdf 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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>
doc: don't use @acronym.
diff --git a/src/scan-code.l b/src/scan-code.l
index ffc8b5d4..3dd10443 100644
--- a/src/scan-code.l
+++ b/src/scan-code.l
@@ -621,7 +621,17 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
complain_at_indent (text_loc, &indent, _("invalid reference: %s"),
quote (text));
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 =
_("symbol not found in production before $%d: %.*s");
diff --git a/tests/named-refs.at b/tests/named-refs.at
index 7824c9bf..74549c6e 100644
--- a/tests/named-refs.at
+++ b/tests/named-refs.at
@@ -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
]])
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