summaryrefslogtreecommitdiff
path: root/src/pkg/go/scanner/scanner.go
diff options
context:
space:
mode:
authorAustin Clements <aclements@csail.mit.edu>2009-07-17 14:58:02 -0700
committerAustin Clements <aclements@csail.mit.edu>2009-07-17 14:58:02 -0700
commitf6e3a2504b892150267b09ead8e5929f70c9f764 (patch)
tree77f10664278b102a7127a5cecf13ee721a22c3cc /src/pkg/go/scanner/scanner.go
parent2aa77c3b37f54d6d0459a0b364820a4eaa03e222 (diff)
downloadgolang-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.go28
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 '.' :