From 8f382036845a81fbc287f65fa602ad56f001af99 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 11 Aug 2022 00:17:22 -0500 Subject: [PATCH] Added support for binary literals --- lexer/lexer.go | 35 ++++++++++++++++++++++++++++++++++- 1 file changed, 34 insertions(+), 1 deletion(-) diff --git a/lexer/lexer.go b/lexer/lexer.go index 9f01038..4da1a92 100644 --- a/lexer/lexer.go +++ b/lexer/lexer.go @@ -58,6 +58,7 @@ func (lexer *LexingOperation) tokenize () (err error) { return } +// tokenizeSymbolBeginning lexes a token that starts with a number. func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error) { if lexer.char == '0' { lexer.nextRune() @@ -88,7 +89,7 @@ func (lexer *LexingOperation) tokenizeNumberBeginning (negative bool) (err error return } -// tokenizeDecimalNumber Reads and tokenizes a hexidecimal number. +// tokenizeHexidecimalNumber Reads and tokenizes a hexidecimal number. func (lexer *LexingOperation) tokenizeHexidecimalNumber (negative bool) (err error) { var number uint64 @@ -124,6 +125,38 @@ func (lexer *LexingOperation) tokenizeHexidecimalNumber (negative bool) (err err return } +// tokenizeBinaryNumber Reads and tokenizes a binary number. +func (lexer *LexingOperation) tokenizeBinaryNumber (negative bool) (err error) { + var number uint64 + + for { + if lexer.char == '0' { + number *= 2 + } else if lexer.char == '1' { + number *= 2 + number += 1 + } 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 := ""