34 lines
1017 B
Python
34 lines
1017 B
Python
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())
|