28 lines
960 B
Zig
28 lines
960 B
Zig
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,
|
|
};
|
|
}
|