const std = @import("std"); const tree = @import("tree.zig"); const Arena = @import("arena.zig").Arena; pub fn parseTernary(source: []const u8, arena: *Arena) !u32 { var pos: usize = 0; return try parseTernaryRec(source, &pos, arena); } fn parseTernaryRec(source: []const u8, pos: *usize, arena: *Arena) !u32 { if (pos.* >= source.len) return error.UnexpectedEnd; const ch = source[pos.*]; pos.* += 1; return switch (ch) { '0' => try arena.alloc(.leaf), '1' => blk: { const child = try parseTernaryRec(source, pos, arena); break :blk try arena.alloc(.{ .stem = .{ .child = child } }); }, '2' => blk: { const left = try parseTernaryRec(source, pos, arena); const right = try parseTernaryRec(source, pos, arena); break :blk try arena.alloc(.{ .fork = .{ .left = left, .right = right } }); }, else => error.InvalidChar, }; }