diff options
-rw-r--r-- | src/Node.zig | 19 | ||||
-rw-r--r-- | src/Parser.zig | 16 | ||||
-rw-r--r-- | src/main.zig | 2 | ||||
-rw-r--r-- | test.o7 | 2 |
4 files changed, 29 insertions, 10 deletions
diff --git a/src/Node.zig b/src/Node.zig index a5aa0d0..32e0643 100644 --- a/src/Node.zig +++ b/src/Node.zig @@ -4,6 +4,7 @@ const Token = @import("Token.zig"); const Self = @This(); +allocator: std.mem.Allocator, left: ?*Self = null, right: ?*Self = null, tag: Tag, @@ -11,25 +12,31 @@ token: Token, const Tag = enum { fndef, + fnsign, + type, number, add, sub, }; -pub const stub = Self{ .tag = undefined, .token = undefined }; +pub const stub = Self{ + .allocator = undefined, + .tag = undefined, + .token = undefined, +}; pub fn init(allocator: std.mem.Allocator, tag: Tag, token: Token) !*Self { const self = try allocator.create(Self); - self.* = .{ .tag = tag, .token = token }; + self.* = .{ .allocator = allocator, .tag = tag, .token = token }; return self; } -pub fn deinit(self: *Self, allocator: std.mem.Allocator) void { +pub fn deinit(self: *Self) void { if (self.left != null) - self.left.?.deinit(allocator); + self.left.?.deinit(); if (self.right != null) - self.right.?.deinit(allocator); - allocator.destroy(self); + self.right.?.deinit(); + self.allocator.destroy(self); } pub fn chainLeft(self: *Self, left: *Self) *Self { diff --git a/src/Parser.zig b/src/Parser.zig index 43741e3..0062781 100644 --- a/src/Parser.zig +++ b/src/Parser.zig @@ -36,6 +36,11 @@ pub fn expect(self: *Self, tag: Token.Tag) !void { try (try self.lexer.peek()).expect(tag); } +fn @"type"(self: *Self) !*Node { + try self.expect(.word); + return try Node.init(self.allocator, .type, try self.lexer.pop()); +} + fn expr(self: *Self) !*Node { try self.expect(.number); return try Node.init(self.allocator, .number, try self.lexer.pop()); @@ -46,13 +51,20 @@ fn function(self: *Self) !*Node { try self.expect(.word); const node = try Node.init(self.allocator, .fndef, try self.lexer.pop()); - errdefer node.deinit(self.allocator); + errdefer node.deinit(); + + const sign = try Node.init(self.allocator, .fnsign, try self.lexer.peek()); + errdefer sign.deinit(); + node.left = sign; try self.skip("("); - node.left = null; + sign.left = null; try self.skip(")"); + sign.right = try self.type(); + node.right = try self.expr(); + errdefer node.right.?.deinit(); try self.skip(";"); return node; } diff --git a/src/main.zig b/src/main.zig index 88054bb..94480c9 100644 --- a/src/main.zig +++ b/src/main.zig @@ -33,7 +33,7 @@ pub fn main() !void { var parser = Parser.init(arena.allocator(), &lexer); defer parser.deinit(); if (try parser.parse()) |ast| { - defer ast.deinit(arena.allocator()); + defer ast.deinit(); std.log.debug("{}", .{ast.*}); } else return Error.EmptyAST; } @@ -1 +1 @@ -fn main() 0; +fn main() i32 0; |