diff options
Diffstat (limited to 'interpreter.py')
-rw-r--r-- | interpreter.py | 33 |
1 files changed, 28 insertions, 5 deletions
diff --git a/interpreter.py b/interpreter.py index 0474100..154ed40 100644 --- a/interpreter.py +++ b/interpreter.py @@ -793,6 +793,7 @@ class Interpreter(): if node is None: return if not isinstance(node, nodes.CodeBlock): + print(node) e = InvalidCode('Tried to execute a non-codeblock. Possibly a bug in the parser.') e.lineno = node.lineno() raise e @@ -1196,22 +1197,44 @@ class Interpreter(): return obj.method_call(method_name, args, kwargs) def evaluate_if(self, node): - result = self.evaluate_statement(node.get_clause()) + result = self.evaluate_statement(node.clause) cond = None if isinstance(result, nodes.BoolExpression) or \ isinstance(result, nodes.BoolStatement): cond = result.get_value() if isinstance(result, bool): cond = result - if cond is not None: if cond: - self.evaluate_codeblock(node.get_trueblock()) + self.evaluate_codeblock(node.trueblock) else: - self.evaluate_codeblock(node.get_falseblock()) + block = node.falseblock + if isinstance(block, nodes.ElifStatement): + self.evaluate_elif(block) + else: + self.evaluate_codeblock(block) else: raise InvalidCode('If clause does not evaluate to true or false.') - + + def evaluate_elif(self, node): + result = self.evaluate_statement(node.clause) + cond = None + if isinstance(result, nodes.BoolExpression) or \ + isinstance(result, nodes.BoolStatement): + cond = result.get_value() + if isinstance(result, bool): + cond = result + if cond is not None: + if cond: + self.evaluate_codeblock(node.trueblock) + else: + block = node.elseblock + if isinstance(block, nodes.ElifStatement): + self.evaluate_elif(block) + self.evaluate_codeblock(block) + else: + raise InvalidCode('Elif clause does not evaluate to true or false.') + def is_elementary_type(self, v): if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool): return True |