refactor: pass source and tokens in constructors instead of method
This commit is contained in:
8
main.py
8
main.py
@@ -11,12 +11,12 @@ def main():
|
|||||||
source: str = ""
|
source: str = ""
|
||||||
with open(path, "r") as f:
|
with open(path, "r") as f:
|
||||||
source = f.read()
|
source = f.read()
|
||||||
lexer: Lexer = Lexer()
|
lexer: Lexer = Lexer(source, path)
|
||||||
tokens: list[Token] = lexer.process(source, path)
|
tokens: list[Token] = lexer.process()
|
||||||
print(list(filter(lambda t: t.type not in Parser.IGNORE, tokens)))
|
print(list(filter(lambda t: t.type not in Parser.IGNORE, tokens)))
|
||||||
|
|
||||||
parser: Parser = Parser()
|
parser: Parser = Parser(tokens)
|
||||||
program: list[Stmt] = parser.parse(tokens)
|
program: list[Stmt] = parser.parse()
|
||||||
|
|
||||||
interpreter: Interpreter = Interpreter()
|
interpreter: Interpreter = Interpreter()
|
||||||
interpreter.interpret(program)
|
interpreter.interpret(program)
|
||||||
|
|||||||
20
src/lexer.py
20
src/lexer.py
@@ -6,13 +6,13 @@ from src.token import Token, TokenType
|
|||||||
|
|
||||||
|
|
||||||
class Lexer:
|
class Lexer:
|
||||||
def __init__(self):
|
def __init__(self, source: str, path: Optional[str] = None):
|
||||||
self.path: str = "<main>"
|
self.path: str = path or "<main>"
|
||||||
self.source: str = ""
|
self.source: str = source
|
||||||
self.tokens: list[Token] = []
|
self.tokens: list[Token] = []
|
||||||
self.start: int = 0
|
self.start: int = 0
|
||||||
self.idx: int = 0
|
self.idx: int = 0
|
||||||
self.length: int = 0
|
self.length: int = len(self.source)
|
||||||
self.line: int = 1
|
self.line: int = 1
|
||||||
self.column: int = 1
|
self.column: int = 1
|
||||||
self.start_pos: Position = self.get_position()
|
self.start_pos: Position = self.get_position()
|
||||||
@@ -20,23 +20,13 @@ class Lexer:
|
|||||||
def error(self, msg: str):
|
def error(self, msg: str):
|
||||||
raise SyntaxError(f"[ERROR] Error at {self.start_pos}: {msg}")
|
raise SyntaxError(f"[ERROR] Error at {self.start_pos}: {msg}")
|
||||||
|
|
||||||
def process(self, source: str, path: Optional[str] = None) -> list[Token]:
|
def process(self) -> list[Token]:
|
||||||
self.path = path or "<main>"
|
|
||||||
self.source = source
|
|
||||||
self.tokens = []
|
|
||||||
self.start = 0
|
|
||||||
self.idx = 0
|
|
||||||
self.length = len(self.source)
|
|
||||||
self.line = 1
|
|
||||||
self.column = 1
|
|
||||||
|
|
||||||
while not self.is_at_end():
|
while not self.is_at_end():
|
||||||
self.start_pos = self.get_position()
|
self.start_pos = self.get_position()
|
||||||
self.start = self.idx
|
self.start = self.idx
|
||||||
self.scan_token()
|
self.scan_token()
|
||||||
|
|
||||||
self.tokens.append(Token(TokenType.EOF, "", None, self.get_position()))
|
self.tokens.append(Token(TokenType.EOF, "", None, self.get_position()))
|
||||||
|
|
||||||
return self.tokens
|
return self.tokens
|
||||||
|
|
||||||
def is_at_end(self) -> bool:
|
def is_at_end(self) -> bool:
|
||||||
|
|||||||
@@ -19,21 +19,17 @@ class Parser:
|
|||||||
TokenType.FOR, TokenType.WHILE, TokenType.IF, TokenType.PRINT
|
TokenType.FOR, TokenType.WHILE, TokenType.IF, TokenType.PRINT
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self, tokens: list[Token]):
|
||||||
self.tokens: list[Token] = []
|
self.tokens: list[Token] = list(filter(lambda t: t.type not in self.IGNORE, tokens))
|
||||||
self.current: int = 0
|
self.current: int = 0
|
||||||
self.length: int = 0
|
self.length: int = len(self.tokens)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def error(token: Token, msg: str):
|
def error(token: Token, msg: str):
|
||||||
Pebble.token_error(token, msg)
|
Pebble.token_error(token, msg)
|
||||||
return ParsingError()
|
return ParsingError()
|
||||||
|
|
||||||
def parse(self, tokens: list[Token]) -> list[Stmt]:
|
def parse(self) -> list[Stmt]:
|
||||||
self.tokens = list(filter(lambda t: t.type not in self.IGNORE, tokens))
|
|
||||||
self.current = 0
|
|
||||||
self.length = len(self.tokens)
|
|
||||||
|
|
||||||
statements: list[Stmt] = []
|
statements: list[Stmt] = []
|
||||||
self.skip_newlines()
|
self.skip_newlines()
|
||||||
while not self.is_at_end():
|
while not self.is_at_end():
|
||||||
|
|||||||
Reference in New Issue
Block a user