feat: assignment operations

This commit is contained in:
Brett Broadhurst 2026-04-03 11:24:47 -06:00
parent ecd6017673
commit f82b361005
Failed to generate hash of commit
9 changed files with 79 additions and 48 deletions

View file

@ -111,6 +111,15 @@ fn getTokenInfixType(tag: Token.Tag) Ast.Node.Tag {
};
}
fn getTokenAssignType(tag: Token.Tag) ?Ast.Node.Tag {
return switch (tag) {
.equal => .assign_stmt,
.plus_equal => .assign_add_stmt,
.minus_equal => .assign_sub_stmt,
else => null,
};
}
fn getBindingPower(tag: Token.Tag) Precedence {
return switch (tag) {
.ampersand_ampersand, .keyword_and => .logical_and,
@ -703,16 +712,18 @@ fn parseAssignStmt(p: *Parse) Error!*Ast.Node {
const main_token = p.token;
const lhs = try parseIdentifierExpr(p);
if (!p.checkToken(.equal)) return parseExprStmt(p, lhs);
_ = p.nextToken();
if (getTokenAssignType(p.token.tag)) |op| {
_ = p.nextToken();
const rhs = try p.expectExpr();
_ = try p.expectNewline();
const rhs = try p.expectExpr();
_ = try p.expectNewline();
return .createBinary(p.arena, .assign_stmt, .{
.start = main_token.loc.start,
.end = p.token.loc.start,
}, lhs, rhs);
return .createBinary(p.arena, op, .{
.start = main_token.loc.start,
.end = p.token.loc.start,
}, lhs, rhs);
}
return parseExprStmt(p, lhs);
}
fn parseTempDecl(p: *Parse) Error!*Ast.Node {