from collections import deque from typing import Iterable, Literal, Optional from math_objects import Integer, Operator, Parenthesis, Token def tokenize(string: str) -> Iterable[Token]: buffer: deque[str] = deque() def _take_buffer() -> str: string = "".join(buffer) buffer.clear() return string for c in string: if c.isdigit(): buffer.append(c) elif c in ["+", "-", "*", "/", "(", ")"]: if buffer: yield Integer.create_from_string(_take_buffer()) match c: case "+" | "-": yield Operator(c, precedence=1) case "*" | "/": yield Operator(c, precedence=2) case _: yield Parenthesis(c) # type: ignore elif c == " ": pass else: raise SyntaxError(f"Недопустимый символ: {c}") if buffer: yield Integer.create_from_string(_take_buffer())