diff options
Diffstat (limited to 'interpreter.py')
-rw-r--r-- | interpreter.py | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/interpreter.py b/interpreter.py index 51043e1..fd1507a 100644 --- a/interpreter.py +++ b/interpreter.py @@ -807,6 +807,8 @@ class Interpreter(): return self.evaluate_orstatement(cur) elif isinstance(cur, mparser.NotNode): return self.evaluate_notstatement(cur) + elif isinstance(cur, mparser.ForeachClauseNode): + return self.evaluate_foreach(cur) else: raise InvalidCode("Unknown statement.") @@ -1486,6 +1488,13 @@ class Interpreter(): def array_method_call(self, obj, method_name, args): if method_name == 'contains': return self.check_contains(obj, args) + elif method_name == 'get': + index = args[0] + if not isinstance(index, int): + raise InvalidArguments('Array index must be a number.') + if index < 0 or index >= len(obj): + raise InvalidArguments('Array index %s is out of bounds for array of size %d.' % (index, len(obj))) + return obj[index] raise InterpreterException('Arrays do not have a method called "%s".' % method_name) def check_contains(self, obj, args): @@ -1517,6 +1526,16 @@ class Interpreter(): if not isinstance(node.elseblock, mparser.EmptyNode): self.evaluate_codeblock(node.elseblock) + def evaluate_foreach(self, node): + assert(isinstance(node, mparser.ForeachClauseNode)) + varname = node.varname.value + items = self.evaluate_statement(node.items) + if not isinstance(items, list): + raise InvalidArguments('Items of foreach loop is not an array') + for item in items: + self.set_variable(varname, item) + self.evaluate_codeblock(node.block) + def is_elementary_type(self, v): if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool): return True |