From 0255587e95af39f757d227e477792ff2f3a92bd8 Mon Sep 17 00:00:00 2001 From: Fatih Arslan Date: Sun, 4 Oct 2015 23:47:06 +0300 Subject: [PATCH] scnaner: implement scanning hexadecimal numbers --- scanner/scanner.go | 30 ++++++++++++++++++++++++++++-- scanner/scanner_test.go | 24 ++++++++++++------------ 2 files changed, 40 insertions(+), 14 deletions(-) diff --git a/scanner/scanner.go b/scanner/scanner.go index fda5265..337691a 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -132,8 +132,13 @@ func (s *Scanner) Scan() (tok token.Token) { func (s *Scanner) scanNumber(ch rune) token.Token { if ch == '0' { // check hexadecimal or float - // ch = s.next() - // return token.ILLEGAL + ch = s.next() + if ch == 'x' || ch == 'X' { + ch = s.next() + s.scanHexadecimal(ch) + return token.NUMBER + } + } s.scanMantissa(ch) @@ -147,6 +152,23 @@ func (s *Scanner) scanMantissa(ch rune) { s.unread() } +func (s *Scanner) scanHexadecimal(ch rune) { + found := false + + // after "0x" or "0X" + for isHexadecimal(ch) { + ch = s.next() + found = true + } + + if !found { + // only scanned "0x" or "0X" + s.err("illegal hexadecimal number") + } + + s.unread() +} + // scanString scans a quoted string func (s *Scanner) scanString() { for { @@ -268,6 +290,10 @@ func isDecimal(ch rune) bool { return '0' <= ch && ch <= '9' } +func isHexadecimal(ch rune) bool { + return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' +} + // isWhitespace returns true if the rune is a space, tab, newline or carriage return func isWhitespace(ch rune) bool { return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' diff --git a/scanner/scanner_test.go b/scanner/scanner_test.go index 8ce08c0..4df11ea 100644 --- a/scanner/scanner_test.go +++ b/scanner/scanner_test.go @@ -111,18 +111,18 @@ func TestNumber(t *testing.T) { {token.NUMBER, "07"}, {token.NUMBER, "042"}, {token.NUMBER, "01234567"}, - // {token.NUMBER, "0x0"}, - // {token.NUMBER, "0x1"}, - // {token.NUMBER, "0xf"}, - // {token.NUMBER, "0x42"}, - // {token.NUMBER, "0x123456789abcDEF"}, - // {token.NUMBER, "0x" + f100}, - // {token.NUMBER, "0X0"}, - // {token.NUMBER, "0X1"}, - // {token.NUMBER, "0XF"}, - // {token.NUMBER, "0X42"}, - // {token.NUMBER, "0X123456789abcDEF"}, - // {token.NUMBER, "0X" + f100}, + {token.NUMBER, "0x0"}, + {token.NUMBER, "0x1"}, + {token.NUMBER, "0xf"}, + {token.NUMBER, "0x42"}, + {token.NUMBER, "0x123456789abcDEF"}, + {token.NUMBER, "0x" + f100}, + {token.NUMBER, "0X0"}, + {token.NUMBER, "0X1"}, + {token.NUMBER, "0XF"}, + {token.NUMBER, "0X42"}, + {token.NUMBER, "0X123456789abcDEF"}, + {token.NUMBER, "0X" + f100}, // {token.FLOAT, "0."}, // {token.FLOAT, "1."}, // {token.FLOAT, "42."},