Some sort of elif implementation.

pull/15/head
Jussi Pakkanen 12 years ago
parent 6b5c4b0a69
commit e8fba977f4
  1. 33
      interpreter.py
  2. 1
      meson.py
  3. 5
      mparser.py
  4. 7
      nodes.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

Loading…
Cancel
Save