cmd/internal/gc, cmd/yacc: implement "expecting" syntax error messages
Bison includes suggestions about what tokens are expected in the
current state when there's only four or fewer of them. For example:
syntax error: unexpected literal 2.01, expecting semicolon or newline or }
This CL adds the same functionality to cmd/yacc, which fully restores
the previous error message behavior from Go 1.4.
Updates #9968.
Change-Id: I2c1a1677c6d829a829d812c05e8813aa8829d09c
Reviewed-on: https://go-review.googlesource.com/8494
Run-TryBot: Matthew Dempsky <mdempsky@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
diff --git a/src/cmd/internal/gc/subr.go b/src/cmd/internal/gc/subr.go
index 689adee..5505fe3 100644
--- a/src/cmd/internal/gc/subr.go
+++ b/src/cmd/internal/gc/subr.go
@@ -162,18 +162,13 @@
return
}
- // TODO(mdempsky): Extend cmd/yacc's verbose error
- // messages to suggest expected tokens like Bison:
- // "syntax error: unexpected literal 2.01, expecting semicolon or newline or }"
- if false {
- // The grammar has { and LBRACE but both show up as {.
- // Rewrite syntax error referring to "{ or {" to say just "{".
- // The grammar has ? and @ but only for reading imports.
- // Silence them in ordinary errors.
- msg = strings.Replace(msg, "{ or {", "{", -1)
- msg = strings.Replace(msg, " or ?", "", -1)
- msg = strings.Replace(msg, " or @", "", -1)
- }
+ // The grammar has { and LBRACE but both show up as {.
+ // Rewrite syntax error referring to "{ or {" to say just "{".
+ // The grammar has ? and @ but only for reading imports.
+ // Silence them in ordinary errors.
+ msg = strings.Replace(msg, "{ or {", "{", -1)
+ msg = strings.Replace(msg, " or ?", "", -1)
+ msg = strings.Replace(msg, " or @", "", -1)
msg = strings.Replace(msg, "LLITERAL", litbuf, -1)