aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main.zig4
-rw-r--r--src/parse.zig25
2 files changed, 14 insertions, 15 deletions
diff --git a/src/main.zig b/src/main.zig
index ced3826..918c52d 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -38,8 +38,8 @@ pub fn main() !void {
const source =
\\let x = 1;
- \\print 18446744073709551615;
- \\print (print (0 - x));
+ \\print(18446744073709551615);
+ \\print(print(0 - x));
;
var lexer: Lexer = .{ .source = source };
std.debug.print("Tokens:\n", .{});
diff --git a/src/parse.zig b/src/parse.zig
index e240ce3..08dcc81 100644
--- a/src/parse.zig
+++ b/src/parse.zig
@@ -80,7 +80,7 @@ pub const Expr = struct {
switch (self.type) {
.integer_literal => try writer.print("{}", .{self.loc.getInt(file_source)}),
.bin_op => |bin_op| try writer.print("({} {} {})", .{ bin_op.lhs.fmt(file_source), bin_op.op, bin_op.rhs.fmt(file_source) }),
- .call => |call| try writer.print("({} {})", .{ call.proc.fmt(file_source), call.arg.fmt(file_source) }),
+ .call => |call| try writer.print("{}({})", .{ call.proc.fmt(file_source), call.arg.fmt(file_source) }),
.identifier => try writer.print("{s}", .{self.loc.getIdent(file_source)}),
}
}
@@ -121,11 +121,11 @@ pub fn statement(allocator: Allocator, lexer: *Lexer) !Stmt {
}
pub fn expression(allocator: Allocator, lexer: *Lexer) error{ OutOfMemory, ExpectedRightParen, UnexpectedToken }!*Expr {
- return addExpr(allocator, lexer);
+ return parseTerms(allocator, lexer);
}
-pub fn addExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
- var lhs = try callExpr(allocator, lexer);
+pub fn parseTerms(allocator: Allocator, lexer: *Lexer) !*Expr {
+ var lhs = try parseInvocations(allocator, lexer);
while (true) {
const op: Expr.Type.BinOp.Op = switch (lexer.peek().type) {
.plus => .plus,
@@ -134,7 +134,7 @@ pub fn addExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
};
_ = lexer.next();
- const rhs = try callExpr(allocator, lexer);
+ const rhs = try parseInvocations(allocator, lexer);
lhs = try allocate(Expr, allocator, .{
.loc = lhs.loc.combine(rhs.loc),
.type = .{ .bin_op = .{ .lhs = lhs, .op = op, .rhs = rhs } },
@@ -143,14 +143,13 @@ pub fn addExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
return lhs;
}
-pub fn callExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
- var proc = try primaryExpr(allocator, lexer);
+pub fn parseInvocations(allocator: Allocator, lexer: *Lexer) !*Expr {
+ var proc = try parsePrimaryExpr(allocator, lexer);
while (true) {
- switch (lexer.peek().type) {
- .left_paren, .integer_literal, .identifier => {},
- else => break,
- }
- const arg = try primaryExpr(allocator, lexer);
+ if (lexer.peek().type != .left_paren) break;
+ _ = lexer.next();
+ const arg = try expression(allocator, lexer);
+ _ = try mustEat(lexer, .right_paren);
proc = try allocate(Expr, allocator, .{
.loc = proc.loc.combine(arg.loc),
.type = .{ .call = .{ .proc = proc, .arg = arg } },
@@ -159,7 +158,7 @@ pub fn callExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
return proc;
}
-pub fn primaryExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
+pub fn parsePrimaryExpr(allocator: Allocator, lexer: *Lexer) !*Expr {
const token = lexer.next();
return allocate(Expr, allocator, switch (token.type) {
.left_paren => {