diff options
-rw-r--r-- | interpreter.py | 33 | ||||
-rwxr-xr-x | meson.py | 1 | ||||
-rw-r--r-- | mparser.py | 5 | ||||
-rw-r--r-- | nodes.py | 7 |
4 files changed, 41 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 @@ -129,6 +129,7 @@ if __name__ == '__main__': else: this_file = resolved app = MesonApp(dir1, dir2, this_file, options) + app.generate() try: app.generate() except Exception as e: @@ -26,6 +26,7 @@ reserved = {'true' : 'TRUE', 'false' : 'FALSE', 'if' : 'IF', 'endif' : 'ENDIF', + 'elif' : 'ELIF', 'else' : 'ELSE', 'and' : 'AND', 'or' : 'OR', @@ -205,6 +206,10 @@ def p_statement_not(t): 'statement : NOT statement' t[0] = nodes.NotStatement(t[2]) +def p_statement_elif(t): + 'elseblock : ELIF statement EOL codeblock elseblock' + t[0] = nodes.ElifStatement(t[2], t[4], t[5], t.lineno(1)) + def p_empty_else(t): 'elseblock : ' return None @@ -106,6 +106,13 @@ class IfStatement(Statement): self.trueblock = trueblock self.falseblock = falseblock +class ElifStatement(Statement): + def __init__(self, clause, trueblock, elseblock, lineno): + Statement.__init__(self, lineno) + self.clause = clause + self.trueblock = trueblock + self.elseblock = elseblock + def get_clause(self): return self.clause |