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: if node is None:
return return
if not isinstance(node, nodes.CodeBlock): if not isinstance(node, nodes.CodeBlock):
print(node)
e = InvalidCode('Tried to execute a non-codeblock. Possibly a bug in the parser.') e = InvalidCode('Tried to execute a non-codeblock. Possibly a bug in the parser.')
e.lineno = node.lineno() e.lineno = node.lineno()
raise e raise e
@ -1196,22 +1197,44 @@ class Interpreter():
return obj.method_call(method_name, args, kwargs) return obj.method_call(method_name, args, kwargs)
def evaluate_if(self, node): def evaluate_if(self, node):
result = self.evaluate_statement(node.get_clause()) result = self.evaluate_statement(node.clause)
cond = None cond = None
if isinstance(result, nodes.BoolExpression) or \ if isinstance(result, nodes.BoolExpression) or \
isinstance(result, nodes.BoolStatement): isinstance(result, nodes.BoolStatement):
cond = result.get_value() cond = result.get_value()
if isinstance(result, bool): if isinstance(result, bool):
cond = result cond = result
if cond is not None: if cond is not None:
if cond: if cond:
self.evaluate_codeblock(node.get_trueblock()) self.evaluate_codeblock(node.trueblock)
else: 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: else:
raise InvalidCode('If clause does not evaluate to true or false.') 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): def is_elementary_type(self, v):
if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool): if isinstance(v, int) or isinstance(v, str) or isinstance(v, bool):
return True return True

@ -129,6 +129,7 @@ if __name__ == '__main__':
else: else:
this_file = resolved this_file = resolved
app = MesonApp(dir1, dir2, this_file, options) app = MesonApp(dir1, dir2, this_file, options)
app.generate()
try: try:
app.generate() app.generate()
except Exception as e: except Exception as e:

@ -26,6 +26,7 @@ reserved = {'true' : 'TRUE',
'false' : 'FALSE', 'false' : 'FALSE',
'if' : 'IF', 'if' : 'IF',
'endif' : 'ENDIF', 'endif' : 'ENDIF',
'elif' : 'ELIF',
'else' : 'ELSE', 'else' : 'ELSE',
'and' : 'AND', 'and' : 'AND',
'or' : 'OR', 'or' : 'OR',
@ -205,6 +206,10 @@ def p_statement_not(t):
'statement : NOT statement' 'statement : NOT statement'
t[0] = nodes.NotStatement(t[2]) 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): def p_empty_else(t):
'elseblock : ' 'elseblock : '
return None return None

@ -106,6 +106,13 @@ class IfStatement(Statement):
self.trueblock = trueblock self.trueblock = trueblock
self.falseblock = falseblock 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): def get_clause(self):
return self.clause return self.clause

Loading…
Cancel
Save