aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mparser.py
diff options
context:
space:
mode:
authorJussi Pakkanen <jpakkane@gmail.com>2018-10-07 20:02:03 +0300
committerGitHub <noreply@github.com>2018-10-07 20:02:03 +0300
commit85efd363cbcbf3ac5d917a14fe1fccc857c1e859 (patch)
treef151c2b73bca3e8497c7cd9a3ee8333a14f2fa4f /mesonbuild/mparser.py
parent091e079354fe6322823048c9debd1a13bdc7e37f (diff)
parentb6fc063b13ff53c6c36abeb592983f50da995e3b (diff)
downloadmeson-85efd363cbcbf3ac5d917a14fe1fccc857c1e859.zip
meson-85efd363cbcbf3ac5d917a14fe1fccc857c1e859.tar.gz
meson-85efd363cbcbf3ac5d917a14fe1fccc857c1e859.tar.bz2
Merge pull request #3900 from xclaesse/in-operator
Interpreter: Add "in", "not in", "break", and "continue" operators
Diffstat (limited to 'mesonbuild/mparser.py')
-rw-r--r--mesonbuild/mparser.py21
1 files changed, 18 insertions, 3 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index 9af6dac..be5c807 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -90,8 +90,9 @@ class Lexer:
def __init__(self, code):
self.code = code
self.keywords = {'true', 'false', 'if', 'else', 'elif',
- 'endif', 'and', 'or', 'not', 'foreach', 'endforeach'}
- self.future_keywords = {'continue', 'break', 'in', 'return'}
+ 'endif', 'and', 'or', 'not', 'foreach', 'endforeach',
+ 'in', 'continue', 'break'}
+ self.future_keywords = {'return'}
self.token_specification = [
# Need to be sorted longest to shortest.
('ignore', re.compile(r'[ \t]')),
@@ -242,6 +243,12 @@ class StringNode(ElementaryNode):
def __str__(self):
return "String node: '%s' (%d, %d)." % (self.value, self.lineno, self.colno)
+class ContinueNode(ElementaryNode):
+ pass
+
+class BreakNode(ElementaryNode):
+ pass
+
class ArrayNode:
def __init__(self, args):
self.subdir = args.subdir
@@ -436,7 +443,9 @@ comparison_map = {'equal': '==',
'lt': '<',
'le': '<=',
'gt': '>',
- 'ge': '>='
+ 'ge': '>=',
+ 'in': 'in',
+ 'notin': 'not in',
}
# Recursive descent parser for Meson's definition language.
@@ -543,6 +552,8 @@ class Parser:
for nodename, operator_type in comparison_map.items():
if self.accept(nodename):
return ComparisonNode(operator_type, left, self.e5())
+ if self.accept('not') and self.accept('in'):
+ return ComparisonNode('notin', left, self.e5())
return left
def e5(self):
@@ -754,6 +765,10 @@ class Parser:
block = self.foreachblock()
self.block_expect('endforeach', block_start)
return block
+ if self.accept('continue'):
+ return ContinueNode(self.current)
+ if self.accept('break'):
+ return BreakNode(self.current)
return self.statement()
def codeblock(self):