feat: add compound assignments

This commit is contained in:
2026-02-06 00:37:48 +01:00
parent bf25dc81f0
commit bbe216bdda
3 changed files with 22 additions and 8 deletions

View File

@@ -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)

View File

@@ -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):

View File

@@ -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
if operator.type == TokenType.EQUAL:
return AssignExpr(name, value) return AssignExpr(name, value)
self.error(equals, "Invalid assignment target.") 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: