def run(self, interpreter: Interpreter): if self.collection is None: interpreter.run(self.tokens[-1]) self.collection = interpreter.stack_pop().get_value() try: collection_value = self.collection[self._index] except IndexError: self.reset() raise exceptions.BreakIterationException(self) from None except TypeError: raise exceptions.TypeException( f"Cannot iterate through value of type {self.collection.__class__.__name__}!", token=self, ) from None value = self.TOKEN_FACTORY.create_any_value(value=collection_value) interpreter.stack_append(value) self._index += 1 # ignore collection (last token), as it was previously run for token in self.tokens[:-1]: interpreter.run(token) # append it again, this value can be consumed by optional for-each # condition, or needs to be thrown away by for-each loop if no condition interpreter.stack_append(value)
def _get_condition_result(self, value: Any, interpreter: Interpreter) -> bool: if not self.has_all_optionals: return bool(value) interpreter.stack_append(self.TOKEN_FACTORY.create_any_value(value)) interpreter.run(self.tokens[1]) # type: ignore return interpreter.stack_pop().get_value()
def run(self, interpreter: Interpreter): """Runs all subtokens, then itself""" if self._sorted_tokens is None: self._sorted_tokens = sorted( [x for x in self.tokens if x.functional], key=lambda x: x.run_order ) for token in self._sorted_tokens: interpreter.run(token) # type: ignore self._run(interpreter)
def run(self, interpreter: Interpreter): interpreter.run(self.tokens[-1]) clause_function = interpreter.stack_pop().get_value() condition = self.tokens[0] while True: condition.run(interpreter) if not interpreter.stack_pop().get_value(): break try: clause_function(interpreter) except exceptions.BreakIterationException: break
def run(self, interpreter: Interpreter): interpreter.run(self.tokens[0]) collection = interpreter.stack_pop().get_value() for value in collection: result = self._get_condition_result(value, interpreter) if self._check_if_should_break(result): # pylint: disable=no-member condition_value = not self.initial_condition_value break else: condition_value = self.initial_condition_value result = self.TOKEN_FACTORY.create_value(condition_value) interpreter.stack_append(result)
def _import_tokens(self, interpreter: Interpreter, filename: str) -> None: if self.TOKEN_COMPILER is not None: try: tokens = self.TOKEN_COMPILER.read_compiled_file(filename) except self.TOKEN_COMPILER.exception: tokens = self._construct_tokens(filename) else: tokens = self._construct_tokens(filename) interpreter.add_stack() for token in tokens: interpreter.init(token) with path.ChangeDir(os.path.dirname(filename)): for token in tokens: interpreter.run(token)
def run(self, interpreter: Interpreter): while True: try: for token in self.tokens: interpreter.run(token) except exceptions.BreakIterationException: break clause = interpreter.stack_pop() try: if self._check_condition(interpreter): clause.get_value()(interpreter) except exceptions.SkipElementException: pass except exceptions.BreakIterationException: break
def run(self, interpreter: Interpreter): interpreter.run(self.tokens[-1]) collection = interpreter.stack_pop().get_value() try: collection_value = collection[self.RETURN_TOKEN_INDEX] except IndexError: raise exceptions.ValueException( "Cannot extract value from empty collection!") from None except TypeError: raise exceptions.TypeException( f"Cannot extract from value of type {collection.__class__.__name__}!", ) from None value = self.TOKEN_FACTORY.create_any_value(collection_value) interpreter.stack_append(value) # ignore collection (last token), as it was previously run for token in self.tokens[:-1]: interpreter.run(token) # append it again, previous stack append gets consumed by IN token interpreter.stack_append(value)
def run(self, interpreter: Interpreter): try: it = interpreter.get_variable("it") except exceptions.UndefinedVariableException: it = None for token in self.tokens[2:]: token.run(interpreter) collection = interpreter.stack_pop() collection_list = collection.get_value() self.tokens[0].run(interpreter) variable = interpreter.stack_pop() try: collection_value = list(collection.get_value()) except TypeError: raise exceptions.TypeException( f"Value of type {collection.get_value().__class__.__name__} is not iterable!" ) from None indices = [] for i, value in enumerate(collection_value): interpreter.stack_append( self.TOKEN_FACTORY.create_any_value(value)) interpreter.run(self.tokens[1]) # type: ignore condition_value = interpreter.stack_pop().get_value() if condition_value: indices.append(i) values = [] for i, index in enumerate(indices): values.append(collection_list.pop(index - i)) variable.value = values interpreter.set_variable(variable.name, variable) if it is not None: interpreter.set_variable("it", it)
def run(self, interpreter: Interpreter): interpreter.run(self.tokens[0]) import_variables = interpreter.stack_pop().value filename = self.tokens[-1].value import_ = (self._import_python_module if filename.endswith(".py") else self._import_tokens) try: import_(interpreter, filename) except (FileNotFoundError, ModuleNotFoundError): raise exceptions.ImportException( f"Failed to import because file could not be found: {filename}", token=self, ) from None variables: List[Variable] = [] for import_variable in import_variables: try: variable = interpreter.get_variable(import_variable.name) except AttributeError: type_ = import_variable.value.__class__.__name__ raise exceptions.ValueException( f"Cannot import: value of type {type_} is not a variable!" ) from None if variable.get_qualifier("private"): raise exceptions.ImportException( f"Could not import private variable {variable.name} from module {filename}!", token=self, ) from None variables.append(variable) interpreter.remove_stack() for variable in variables: interpreter.set_variable(variable.name, variable)
def _run_tokens(self, interpreter: Interpreter): for token in self._runnable_tokens: interpreter.run(token) interpreter.stack_append(self._none)
def run(self, interpreter: Interpreter): for token in self.tokens: interpreter.run(token)