From f5e2d791b52e33fc4358c97175d1153487d0a8d3 Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 5 Feb 2026 03:21:50 +0100 Subject: [PATCH] feat(lexer): add strings --- main.py | 5 ++++- src/lexer.py | 21 ++++++++++++++++++--- src/token.py | 2 +- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/main.py b/main.py index 26151f9..d3d6e57 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,10 @@ from src.token import Token def main(): source: str = """() {} +- += / /= // sefs + {, ) - }:: *""" + }:: * + "This is a string" + "This is + another string" """ lexer: Lexer = Lexer() tokens: list[Token] = lexer.process(source) print(tokens) diff --git a/src/lexer.py b/src/lexer.py index 4384741..1d3d7db 100644 --- a/src/lexer.py +++ b/src/lexer.py @@ -16,6 +16,9 @@ class Lexer: self.column: int = 0 self.start_pos: Position = self.get_position() + def error(self, msg: str): + raise SyntaxError(f"[ERROR] Error at {self.start_pos}: {msg}") + def process(self, source: str, path: Optional[str] = None) -> list[Token]: self.path = path or "
" self.source = source @@ -116,10 +119,22 @@ class Lexer: while self.peek().isspace() and not self.is_at_end(): self.advance() self.add_token(TokenType.WHITESPACE) + case '"': + self.scan_string() case _: self.error("Unexpected character") - return None - def error(self, msg: str): - raise SyntaxError(f"[ERROR] Error at {self.start_pos}: {msg}") + def scan_string(self): + while self.peek() != '"' and not self.is_at_end(): + if self.peek() == "\n": + self.line += 1 + self.column = 0 + self.advance() + + if self.is_at_end(): + self.error("Unterminated string") + + self.advance() + value: str = self.source[self.start + 1:self.idx - 1] + self.add_token(TokenType.STRING, value) diff --git a/src/token.py b/src/token.py index 3985f3c..f59489c 100644 --- a/src/token.py +++ b/src/token.py @@ -70,6 +70,6 @@ class Token: def __repr__(self) -> str: res: str = f"[{self.type.name}" if self.value is not None: - res += f" ({self.value})" + res += f" ({self.value!r})" res += "]" return res