from collections import deque from typing import Iterable from icecream import ic from math_objects import Operator, Token def translate(tokens: Iterable[Token]) -> Iterable[Token]: operator_stack: deque[Operator] = deque() previous_precedence = 0 for token in tokens: if not isinstance(token, Operator): yield token continue if token.precedence <= previous_precedence: for item in reversed(operator_stack): yield item operator_stack.clear() previous_precedence = token.precedence operator_stack.append(token) ic(len(operator_stack)) if operator_stack: for item in reversed(operator_stack): yield item