tricu

An interpreted language for exploring Tree Calculus
Log | Files | Refs | README | LICENSE

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 }