Compare commits
2 Commits
c63b42c414
...
a0808b54aa
Author | SHA1 | Date |
---|---|---|
Luna | a0808b54aa | |
Luna | 8007f9e860 |
|
@ -54,8 +54,10 @@ fn main(a int) int {
|
||||||
|
|
||||||
str := 'hello'
|
str := 'hello'
|
||||||
len := str.len
|
len := str.len
|
||||||
|
|
||||||
|
// those should yield the same ast
|
||||||
str.len = str.len + 1
|
str.len = str.len + 1
|
||||||
// str.len += 1
|
str.len += 1
|
||||||
}
|
}
|
||||||
|
|
||||||
fn (v Typ) voidfunc() {}
|
fn (v Typ) voidfunc() {}
|
||||||
|
|
|
@ -688,7 +688,7 @@ pub const Parser = struct {
|
||||||
fn parseAssignment(self: *@This()) anyerror!*Expr {
|
fn parseAssignment(self: *@This()) anyerror!*Expr {
|
||||||
// there can be two assignments coming out of this function:
|
// there can be two assignments coming out of this function:
|
||||||
// - a mutable/immutable variable declaration with :=
|
// - a mutable/immutable variable declaration with :=
|
||||||
// - an assignment to a variable with =
|
// - an assignment to a variable with =, +=, -=
|
||||||
|
|
||||||
// one is a statement, other is an expression. since the normal result
|
// one is a statement, other is an expression. since the normal result
|
||||||
// of this is an Expr, we wrap variable assignments in an Expr as well.
|
// of this is an Expr, we wrap variable assignments in an Expr as well.
|
||||||
|
@ -701,7 +701,9 @@ pub const Parser = struct {
|
||||||
|
|
||||||
var expr = try self.parseOr();
|
var expr = try self.parseOr();
|
||||||
|
|
||||||
if (self.check(.ColonEqual) or self.check(.Equal)) {
|
if (self.compareAnyOf(&[_]TokenType{
|
||||||
|
.ColonEqual, .Equal, .PlusEqual, .MinusEqual,
|
||||||
|
})) {
|
||||||
return try self.finishAssignment(expr, mutable);
|
return try self.finishAssignment(expr, mutable);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -713,22 +715,63 @@ pub const Parser = struct {
|
||||||
_ = try self.nextToken();
|
_ = try self.nextToken();
|
||||||
var value = try self.parseAssignment();
|
var value = try self.parseAssignment();
|
||||||
|
|
||||||
|
// TODO convert binary's op field from Token to
|
||||||
|
// something else, maybe enum'd
|
||||||
|
|
||||||
switch (expr.*) {
|
switch (expr.*) {
|
||||||
.Variable => {
|
.Variable => {
|
||||||
switch (op.ttype) {
|
switch (op.ttype) {
|
||||||
.ColonEqual => return try self.mkVarDecl(expr.Variable, value, mutable),
|
.ColonEqual => return try self.mkVarDecl(expr.Variable, value, mutable),
|
||||||
.Equal => return try self.mkAssign(expr.Variable, value),
|
.Equal => return try self.mkAssign(expr.Variable, value),
|
||||||
|
|
||||||
|
.PlusEqual => {
|
||||||
|
var plus_op = try self.mkToken(.Plus, "+", op.line);
|
||||||
|
return try self.mkAssign(
|
||||||
|
expr.Variable,
|
||||||
|
try self.mkBinary(expr, plus_op, value),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
.MinusEqual => {
|
||||||
|
var new_op = try self.mkToken(.Minus, "-", op.line);
|
||||||
|
return try self.mkAssign(
|
||||||
|
expr.Variable,
|
||||||
|
try self.mkBinary(expr, new_op, value),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
.Get => |get| {
|
.Get => |get| {
|
||||||
if (op.ttype == .ColonEqual) {
|
switch (op.ttype) {
|
||||||
self.doError("can not initialize struct field");
|
.ColonEqual => {
|
||||||
return Result.CompileError;
|
self.doError("can not initialize struct field");
|
||||||
}
|
return Result.CompileError;
|
||||||
|
},
|
||||||
|
|
||||||
return try self.mkSet(get.struc, get.name, value);
|
.PlusEqual => {
|
||||||
|
var new_op = try self.mkToken(.Plus, "+", op.line);
|
||||||
|
return try self.mkSet(
|
||||||
|
get.struc,
|
||||||
|
get.name,
|
||||||
|
try self.mkBinary(expr, new_op, value),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
.MinusEqual => {
|
||||||
|
var new_op = try self.mkToken(.Minus, "-", op.line);
|
||||||
|
return try self.mkSet(
|
||||||
|
get.struc,
|
||||||
|
get.name,
|
||||||
|
try self.mkBinary(expr, new_op, value),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
|
||||||
|
.Equal => return try self.mkSet(get.struc, get.name, value),
|
||||||
|
else => unreachable,
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
else => |expr_typ| {
|
else => |expr_typ| {
|
||||||
|
|
Loading…
Reference in New Issue