ternary.zig (960B)
1 const std = @import("std"); 2 const tree = @import("tree.zig"); 3 const Arena = @import("arena.zig").Arena; 4 5 pub fn parseTernary(source: []const u8, arena: *Arena) !u32 { 6 var pos: usize = 0; 7 return try parseTernaryRec(source, &pos, arena); 8 } 9 10 fn parseTernaryRec(source: []const u8, pos: *usize, arena: *Arena) !u32 { 11 if (pos.* >= source.len) return error.UnexpectedEnd; 12 const ch = source[pos.*]; 13 pos.* += 1; 14 return switch (ch) { 15 '0' => try arena.alloc(.leaf), 16 '1' => blk: { 17 const child = try parseTernaryRec(source, pos, arena); 18 break :blk try arena.alloc(.{ .stem = .{ .child = child } }); 19 }, 20 '2' => blk: { 21 const left = try parseTernaryRec(source, pos, arena); 22 const right = try parseTernaryRec(source, pos, arena); 23 break :blk try arena.alloc(.{ .fork = .{ .left = left, .right = right } }); 24 }, 25 else => error.InvalidChar, 26 }; 27 }