cue/scanner: don't allow repeated _ in numbers

Fixes discrepency with spec.

Change-Id: Ib6f4a08dabeb26861414d03b91af7d1e62119bb1
Reviewed-on: https://cue-review.googlesource.com/c/cue/+/3040
Reviewed-by: Marcel van Lohuizen <mpvl@google.com>
diff --git a/cue/scanner/scanner.go b/cue/scanner/scanner.go
index abf4c3e..d8f19e4 100644
--- a/cue/scanner/scanner.go
+++ b/cue/scanner/scanner.go
@@ -304,6 +304,9 @@
 func (s *Scanner) scanMantissa(base int) {
 	var last rune
 	for digitVal(s.ch) < base {
+		if last == '_' && s.ch == '_' {
+			s.errf(s.offset, "illegal '_' in number")
+		}
 		last = s.ch
 		s.next()
 	}
diff --git a/cue/scanner/scanner_test.go b/cue/scanner/scanner_test.go
index 3efea8c..11cce96 100644
--- a/cue/scanner/scanner_test.go
+++ b/cue/scanner/scanner_test.go
@@ -801,6 +801,7 @@
 	{"0x", token.INT, 0, "0x", "illegal hexadecimal number"},
 	{"0X", token.INT, 0, "0X", "illegal hexadecimal number"},
 	{"0Xbeef_", token.INT, 6, "0Xbeef_", "illegal '_' in number"},
+	{"0Xbeef__beef", token.INT, 7, "0Xbeef__beef", "illegal '_' in number"},
 	{"0b", token.INT, 0, "0b", "illegal binary number"},
 	{"0o", token.INT, 0, "0o", "illegal octal number"},
 	// {"123456789012345678890_i", IMAG, 21, "123456789012345678890_i", "illegal '_' in number"},