text/scanner: report illegal hexadecimal numbers (bug fix)

R=r
CC=golang-dev
https://golang.org/cl/6450136
This commit is contained in:
Robert Griesemer 2012-08-15 11:09:34 -07:00
parent 2ab18f69a6
commit ace14d01bd
2 changed files with 11 additions and 3 deletions

View file

@ -389,15 +389,20 @@ func (s *Scanner) scanNumber(ch rune) (rune, rune) {
if ch == 'x' || ch == 'X' {
// hexadecimal int
ch = s.next()
hasMantissa := false
for digitVal(ch) < 16 {
ch = s.next()
hasMantissa = true
}
if !hasMantissa {
s.error("illegal hexadecimal number")
}
} else {
// octal int or float
seenDecimalDigit := false
has8or9 := false
for isDecimal(ch) {
if ch > '7' {
seenDecimalDigit = true
has8or9 = true
}
ch = s.next()
}
@ -408,7 +413,7 @@ func (s *Scanner) scanNumber(ch rune) (rune, rune) {
return Float, ch
}
// octal int
if seenDecimalDigit {
if has8or9 {
s.error("illegal octal number")
}
}

View file

@ -446,6 +446,9 @@ func TestError(t *testing.T) {
testError(t, `"\'"`, "1:3", "illegal char escape", String)
testError(t, `01238`, "1:6", "illegal octal number", Int)
testError(t, `01238123`, "1:9", "illegal octal number", Int)
testError(t, `0x`, "1:3", "illegal hexadecimal number", Int)
testError(t, `0xg`, "1:3", "illegal hexadecimal number", Int)
testError(t, `'aa'`, "1:4", "illegal char literal", Char)
testError(t, `'`, "1:2", "literal not terminated", Char)