aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/jq/parse.zig
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-01-25 15:47:26 +0900
committernsfisis <nsfisis@gmail.com>2026-01-25 15:47:26 +0900
commit4c654156403c9660f0973605afa8d7b3645055c4 (patch)
tree4d3d5137ed6456f02ac6b7ae2549cdb7c176ec18 /src/jq/parse.zig
parent45f6c28a2e085da2a9d5d2331533e4cfdc0c0492 (diff)
downloadzgjq-4c654156403c9660f0973605afa8d7b3645055c4.tar.gz
zgjq-4c654156403c9660f0973605afa8d7b3645055c4.tar.zst
zgjq-4c654156403c9660f0973605afa8d7b3645055c4.zip
implement tokenization of floating-point numbers
Diffstat (limited to 'src/jq/parse.zig')
-rw-r--r--src/jq/parse.zig10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/jq/parse.zig b/src/jq/parse.zig
index 60ba89c..3ec9520 100644
--- a/src/jq/parse.zig
+++ b/src/jq/parse.zig
@@ -163,7 +163,13 @@ fn parseTerm(allocator: std.mem.Allocator, parse_allocator: std.mem.Allocator, t
if (first_token.kind() == .number) {
_ = try tokens.next();
const number_value = try allocator.create(jv.Value);
- number_value.* = .{ .integer = first_token.number };
+ const f = first_token.number;
+ const i: i64 = @intFromFloat(f);
+ if (@as(f64, @floatFromInt(i)) == f) {
+ number_value.* = .{ .integer = i };
+ } else {
+ number_value.* = .{ .float = f };
+ }
const number_node = try parse_allocator.create(Ast);
number_node.* = .{ .literal = number_value };
return number_node;
@@ -205,7 +211,7 @@ fn parseIndexAccess(allocator: std.mem.Allocator, parse_allocator: std.mem.Alloc
_ = try tokens.expect(.bracket_right);
const index_value = try allocator.create(jv.Value);
- index_value.* = .{ .integer = index_token.number };
+ index_value.* = .{ .integer = @intFromFloat(index_token.number) };
const index_node = try parse_allocator.create(Ast);
index_node.* = .{ .literal = index_value };
const ast = try parse_allocator.create(Ast);