From e285a6338eb5fcfa87b1e03679e061fc59c5fdab Mon Sep 17 00:00:00 2001 From: caandt Date: Fri, 30 May 2025 00:01:15 -0500 Subject: [PATCH] shrink tokenkind --- src/frontend/token.zig | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/frontend/token.zig b/src/frontend/token.zig index 6980f08..d239479 100644 --- a/src/frontend/token.zig +++ b/src/frontend/token.zig @@ -1,7 +1,16 @@ const std = @import("std"); -pub const TokenKind = enum(u24) { - name, +const op_chars = "!@$%^&*()-+=~[]{}|:<>,.?/"; +const op_map = l: { + var m = [_]u8{0}**256; + for (op_chars, 0..) |c, i| { + m[c] = i; + } + break :l m; +}; + +pub const TokenKind = enum(u16) { + name = 1 << 15, number, eof, semicolon, @@ -43,10 +52,10 @@ fn is_op(c: u8) bool { } pub fn op_kind(op: []const u8) TokenKind { - const v: u24 = switch (op.len) { - 1 => @intCast(op[0]), - 2 => @intCast(@as(u16, @bitCast(op[0..2].*))), - 3 => @bitCast(op[0..3].*), + const v: u16 = switch (op.len) { + 1 => op_map[op[0]], + 2 => op_map[op[0]] + (@as(u16, op_map[op[1]]) << 5), + 3 => op_map[op[0]] + (@as(u16, op_map[op[1]]) << 5) + (@as(u16, op_map[op[2]]) << 10), else => @intFromEnum(TokenKind.invalid), }; return @enumFromInt(v);