From eff19cc15a9bf4df60e7f90c3a7ee525c65266c0 Mon Sep 17 00:00:00 2001 From: Nathan Reiner Date: Tue, 6 May 2025 10:43:09 +0200 Subject: add full grammar parsing --- src/string.zig | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 src/string.zig (limited to 'src/string.zig') diff --git a/src/string.zig b/src/string.zig new file mode 100644 index 0000000..8217a77 --- /dev/null +++ b/src/string.zig @@ -0,0 +1,41 @@ +const std = @import("std"); + +pub fn isNameChar(char: u8) bool { + return switch(char) { + '0'...'9', 'A'...'Z', 'a'...'z', '_' => true, + else => false + }; +} + +pub fn read_name(buffer: []const u8) struct { []const u8, []const u8 } { + for (buffer, 0..) |char, index| { + if (!isNameChar(char)) { + return .{ buffer[0..index], buffer[index..] }; + } + } + + return .{ buffer[0..buffer.len], buffer[buffer.len..] }; +} + +pub fn read_first_from_literal(buffer: []const u8) !struct { u8, []const u8 } { + if (buffer[0] != '\\') { + return .{ buffer[0], buffer[1..] } ; + } + + if (buffer.len > 1 and buffer[1] != 'x') { + return switch(buffer[1]) { + 't' => return .{ '\t', buffer[2..] }, + 'n' => return .{ '\n', buffer[2..] }, + 'r' => return .{ '\r', buffer[2..] }, + '\'' => return .{ '\'', buffer[2..] }, + '\\' => return .{ '\\', buffer[2..] }, + else => return error.InvalidEscapeSequence, + }; + } + + if (buffer.len > 4 and buffer[1] == 'x') { + return .{ try std.fmt.parseInt(u8, buffer[2..4], 16), buffer[4..] }; + } + + return error.InvalidEscapeSequnce; +} -- cgit v1.2.3-70-g09d2