diff options
-rw-r--r-- | interpreter.py | 29 | ||||
-rwxr-xr-x | parsertest.py | 2 |
2 files changed, 12 insertions, 19 deletions
diff --git a/interpreter.py b/interpreter.py index 8c7695e..54a92d7 100644 --- a/interpreter.py +++ b/interpreter.py @@ -721,7 +721,7 @@ class Interpreter(): return cur elif isinstance(cur, mparser2.BooleanNode): return cur - elif isinstance(cur, mparser2.IfNode): + elif isinstance(cur, mparser2.IfClauseNode): return self.evaluate_if(cur) elif isinstance(cur, mparser2.IdNode): return self.get_variable(cur.value) @@ -1293,23 +1293,16 @@ class Interpreter(): return obj.method_call(method_name, args, kwargs) def evaluate_if(self, node): - result = self.evaluate_statement(node.clause) - cond = None - if isinstance(result, mparser2.BooleanNode): - 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.falseblock - if isinstance(block, nodes.IfStatement): - self.evaluate_if(block) - else: - self.evaluate_codeblock(block) - else: - raise InvalidCode('If clause does not evaluate to true or false.') + assert(isinstance(node, mparser2.IfClauseNode)) + for i in node.ifs: + result = self.evaluate_statement(i.condition) + if not(isinstance(result, bool)): + raise InvalidCode('If clause does not evaluate to true or false.') + if result: + self.evaluate_codeblock(i.block) + return + if not isinstance(node.elseblock, mparser2.EmptyNode): + self.evaluate_codeblock(node.elseblock) def is_elementary_type(self, v): if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool): diff --git a/parsertest.py b/parsertest.py index c530af0..6adb1f4 100755 --- a/parsertest.py +++ b/parsertest.py @@ -377,7 +377,7 @@ class Parser: if self.accept('true'): return BooleanNode(t, True); if self.accept('false'): - BooleanNode(t, False) + return BooleanNode(t, False) if self.accept('id'): return IdNode(t) if self.accept('number'): |