diff options
author | Austin Clements <aclements@csail.mit.edu> | 2009-07-17 14:58:02 -0700 |
---|---|---|
committer | Austin Clements <aclements@csail.mit.edu> | 2009-07-17 14:58:02 -0700 |
commit | f6e3a2504b892150267b09ead8e5929f70c9f764 (patch) | |
tree | 77f10664278b102a7127a5cecf13ee721a22c3cc /src/pkg/go/scanner/scanner.go | |
parent | 2aa77c3b37f54d6d0459a0b364820a4eaa03e222 (diff) | |
download | golang-f6e3a2504b892150267b09ead8e5929f70c9f764.tar.gz |
Produce friendlier errors messages for malformed character
literals and when the parser hits an unexpected EOF. Also,
disallow newlines in character literals.
R=gri
APPROVED=gri
DELTA=23 (15 added, 1 deleted, 7 changed)
OCL=31790
CL=31797
Diffstat (limited to 'src/pkg/go/scanner/scanner.go')
-rw-r--r-- | src/pkg/go/scanner/scanner.go | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/src/pkg/go/scanner/scanner.go b/src/pkg/go/scanner/scanner.go index 3a2d98514..2d5e2a83f 100644 --- a/src/pkg/go/scanner/scanner.go +++ b/src/pkg/go/scanner/scanner.go @@ -96,6 +96,7 @@ func (S *Scanner) Init(filename string, src []byte, err ErrorHandler, mode uint) func charString(ch int) string { var s string; switch ch { + case -1: return `EOF`; case '\a': s = `\a`; case '\b': s = `\b`; case '\f': s = `\f`; @@ -306,16 +307,29 @@ func (S *Scanner) scanEscape(quote int) { } -func (S *Scanner) scanChar() { +func (S *Scanner) scanChar(pos token.Position) { // '\'' already consumed - ch := S.ch; - S.next(); - if ch == '\\' { - S.scanEscape('\''); + n := 0; + for S.ch != '\'' { + ch := S.ch; + n++; + S.next(); + if ch == '\n' || ch < 0 { + S.error(pos, "character literal not terminated"); + n = 1; + break; + } + if ch == '\\' { + S.scanEscape('\''); + } } - S.expect('\''); + S.next(); + + if n != 1 { + S.error(pos, "illegal character literal"); + } } @@ -431,7 +445,7 @@ scan_again: switch ch { case -1 : tok = token.EOF; case '"' : tok = token.STRING; S.scanString(pos); - case '\'': tok = token.CHAR; S.scanChar(); + case '\'': tok = token.CHAR; S.scanChar(pos); case '`' : tok = token.STRING; S.scanRawString(pos); case ':' : tok = S.switch2(token.COLON, token.DEFINE); case '.' : |