diff options
author | kdx <kikoodx@paranoici.org> | 2024-03-10 02:18:05 +0100 |
---|---|---|
committer | kdx <kikoodx@paranoici.org> | 2024-03-10 02:18:05 +0100 |
commit | e4830e44740f0fb73b0f155316275cdbb7dbf203 (patch) | |
tree | 216ae4b98dcce7266626a10ef0773bf7e13dc802 | |
parent | 1a2daa07c735566197248007f95f84f3a34dfa6a (diff) | |
download | o7z-e4830e44740f0fb73b0f155316275cdbb7dbf203.tar.gz |
lex lit number and word
-rw-r--r-- | src/Lexer.zig | 59 | ||||
-rw-r--r-- | test.o7 | 6 |
2 files changed, 56 insertions, 9 deletions
diff --git a/src/Lexer.zig b/src/Lexer.zig index 9969bf1..2fc5dc9 100644 --- a/src/Lexer.zig +++ b/src/Lexer.zig @@ -7,6 +7,13 @@ allocator: std.mem.Allocator, tokens: std.ArrayList(Token), s: []const u8, +const lower = "abcdefghijklmnopqrstuvwxyz"; +const upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; +const number = "0123456789"; +const alpha = lower ++ upper; +const alnum = alpha ++ number; +const whitespaces = " \t\n\r"; + pub fn init( allocator: std.mem.Allocator, list_allocator: std.mem.Allocator, @@ -37,20 +44,60 @@ pub fn format( pub fn lex(self: *Self) !void { var i: usize = 0; - while (i < self.s.len) : (i += 1) { + while (i < self.s.len) { const c = self.s[i]; const c2 = if (i < self.s.len - 1) self.s[i + 1] else 0; - if (std.ascii.isWhitespace(c)) + if (match(self.s[i..], whitespaces)) |len| { + i += len; continue; + } if (c == '/' and c2 == '/') { - i += 2; - while (self.s[i] != '\n' and i < self.s.len) - i += 1; + i += until(self.s[i + 2 ..], "\n") orelse break; + continue; + } + + if (match(self.s[i..], number)) |len| { + const postfix = match(self.s[i + len ..], alnum) orelse 0; + try self.tokens.append(Token.init( + .number, + self.s[i .. i + len + postfix], + )); + i += len + postfix; + continue; + } + + if (match(self.s[i..], alnum)) |len| { + try self.tokens.append(Token.init(.word, self.s[i .. i + len])); + i += len; continue; } - try self.tokens.append(Token.init(.punct, self.s[i .. i + 1])); + std.log.warn("skipped '{c}'", .{c}); + i += 1; + } +} + +fn until(s: []const u8, comptime c: []const u8) ?usize { + for (s, 0..) |e, i| + inline for (c) |f| + if (e == f) + return i; + return null; +} + +fn match(s: []const u8, comptime c: []const u8) ?usize { + for (s, 0..) |e, i| { + var valid = false; + inline for (c) |f| { + if (e == f) { + valid = true; + break; + } + } + if (!valid) + return if (i == 0) null else i; } + return if (s.len == 0) null else s.len; } @@ -1,3 +1,3 @@ -a b c d e f -g // simple comment -h +var x = 25 +// lol +ptdr = x * 42 - xd23 42d |