feat: add compound assignments
This commit is contained in:
@@ -3,3 +3,7 @@ let b = 5
|
|||||||
let c = a + b
|
let c = a + b
|
||||||
c *= 7
|
c *= 7
|
||||||
let d = (3.2 - 0.2) + 4 * 6 / 2
|
let d = (3.2 - 0.2) + 4 * 6 / 2
|
||||||
|
print(a)
|
||||||
|
print(b)
|
||||||
|
print(c)
|
||||||
|
print(d)
|
||||||
@@ -45,16 +45,16 @@ class Interpreter(Expr.Visitor[Any], Stmt.Visitor[None]):
|
|||||||
right: Any = self.evaluate(expr.right)
|
right: Any = self.evaluate(expr.right)
|
||||||
|
|
||||||
match expr.operator.type:
|
match expr.operator.type:
|
||||||
case TokenType.MINUS:
|
case TokenType.MINUS | TokenType.MINUS_EQUAL:
|
||||||
self.check_number_operands(expr.operator, left, right)
|
self.check_number_operands(expr.operator, left, right)
|
||||||
return float(left) - float(right)
|
return float(left) - float(right)
|
||||||
case TokenType.SLASH:
|
case TokenType.SLASH | TokenType.SLASH_EQUAL:
|
||||||
self.check_number_operands(expr.operator, left, right)
|
self.check_number_operands(expr.operator, left, right)
|
||||||
return float(left) / float(right)
|
return float(left) / float(right)
|
||||||
case TokenType.STAR:
|
case TokenType.STAR | TokenType.STAR_EQUAL:
|
||||||
self.check_number_operands(expr.operator, left, right)
|
self.check_number_operands(expr.operator, left, right)
|
||||||
return float(left) * float(right)
|
return float(left) * float(right)
|
||||||
case TokenType.PLUS:
|
case TokenType.PLUS | TokenType.PLUS_EQUAL:
|
||||||
if isinstance(left, float) and isinstance(right, float):
|
if isinstance(left, float) and isinstance(right, float):
|
||||||
return float(left) + float(right)
|
return float(left) + float(right)
|
||||||
if isinstance(left, str) and isinstance(right, str):
|
if isinstance(left, str) and isinstance(right, str):
|
||||||
|
|||||||
@@ -140,13 +140,23 @@ class Parser:
|
|||||||
|
|
||||||
def assignment(self) -> Expr:
|
def assignment(self) -> Expr:
|
||||||
expr: Expr = self.equality()
|
expr: Expr = self.equality()
|
||||||
if self.match(TokenType.EQUAL):
|
if self.match(TokenType.EQUAL, TokenType.PLUS_EQUAL, TokenType.MINUS_EQUAL, TokenType.STAR_EQUAL, TokenType.SLASH_EQUAL):
|
||||||
equals: Token = self.previous()
|
operator: Token = self.previous()
|
||||||
value: Expr = self.assignment()
|
value: Expr = self.assignment()
|
||||||
if isinstance(expr, VariableExpr):
|
if isinstance(expr, VariableExpr):
|
||||||
name: Token = expr.name
|
name: Token = expr.name
|
||||||
return AssignExpr(name, value)
|
if operator.type == TokenType.EQUAL:
|
||||||
self.error(equals, "Invalid assignment target.")
|
return AssignExpr(name, value)
|
||||||
|
else:
|
||||||
|
return AssignExpr(
|
||||||
|
name,
|
||||||
|
BinaryExpr(
|
||||||
|
VariableExpr(name),
|
||||||
|
operator,
|
||||||
|
value
|
||||||
|
)
|
||||||
|
)
|
||||||
|
self.error(operator, "Invalid assignment target.")
|
||||||
return expr
|
return expr
|
||||||
|
|
||||||
def equality(self) -> Expr:
|
def equality(self) -> Expr:
|
||||||
|
|||||||
Reference in New Issue
Block a user