aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-17 16:27:46 +0900
committernsfisis <nsfisis@gmail.com>2026-01-17 16:27:46 +0900
commit3f1521b362458004fbb720822778cc473d33b9ef (patch)
tree7f0b0e01d2684fd524a86fb5d7798002d9fd5129
parentaf449e5c646a403248161422b4a2a15a013a387e (diff)
downloadzgjq-3f1521b362458004fbb720822778cc473d33b9ef.tar.gz
zgjq-3f1521b362458004fbb720822778cc473d33b9ef.tar.zst
zgjq-3f1521b362458004fbb720822778cc473d33b9ef.zip
implement multi-digit integer literals
-rw-r--r--src/jq/tokenize.zig24
-rw-r--r--src/root.zig8
2 files changed, 28 insertions, 4 deletions
diff --git a/src/jq/tokenize.zig b/src/jq/tokenize.zig
index 9c00602..75113f0 100644
--- a/src/jq/tokenize.zig
+++ b/src/jq/tokenize.zig
@@ -153,6 +153,21 @@ fn tokenizeIdentifier(allocator: std.mem.Allocator, reader: *std.Io.Reader, firs
return buffer.toOwnedSlice(allocator);
}
+fn tokenizeNumber(reader: *std.Io.Reader, first: u8) error{ReadFailed}!i64 {
+ var value: i64 = first - '0';
+
+ while (try peekByte(reader)) |c| {
+ if (std.ascii.isDigit(c)) {
+ value = value * 10 + (c - '0');
+ reader.toss(1);
+ } else {
+ break;
+ }
+ }
+
+ return value;
+}
+
pub fn tokenize(allocator: std.mem.Allocator, reader: *std.Io.Reader) ![]Token {
var tokens = try std.array_list.Aligned(Token, null).initCapacity(allocator, 16);
@@ -194,7 +209,7 @@ pub fn tokenize(allocator: std.mem.Allocator, reader: *std.Io.Reader) ![]Token {
'|' => if (try takeByteIf(reader, '=')) .pipe_equal else .pipe,
'}' => .brace_right,
else => if (std.ascii.isDigit(c))
- .{ .number = (c - '0') }
+ .{ .number = try tokenizeNumber(reader, c) }
else if (isIdentifierStart(c))
.{ .identifier = try tokenizeIdentifier(allocator, reader, c) }
else
@@ -269,12 +284,13 @@ test "tokenize number" {
var allocator = std.heap.ArenaAllocator.init(std.testing.allocator);
defer allocator.deinit();
- var reader = std.Io.Reader.fixed("5");
+ var reader = std.Io.Reader.fixed("5 123");
const tokens = try tokenize(allocator.allocator(), &reader);
- try std.testing.expectEqual(2, tokens.len);
+ try std.testing.expectEqual(3, tokens.len);
try std.testing.expectEqual(Token{ .number = 5 }, tokens[0]);
- try std.testing.expectEqual(.end, tokens[1]);
+ try std.testing.expectEqual(Token{ .number = 123 }, tokens[1]);
+ try std.testing.expectEqual(.end, tokens[2]);
}
test "tokenize array index" {
diff --git a/src/root.zig b/src/root.zig
index ab8fbbe..fa48c7b 100644
--- a/src/root.zig
+++ b/src/root.zig
@@ -49,4 +49,12 @@ test "array index filter" {
try testRun("null", allocator, "[]", ".[0]");
try testRun("1", allocator, "[1,2,3]", ".[0]");
try testRun("null", allocator, "[1,2,3]", ".[5]");
+ try testRun("11", allocator, "[0,1,2,3,4,5,6,7,8,9,10,11,12]", ".[11]");
+ try testRun("100", allocator,
+ \\[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
+ \\ 21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,
+ \\ 41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
+ \\ 61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,
+ \\ 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100]
+ , ".[100]");
}