🐐 Negation
This commit is contained in:
@@ -330,6 +330,18 @@ class BinOp(Node):
|
||||
raise Exception(self.op)
|
||||
|
||||
|
||||
class UnaryMinus(Node):
|
||||
def __init__(self, expr):
|
||||
self.expr = expr
|
||||
|
||||
def __repr__(self):
|
||||
return f"UnaryMinus({self.expr!r})"
|
||||
|
||||
def _eval(self, vtable):
|
||||
vtable, val = self.expr.eval(vtable)
|
||||
return vtable, ValInt(-val.value())
|
||||
|
||||
|
||||
class SiStatement(Node):
|
||||
def __init__(self, test, statements, else_part) -> None:
|
||||
self.test = test
|
||||
|
||||
@@ -14,7 +14,8 @@ class Parser():
|
||||
('left', ["KEYWORD_ET"]),
|
||||
('left', ["KEYWORD_PLVS", "KEYWORD_MINVS", "KEYWORD_EST"]),
|
||||
('left', ["SYMBOL_PLUS", "SYMBOL_MINUS"]),
|
||||
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"])
|
||||
('left', ["SYMBOL_TIMES", "SYMBOL_DIVIDE"]),
|
||||
('right', ["UMINUS"]),
|
||||
]
|
||||
)
|
||||
|
||||
@@ -173,6 +174,10 @@ class Parser():
|
||||
def binop(tokens):
|
||||
return ast_nodes.BinOp(tokens[0], tokens[2], tokens[1].name)
|
||||
|
||||
@self.pg.production('expression : SYMBOL_MINUS expression', precedence='UMINUS')
|
||||
def unary_minus(tokens):
|
||||
return ast_nodes.UnaryMinus(tokens[1])
|
||||
|
||||
@self.pg.production('expression : KEYWORD_INVOCA id expressions')
|
||||
def invoca(tokens):
|
||||
return ast_nodes.Invoca(tokens[1], tokens[2])
|
||||
|
||||
Reference in New Issue
Block a user