From d90fcb4048f720a238cbb350164ec8f63d1eec60 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 19 Jun 2016 21:56:09 +0300 Subject: Created ternary operator. Closes #538. --- mesonbuild/interpreter.py | 12 ++++++++++++ mesonbuild/mparser.py | 14 ++++++++++++++ 2 files changed, 26 insertions(+) (limited to 'mesonbuild') diff --git a/mesonbuild/interpreter.py b/mesonbuild/interpreter.py index 5201be2..fddc3c0 100644 --- a/mesonbuild/interpreter.py +++ b/mesonbuild/interpreter.py @@ -1323,6 +1323,8 @@ class Interpreter(): return self.evaluate_plusassign(cur) elif isinstance(cur, mparser.IndexNode): return self.evaluate_indexing(cur) + elif isinstance(cur, mparser.TernaryNode): + return self.evaluate_ternary(cur) elif self.is_elementary_type(cur): return cur else: @@ -2401,6 +2403,16 @@ class Interpreter(): if not isinstance(node.elseblock, mparser.EmptyNode): self.evaluate_codeblock(node.elseblock) + def evaluate_ternary(self, node): + assert(isinstance(node, mparser.TernaryNode)) + result = self.evaluate_statement(node.condition) + if not isinstance(result, bool): + raise InterpreterException('Ternary condition is not boolean.') + if result: + return self.evaluate_statement(node.trueblock) + else: + return self.evaluate_statement(node.falseblock) + def evaluate_foreach(self, node): assert(isinstance(node, mparser.ForeachClauseNode)) varname = node.varname.value diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py index fd720fb..b3fdba8 100644 --- a/mesonbuild/mparser.py +++ b/mesonbuild/mparser.py @@ -67,6 +67,7 @@ class Lexer: ('lt', re.compile(r'<')), ('ge', re.compile(r'>=')), ('gt', re.compile(r'>')), + ('questionmark', re.compile(r'\?')), ] def lex(self, code): @@ -282,6 +283,14 @@ class IfNode(): self.condition = condition self.block = block +class TernaryNode(): + def __init__(self, lineno, colno, condition, trueblock, falseblock): + self.lineno = lineno + self.colno = colno + self.condition = condition + self.trueblock = trueblock + self.falseblock = falseblock + class ArgumentNode(): def __init__(self, token): self.lineno = token.lineno @@ -383,6 +392,11 @@ class Parser: raise ParseException('Assignment target must be an id.', left.lineno, left.colno) return AssignmentNode(left.lineno, left.colno, left.value, value) + elif self.accept('questionmark'): + trueblock = self.e1() + self.expect('colon') + falseblock = self.e1() + return TernaryNode(left.lineno, left.colno, left, trueblock, falseblock) return left def e2(self): -- cgit v1.1 From b382abdd2c307d0716353013022df5039991ac1f Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sun, 19 Jun 2016 22:02:59 +0300 Subject: Forbid nested ternary operations. --- mesonbuild/mparser.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'mesonbuild') diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py index b3fdba8..2f0eb2d 100644 --- a/mesonbuild/mparser.py +++ b/mesonbuild/mparser.py @@ -353,6 +353,7 @@ class Parser: def __init__(self, code): self.stream = Lexer().lex(code) self.getsym() + self.in_ternary = False def getsym(self): try: @@ -393,9 +394,14 @@ class Parser: left.lineno, left.colno) return AssignmentNode(left.lineno, left.colno, left.value, value) elif self.accept('questionmark'): + if self.in_ternary: + raise ParseException('Nested ternary operators are not allowed.', + left.lineno, left.colno) + self.in_ternary = True trueblock = self.e1() self.expect('colon') falseblock = self.e1() + self.in_ternary = False return TernaryNode(left.lineno, left.colno, left, trueblock, falseblock) return left -- cgit v1.1