aboutsummaryrefslogtreecommitdiff
path: root/interpreter.py
diff options
context:
space:
mode:
Diffstat (limited to 'interpreter.py')
-rw-r--r--interpreter.py33
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