aboutsummaryrefslogtreecommitdiff
path: root/mesonbuild/mparser.py
diff options
context:
space:
mode:
Diffstat (limited to 'mesonbuild/mparser.py')
-rw-r--r--mesonbuild/mparser.py63
1 files changed, 34 insertions, 29 deletions
diff --git a/mesonbuild/mparser.py b/mesonbuild/mparser.py
index f1c6071..3dd8f0a 100644
--- a/mesonbuild/mparser.py
+++ b/mesonbuild/mparser.py
@@ -201,7 +201,7 @@ class Lexer:
lines = value.split('\n')
if len(lines) > 1:
lineno += len(lines) - 1
- line_start = mo.end() - len(lines[-1])
+ line_start = mo.end() - len(lines[-1]) - 3
elif tid == 'eol_cont':
lineno += 1
line_start = loc
@@ -221,7 +221,7 @@ class Lexer:
yield Token(tid, filename, curline_start, curline, col, bytespan, value)
break
if not matched:
- raise ParseException('lexer', self.getline(line_start), lineno, col)
+ raise ParseException(f'lexer: unrecognized token {self.code[loc]!r}', self.getline(line_start), lineno, loc - line_start)
@dataclass
class BaseNode:
@@ -369,6 +369,13 @@ class ArgumentNode(BaseNode):
mlog.warning('This will be an error in Meson 2.0.')
self.kwargs[name] = value
+ def get_kwarg_or_default(self, name: str, default: BaseNode) -> BaseNode:
+ for k, v in self.kwargs.items():
+ assert isinstance(k, IdNode)
+ if k.value == name:
+ return v
+ return default
+
def set_kwarg_no_check(self, name: BaseNode, value: BaseNode) -> None:
self.kwargs[name] = value
@@ -676,15 +683,16 @@ comparison_map: T.Mapping[str, COMPARISONS] = {
# levels so there are not enough words to describe them all.
# Enter numbering:
#
-# 1 assignment
-# 2 or
-# 3 and
-# 4 comparison
-# 5 arithmetic
-# 6 negation
-# 7 funcall, method call
-# 8 parentheses
-# 9 plain token
+# 1 assignment
+# 2 or
+# 3 and
+# 4 comparison
+# 5 addition and subtraction
+# 6 multiplication, division and modulus
+# 7 negation
+# 8 funcall, method call
+# 9 parentheses
+# 10 plain token
class Parser:
def __init__(self, code: str, filename: str):
@@ -831,50 +839,47 @@ class Parser:
return left
def e5(self) -> BaseNode:
- return self.e5addsub()
-
- def e5addsub(self) -> BaseNode:
op_map = {
'plus': 'add',
'dash': 'sub',
}
- left = self.e5muldiv()
+ left = self.e6()
while True:
op = self.accept_any(tuple(op_map.keys()))
if op:
operator = self.create_node(SymbolNode, self.previous)
- left = self.create_node(ArithmeticNode, op_map[op], left, operator, self.e5muldiv())
+ left = self.create_node(ArithmeticNode, op_map[op], left, operator, self.e6())
else:
break
return left
- def e5muldiv(self) -> BaseNode:
+ def e6(self) -> BaseNode:
op_map = {
'percent': 'mod',
'star': 'mul',
'fslash': 'div',
}
- left = self.e6()
+ left = self.e7()
while True:
op = self.accept_any(tuple(op_map.keys()))
if op:
operator = self.create_node(SymbolNode, self.previous)
- left = self.create_node(ArithmeticNode, op_map[op], left, operator, self.e6())
+ left = self.create_node(ArithmeticNode, op_map[op], left, operator, self.e7())
else:
break
return left
- def e6(self) -> BaseNode:
+ def e7(self) -> BaseNode:
if self.accept('not'):
operator = self.create_node(SymbolNode, self.previous)
- return self.create_node(NotNode, self.current, operator, self.e7())
+ return self.create_node(NotNode, self.current, operator, self.e8())
if self.accept('dash'):
operator = self.create_node(SymbolNode, self.previous)
- return self.create_node(UMinusNode, self.current, operator, self.e7())
- return self.e7()
+ return self.create_node(UMinusNode, self.current, operator, self.e8())
+ return self.e8()
- def e7(self) -> BaseNode:
- left = self.e8()
+ def e8(self) -> BaseNode:
+ left = self.e9()
block_start = self.current
if self.accept('lparen'):
lpar = self.create_node(SymbolNode, block_start)
@@ -897,7 +902,7 @@ class Parser:
left = self.index_call(left)
return left
- def e8(self) -> BaseNode:
+ def e9(self) -> BaseNode:
block_start = self.current
if self.accept('lparen'):
lpar = self.create_node(SymbolNode, block_start)
@@ -918,9 +923,9 @@ class Parser:
rcurl = self.create_node(SymbolNode, self.previous)
return self.create_node(DictNode, lcurl, key_values, rcurl)
else:
- return self.e9()
+ return self.e10()
- def e9(self) -> BaseNode:
+ def e10(self) -> BaseNode:
t = self.current
if self.accept('true'):
t.value = True
@@ -978,7 +983,7 @@ class Parser:
def method_call(self, source_object: BaseNode) -> MethodNode:
dot = self.create_node(SymbolNode, self.previous)
- methodname = self.e9()
+ methodname = self.e10()
if not isinstance(methodname, IdNode):
if isinstance(source_object, NumberNode) and isinstance(methodname, NumberNode):
raise ParseException('meson does not support float numbers',