From 77f3c590c6471e9cec59f993b7fba0d495055d3a Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 11 Aug 2022 00:14:41 -0500 Subject: [PATCH] Added lexing hexidecimal numbers --- lexer/lexer.go | 72 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 69 insertions(+), 3 deletions(-) diff --git a/lexer/lexer.go b/lexer/lexer.go index 1807cfd..9f01038 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -41,12 +41,12 @@ func (lexer *LexingOperation) tokenize () (err error) { if number { // TODO: tokenize number begin - lexer.nextRune() + err = lexer.tokenizeNumberBeginning(false) + if err != nil { return } } else if lowercase || uppercase { - // TODO: tokenize alpha begin err = lexer.tokenizeAlphaBeginning() if err != nil { return } - } else { + } else if lexer.char >= '0' && lexer.char <= '9' { err = lexer.tokenizeSymbolBeginning() if err != nil { return } } @@ -58,6 +58,72 @@ func (lexer *LexingOperation) tokenize () (err error) { return } +func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error) { + if lexer.char == '0' { + lexer.nextRune() + + if lexer.char == 'x' { + lexer.nextRune() + err = lexer.tokenizeHexidecimalNumber(negative) + if err != nil { return } + } else if lexer.char == 'b' { + lexer.nextRune() + err = lexer.tokenizeBinaryNumber(negative) + if err != nil { return } + } else if lexer.char == '.' { + err = lexer.tokenizeDecimalNumber(negative) + if err != nil { return } + } else if lexer.char >= '0' && lexer.char <= '9' { + lexer.tokenizeOctalNumber(negative) + } else { + return file.NewError ( + lexer.file.Location(), 1, + "unexpected character in number literal", + file.ErrorKindError) + } + } else { + lexer.tokenizeDecimalNumber(negative) + } + + return +} + +// tokenizeDecimalNumber Reads and tokenizes a hexidecimal number. +func (lexer *LexingOperation) tokenizeHexidecimalNumber (negative bool) (err error) { + var number uint64 + + for { + if lexer.char >= '0' && lexer.char <= '9' { + number *= 16 + number += uint64(lexer.char - '0') + } else if lexer.char >= 'A' && lexer.char <= 'F' { + number *= 16 + number += uint64(lexer.char - 'A' + 9) + } else if lexer.char >= 'a' && lexer.char <= 'f' { + number *= 16 + number += uint64(lexer.char - 'a' + 9) + } else { + break + } + + err = lexer.nextRune() + if err != nil { return } + } + + token := Token { } + + if negative { + token.kind = TokenKindInt + token.value = int64(number) * -1 + } else { + token.kind = TokenKindUInt + token.value = uint64(number) + } + + lexer.addToken(token) + return +} + func (lexer *LexingOperation) tokenizeAlphaBeginning () (err error) { got := ""