def _add_token(self, token: Token) -> None: if token.text in operations: token = Node(token, NODE_OP) elif token.text in unary_op: token = Node(token, NODE_UNARY) elif token.text in ['x', 'X']: token = Node(token, NODE_VAR) elif token.isdigit(): token = Node(token, NODE_NUM) else: raise ValidateError("Undefined token", token) self._stack.push(token)
def select_action(self, val: Token) \ -> None: if val.position >= self._position: self._position = val.position if val.text in OPS: self._handle_operator(val) elif val.text.isspace(): pass elif val.isdigit(): if self._previous_token == ')': self.select_action(Token('*', self._position)) self._res.append(val) self._possible_unary = False elif val.text in ['x', 'X']: if self.__previous_is_digit() or \ self._previous_token in ['x', 'X'] or \ self._previous_token == ')': self.select_action(Token('*', self._position)) self._res.append(val) self._possible_unary = False elif val.text == '(': self.__increase_stack(val) self._possible_unary = True elif val.text == ')': if self._previous_token in OPS: raise ValidateError( "Перед закрывающими скобками стоит " "знак операции", val) self._handle_parentheses(val) self._possible_unary = False elif val.text == '=': if self._moved_left: raise ValidateError("Not more than one quality sign allowed", val) self._handle_eos() self._move_to_left() self._possible_unary = True else: raise ValidateError(f"Unknown token '{val.text}'", val)