parser: use mkBinary (allocating them on heap)

This commit is contained in:
Luna 2019-08-24 13:06:46 -03:00
parent 9ad0c7df0e
commit 2ba0efa92c
1 changed files with 10 additions and 56 deletions

View File

@ -386,15 +386,10 @@ pub const Parser = struct {
while (self.peek().ttype == .EqualEqual) { while (self.peek().ttype == .EqualEqual) {
var op = self.peek(); var op = self.peek();
var right = try self.parseComparison(); _ = try self.nextToken();
expr.* = ast.Expr{ var right = try self.parseComparison();
.Binary = ast.BinaryExpr{ expr = try self.mkBinary(expr, op, right);
.left = expr,
.op = op,
.right = right,
},
};
} }
return expr; return expr;
@ -409,16 +404,11 @@ pub const Parser = struct {
.Less, .Less,
.LessEqual, .LessEqual,
})) { })) {
var op = self.previous(); var op = self.peek();
var right = try self.parseAddition(); _ = try self.nextToken();
expr.* = ast.Expr{ var right = try self.parseAddition();
.Binary = ast.BinaryExpr{ expr = try self.mkBinary(expr, op, right);
.left = expr,
.op = op,
.right = right,
},
};
} }
return expr; return expr;
@ -427,47 +417,16 @@ pub const Parser = struct {
fn parseAddition(self: *@This()) !*Expr { fn parseAddition(self: *@This()) !*Expr {
var expr = try self.parseMultiplication(); var expr = try self.parseMultiplication();
std.debug.warn("left expr at addition:");
ast.printExpr(expr);
std.debug.warn("\n");
while (self.compareAnyOf(&[_]TokenType{ while (self.compareAnyOf(&[_]TokenType{
.Minus, .Plus, .Minus, .Plus,
})) { })) {
var op = self.peek(); var op = self.peek();
_ = try self.nextToken(); _ = try self.nextToken();
std.debug.warn("==OP token {}\n", op);
var right = try self.parseMultiplication(); var right = try self.parseMultiplication();
std.debug.warn("right expr at addition:");
ast.printExpr(right);
std.debug.warn("\n");
std.debug.warn("left expr at combination:");
ast.printExpr(expr);
std.debug.warn("\n");
expr = try self.mkBinary(expr, op, right); expr = try self.mkBinary(expr, op, right);
//expr.* = ast.Expr{
// .Binary = ast.BinaryExpr{
// .left = expr,
// .op = op,
// .right = right,
// },
//};
std.debug.warn("final expr at addition:");
ast.printExpr(expr);
std.debug.warn("\n");
} }
std.debug.warn("ret expr at addition:");
ast.printExpr(expr);
std.debug.warn("\n");
return expr; return expr;
} }
@ -477,16 +436,11 @@ pub const Parser = struct {
while (self.compareAnyOf(&[_]TokenType{ while (self.compareAnyOf(&[_]TokenType{
.Star, .Slash, .Star, .Slash,
})) { })) {
var op = self.previous(); var op = self.peek();
_ = try self.nextToken();
var right = try self.parseUnary(); var right = try self.parseUnary();
expr.* = ast.Expr{ expr = try self.mkBinary(expr, op, right);
.Binary = ast.BinaryExpr{
.left = expr,
.op = op,
.right = right,
},
};
} }
return expr; return expr;