From bd42f4899d09c8f6317ae1af1747ae5b6ac81650 Mon Sep 17 00:00:00 2001 From: Baitinq Date: Sun, 6 Apr 2025 16:17:22 +0200 Subject: Feature: Add char type and support underlying pointer values --- src/tokenizer.zig | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) (limited to 'src/tokenizer.zig') diff --git a/src/tokenizer.zig b/src/tokenizer.zig index 1c88bf2..2b57b8d 100644 --- a/src/tokenizer.zig +++ b/src/tokenizer.zig @@ -19,6 +19,7 @@ pub const TokenType = union(enum) { // Literals NUMBER: i64, BOOLEAN: bool, + CHAR: u8, STRING: []u8, // Operators @@ -97,6 +98,7 @@ pub const Tokenizer = struct { if (self.accept_string(">")) return self.create_token(.{ .GREATER = void{} }); if (self.accept_int_type()) |i| return self.create_token(.{ .NUMBER = i }); + if (self.accept_char_type()) |c| return self.create_token(.{ .CHAR = c }); if (self.accept_string_type()) |s| return self.create_token(.{ .STRING = s }); const string = self.consume_until_condition(struct { @@ -158,6 +160,42 @@ pub const Tokenizer = struct { return std.fmt.parseInt(i64, res, 10) catch null; } + fn accept_char_type(self: *Tokenizer) ?u8 { + const prev_offset = self.offset; + if (!self.accept_string("'")) { + self.offset = prev_offset; + return null; + } + + const string = self.consume_until_condition(struct { + fn condition(c: u8) bool { + return c == '\''; + } + }.condition); + + var res: u8 = string[0]; + var i: usize = 0; + while (i < string.len) : (i += 1) { + if (string[i] == '\\') { + i += 1; + res = switch (string[i]) { + 'n' => '\n', + 't' => '\t', + '0' => 0, + else => unreachable, + }; + break; + } + } + + if (!self.accept_string("'")) { + self.offset = prev_offset; + return null; + } + + return res; + } + fn accept_string_type(self: *Tokenizer) ?[]u8 { const prev_offset = self.offset; if (!self.accept_string("\"")) { -- cgit 1.4.1