aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interpreter.py33
-rwxr-xr-xmeson.py1
-rw-r--r--mparser.py5
-rw-r--r--nodes.py7
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
diff --git a/meson.py b/meson.py
index 0ea4cea..a8307d2 100755
--- a/meson.py
+++ b/meson.py
@@ -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:
diff --git a/mparser.py b/mparser.py
index f603f2f..20531d4 100644
--- a/mparser.py
+++ b/mparser.py
@@ -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
diff --git a/nodes.py b/nodes.py
index 49d68e8..bc149f8 100644
--- a/nodes.py
+++ b/nodes.py
@@ -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