From f95a42e6ba1991b2bb79c119a5aefb624573cf84 Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Fri, 17 Jul 2009 14:58:02 -0700 Subject: [PATCH] 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 --- src/pkg/go/scanner/scanner.go | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/pkg/go/scanner/scanner.go b/src/pkg/go/scanner/scanner.go index 3a2d985144..2d5e2a83f7 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 '.' : -- 2.48.1