From 59c1dd44ed9feb4430edbb48f30842ea4b16e18c Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 27 Jul 2013 17:21:59 +0300 Subject: Can do logical negation. --- interpreter.py | 10 ++++++++++ mparser.py | 5 +++++ nodes.py | 5 +++++ test cases/common/40 logic ops/meson.build | 13 +++++++++++++ 4 files changed, 33 insertions(+) diff --git a/interpreter.py b/interpreter.py index aa7a0f932..f84298df9 100644 --- a/interpreter.py +++ b/interpreter.py @@ -845,6 +845,8 @@ class Interpreter(): return self.evaluate_andstatement(cur) elif isinstance(cur, nodes.OrStatement): return self.evaluate_orstatement(cur) + elif isinstance(cur, nodes.NotStatement): + return self.evaluate_notstatement(cur) else: raise InvalidCode("Unknown statement.") @@ -1263,6 +1265,14 @@ class Interpreter(): if not isinstance(r, bool): raise InterpreterException('Second argument to "or" is not a boolean.') return r + + def evaluate_notstatement(self, cur): + v = self.evaluate_statement(cur.val) + if isinstance(v, nodes.BoolStatement): + v = v.get_value() + if not isinstance(v, bool): + raise InterpreterException('First argument to "or" is not a boolean.') + return not v def evaluate_arraystatement(self, cur): (arguments, kwargs) = self.reduce_arguments(cur.get_args()) diff --git a/mparser.py b/mparser.py index c4f1c390f..f603f2ffe 100644 --- a/mparser.py +++ b/mparser.py @@ -71,6 +71,7 @@ precedence = ( ('nonassoc', 'EQUALS', 'NEQUALS'), ('left', 'OR'), ('left', 'AND'), +('right', 'NOT'), ('nonassoc', 'COLON'), ('left', 'DOT'), ) @@ -200,6 +201,10 @@ def p_statement_or(t): 'statement : statement OR statement' t[0] = nodes.OrStatement(t[1], t[3]) +def p_statement_not(t): + 'statement : NOT statement' + t[0] = nodes.NotStatement(t[2]) + def p_empty_else(t): 'elseblock : ' return None diff --git a/nodes.py b/nodes.py index e6d084c09..49d68e8ff 100644 --- a/nodes.py +++ b/nodes.py @@ -94,6 +94,11 @@ class OrStatement(Statement): self.left = left self.right = right +class NotStatement(Statement): + def __init__(self, val): + Statement.__init__(self, val.lineno) + self.val = val + class IfStatement(Statement): def __init__(self, clause, trueblock, falseblock, lineno): Statement.__init__(self, lineno) diff --git a/test cases/common/40 logic ops/meson.build b/test cases/common/40 logic ops/meson.build index 8d2dc9f59..1f6ed8f90 100644 --- a/test cases/common/40 logic ops/meson.build +++ b/test cases/common/40 logic ops/meson.build @@ -62,3 +62,16 @@ if t or true else error('Not ok.') endif + +if not true + error('Negation failed.') +else + message('Ok.') +endif + +if not f + message('Ok.') +else + error('Negation failed.') +endif + -- cgit v1.2.3