From aa760a85c3d6bb3cf43ed34343e196c1ac826760 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 5 Feb 2026 03:28:06 +0100 Subject: [PATCH] feat(lexer): add numbers --- main.py | 2 ++ src/lexer.py | 22 +++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/main.py b/main.py index d3d6e57..2f1bbe5 100644 --- a/main.py +++ b/main.py @@ -6,6 +6,8 @@ def main(): source: str = """() {} +- += / /= // sefs + {, ) }:: * "This is a string" + 3.1415 + 123 "This is another string" """ lexer: Lexer = Lexer() diff --git a/src/lexer.py b/src/lexer.py index 1d3d7db..40f600c 100644 --- a/src/lexer.py +++ b/src/lexer.py @@ -49,6 +49,11 @@ class Lexer: return self.source[self.idx] return "" + def peek_next(self) -> str: + if self.idx + 1 < self.length: + return self.source[self.idx + 1] + return "" + def advance(self) -> str: char: str = self.peek() self.idx += 1 @@ -122,7 +127,10 @@ class Lexer: case '"': self.scan_string() case _: - self.error("Unexpected character") + if char.isdigit(): + self.scan_number() + else: + self.error("Unexpected character") return None def scan_string(self): @@ -138,3 +146,15 @@ class Lexer: self.advance() value: str = self.source[self.start + 1:self.idx - 1] self.add_token(TokenType.STRING, value) + + def scan_number(self): + while self.peek().isdigit(): + self.advance() + + if self.peek() == "." and self.peek_next().isdigit(): + self.advance() + while self.peek().isdigit(): + self.advance() + + value: float = float(self.source[self.start:self.idx]) + self.add_token(TokenType.NUMBER, value)