From 0195a84bfdfda84d56c2def09626a18cf06199ab Mon Sep 17 00:00:00 2001 From: LordBaryhobal Date: Thu, 5 Feb 2026 03:34:35 +0100 Subject: [PATCH] feat(lexer): add identifiers and keywords --- main.py | 5 ++++- src/keyword.py | 14 ++++++++++++++ src/lexer.py | 11 +++++++++++ 3 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 src/keyword.py diff --git a/main.py b/main.py index 2f1bbe5..c77e80b 100644 --- a/main.py +++ b/main.py @@ -10,8 +10,11 @@ def main(): 123 "This is another string" """ + path: str = "examples/05_loop.peb" + with open(path, "r") as f: + source = f.read() lexer: Lexer = Lexer() - tokens: list[Token] = lexer.process(source) + tokens: list[Token] = lexer.process(source, path) print(tokens) if __name__ == '__main__': diff --git a/src/keyword.py b/src/keyword.py new file mode 100644 index 0000000..68ca011 --- /dev/null +++ b/src/keyword.py @@ -0,0 +1,14 @@ +from src.token import TokenType + +KEYWORDS: dict[str, TokenType] = { + "let": TokenType.LET, + "and": TokenType.AND, + "or": TokenType.OR, + "if": TokenType.IF, + "else": TokenType.ELSE, + "for": TokenType.FOR, + "while": TokenType.WHILE, + "from": TokenType.FROM, + "to": TokenType.TO, + "by": TokenType.BY +} diff --git a/src/lexer.py b/src/lexer.py index 40f600c..8a6c6ec 100644 --- a/src/lexer.py +++ b/src/lexer.py @@ -1,5 +1,6 @@ from typing import Optional, Any +from src.keyword import KEYWORDS from src.position import Position from src.token import Token, TokenType @@ -129,6 +130,8 @@ class Lexer: case _: if char.isdigit(): self.scan_number() + elif char.isalpha(): + self.scan_identifier() else: self.error("Unexpected character") return None @@ -158,3 +161,11 @@ class Lexer: value: float = float(self.source[self.start:self.idx]) self.add_token(TokenType.NUMBER, value) + + def scan_identifier(self): + while self.peek().isalnum() or self.peek() == "_": + self.advance() + + lexeme: str = self.source[self.start:self.idx] + token_type: TokenType = KEYWORDS.get(lexeme, TokenType.IDENTIFIER) + self.add_token(token_type)