Exemple #1
0
 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)
Exemple #2
0
 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)