aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--docs/jq_grammar.md1
-rw-r--r--src/jq/parse.zig6
-rw-r--r--src/root.zig19
3 files changed, 26 insertions, 0 deletions
diff --git a/docs/jq_grammar.md b/docs/jq_grammar.md
index 697a062..430e01d 100644
--- a/docs/jq_grammar.md
+++ b/docs/jq_grammar.md
@@ -105,6 +105,7 @@ primary:
'[' ']'
'{' '}'
'[' query ']'
+ '(' query ')'
```
diff --git a/src/jq/parse.zig b/src/jq/parse.zig
index 17138ae..1e5942d 100644
--- a/src/jq/parse.zig
+++ b/src/jq/parse.zig
@@ -382,6 +382,12 @@ const Parser = struct {
object_node.* = .{ .literal = idx };
return object_node;
},
+ .paren_left => {
+ _ = try self.tokens.next();
+ const inner = try self.parseQuery();
+ _ = try self.tokens.expect(.paren_right);
+ return inner;
+ },
.field => |name| {
_ = try self.tokens.next();
const is_optional = self.tokens.consumeIf(.question);
diff --git a/src/root.zig b/src/root.zig
index e7e0f6b..4bae2e5 100644
--- a/src/root.zig
+++ b/src/root.zig
@@ -529,3 +529,22 @@ test "disasm constants" {
\\
, "false");
}
+
+test "parentheses" {
+ try testRun("123", "123", "(.)");
+ try testRun("null", "null", "(.)");
+
+ try testRun("9", "null", "(1 + 2) * 3");
+ try testRun("7", "null", "1 + 2 * 3");
+ try testRun("6", "null", "(1 + 2) | . * 2");
+ try testRun("12", "null", "((1 + 2)) * (3 + 1)");
+ try testRun("3", "{\"a\":1,\"b\":2}", "(.a + .b) | . + 0");
+ try testRunMultiple(&.{ "1", "2" }, "null", "(1, 2)");
+
+ try testRun(
+ \\[
+ \\ 2,
+ \\ 4
+ \\]
+ , "null", "[(1, 2) * 2]");
+}