feat: assignment operations
This commit is contained in:
parent
ecd6017673
commit
f82b361005
9 changed files with 79 additions and 48 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue