aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jq/tokenize.zig
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-17 14:26:08 +0900
committernsfisis <nsfisis@gmail.com>2026-01-17 14:26:08 +0900
commit94877ef2f689617706a646cf0abda7dc25ceba88 (patch)
tree8e9ae94cc09ddb25724b4cc33a900cbc17d91541 /src/jq/tokenize.zig
parentb2c37cbc1ce7f6638d7b57376719f2e0ba2d53ca (diff)
downloadzgjq-94877ef2f689617706a646cf0abda7dc25ceba88.tar.gz
zgjq-94877ef2f689617706a646cf0abda7dc25ceba88.tar.zst
zgjq-94877ef2f689617706a646cf0abda7dc25ceba88.zip
implement array index filter
Diffstat (limited to 'src/jq/tokenize.zig')
-rw-r--r--src/jq/tokenize.zig40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/jq/tokenize.zig b/src/jq/tokenize.zig
index 0823ea1..92f96ca 100644
--- a/src/jq/tokenize.zig
+++ b/src/jq/tokenize.zig
@@ -2,32 +2,56 @@ const std = @import("std");
pub const TokenizeError = error{
UnexpectedEnd,
+ InvalidCharacter,
};
pub const TokenKind = enum {
end,
- identity,
+ dot,
+ bracket_left,
+ bracket_right,
+ number,
};
-pub const Token = struct {
- kind: TokenKind,
+pub const Token = union(TokenKind) {
+ end,
+ dot,
+ bracket_left,
+ bracket_right,
+ number: i64,
+
+ pub fn kind(self: @This()) TokenKind {
+ return self;
+ }
};
pub fn tokenize(allocator: std.mem.Allocator, query: []const u8) ![]Token {
var tokens = try std.array_list.Aligned(Token, null).initCapacity(allocator, 16);
const len = query.len;
+
+ if (len == 0) {
+ return error.UnexpectedEnd;
+ }
+
var i: usize = 0;
while (i < len) {
const c = query[i];
- if (c == '.') {
- try tokens.append(allocator, .{ .kind = .identity });
- } else {
- return TokenizeError.UnexpectedEnd;
+ switch (c) {
+ '.' => try tokens.append(allocator, .dot),
+ '[' => try tokens.append(allocator, .bracket_left),
+ ']' => try tokens.append(allocator, .bracket_right),
+ else => {
+ if (std.ascii.isDigit(c)) {
+ try tokens.append(allocator, .{ .number = (c - '0') });
+ } else {
+ return error.InvalidCharacter;
+ }
+ },
}
i += 1;
}
- try tokens.append(allocator, .{ .kind = .end });
+ try tokens.append(allocator, .end);
return tokens.toOwnedSlice(allocator);
}