From 46e33b2b38872b463d11cae62a26abc28f4815c6 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Tue, 7 Jan 2025 22:58:12 +0100 Subject: Parser: Small improvements --- src/main.zig | 1 + src/parser.zig | 30 ++++++++++++++++-------------- 2 files changed, 17 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/main.zig b/src/main.zig index c65ef4b..86ba202 100644 --- a/src/main.zig +++ b/src/main.zig @@ -50,6 +50,7 @@ fn process_buf(buf: []u8, allocator: std.mem.Allocator) !void { } const source_parser = try parser.Parser.init(token_list.items, allocator); + errdefer source_parser.deinit(null); const ast = try source_parser.parse(); defer source_parser.deinit(@constCast(ast)); std.debug.print("AST: {any}\n", .{ast}); diff --git a/src/parser.zig b/src/parser.zig index 8499732..5b6915f 100644 --- a/src/parser.zig +++ b/src/parser.zig @@ -50,22 +50,24 @@ pub const Parser = struct { return parser; } - pub fn deinit(self: *Parser, ast: *Node) void { - std.debug.assert(ast.* == .PROGRAM); - for (ast.PROGRAM.statements) |statement| { - switch (statement.*) { - .VARIABLE_STATEMENT => unreachable, - .PRINT_STATEMENT => |x| { - self.allocator.destroy(x.expression); - }, - .NUMBER => unreachable, - .IDENTIFIER => unreachable, - else => unreachable, + pub fn deinit(self: *Parser, ast: ?*Node) void { + if (ast != null) { + // std.debug.assert(ast.?.* == .PROGRAM); + for (ast.?.PROGRAM.statements) |statement| { + switch (statement.*) { + .VARIABLE_STATEMENT => @panic("NOT IMPLEMENTED"), + .PRINT_STATEMENT => |x| { + self.allocator.destroy(x.expression); + }, + .NUMBER => @panic("NOT IMPLEMENTED"), + .IDENTIFIER => @panic("NOT IMPLEMENTED"), + else => unreachable, + } + self.allocator.destroy(statement); } - self.allocator.destroy(statement); + self.allocator.free(ast.?.PROGRAM.statements); + self.allocator.destroy(ast.?); } - self.allocator.free(ast.PROGRAM.statements); - self.allocator.destroy(ast); self.allocator.destroy(self); } -- cgit 1.4.1