aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--interpreter.py10
-rw-r--r--mparser.py11
-rw-r--r--test cases/common/59 object generator/meson.build2
3 files changed, 21 insertions, 2 deletions
diff --git a/interpreter.py b/interpreter.py
index 8c16518..0ab7291 100644
--- a/interpreter.py
+++ b/interpreter.py
@@ -945,6 +945,8 @@ class Interpreter():
return self.evaluate_orstatement(cur)
elif isinstance(cur, mparser.NotNode):
return self.evaluate_notstatement(cur)
+ elif isinstance(cur, mparser.UMinusNode):
+ return self.evaluate_uminusstatement(cur)
elif isinstance(cur, mparser.ArithmeticNode):
return self.evaluate_arithmeticstatement(cur)
elif isinstance(cur, mparser.ForeachClauseNode):
@@ -1791,6 +1793,14 @@ class Interpreter():
raise InterpreterException('Argument to "not" is not a boolean.')
return not v
+ def evaluate_uminusstatement(self, cur):
+ v = self.evaluate_statement(cur.value)
+ if isinstance(v, mparser.NumberNode):
+ v = v.value
+ if not isinstance(v, int):
+ raise InterpreterException('Argument to negation is not an integer.')
+ return -v
+
def evaluate_arithmeticstatement(self, cur):
l = self.to_native(self.evaluate_statement(cur.left))
r = self.to_native(self.evaluate_statement(cur.right))
diff --git a/mparser.py b/mparser.py
index e8f20a5..7d56c8b 100644
--- a/mparser.py
+++ b/mparser.py
@@ -41,7 +41,7 @@ class Lexer:
# Need to be sorted longest to shortest.
('ignore', re.compile(r'[ \t]')),
('id', re.compile('[_a-zA-Z][_0-9a-zA-Z]*')),
- ('number', re.compile(r'-?\d+')),
+ ('number', re.compile(r'\d+')),
('eol_cont', re.compile(r'\\\n')),
('eol', re.compile(r'\n')),
('multiline_string', re.compile(r"'''(.|\n)*?'''", re.M)),
@@ -114,6 +114,7 @@ class Lexer:
else:
value = match_text
yield Token(tid, curline, col, value)
+ break
if not matched:
raise ParseException('lexer', lineno, col)
@@ -245,6 +246,12 @@ class IfClauseNode():
self.ifs = []
self.elseblock = EmptyNode()
+class UMinusNode():
+ def __init__(self, lineno, colno, value):
+ self.lineno = lineno
+ self.colno = colno
+ self.value = value
+
class IfNode():
def __init__(self, lineno, colno, condition, block):
self.lineno = lineno
@@ -392,6 +399,8 @@ class Parser:
def e6(self):
if self.accept('not'):
return NotNode(self.current.lineno, self.current.colno, self.e7())
+ if self.accept('dash'):
+ return UMinusNode(self.current.lineno, self.current.colno, self.e7())
return self.e7()
def e7(self):
diff --git a/test cases/common/59 object generator/meson.build b/test cases/common/59 object generator/meson.build
index d2c8afb..61349c2 100644
--- a/test cases/common/59 object generator/meson.build
+++ b/test cases/common/59 object generator/meson.build
@@ -12,7 +12,7 @@ else
outputname = '@BASENAME@.o'
endif
-cc = meson.get_compiler('c').cmd_array().get(0-1)
+cc = meson.get_compiler('c').cmd_array().get(-1)
# Generate an object file manually.
gen = generator(python,
output : outputname,