From 58d34f101934bd4a2394ab698d3acf2da2445573 Mon Sep 17 00:00:00 2001 From: itchyny Date: Sun, 5 Jul 2020 17:57:26 +0900 Subject: [PATCH] support string interpolation for object pattern key --- cli/test.yaml | 20 +++-- compiler.go | 8 +- parser.go | 226 +++++++++++++++++++++++++------------------------- parser.go.y | 4 +- query.go | 6 +- 5 files changed, 137 insertions(+), 127 deletions(-) diff --git a/cli/test.yaml b/cli/test.yaml index 3bd32724..c108a331 100644 --- a/cli/test.yaml +++ b/cli/test.yaml @@ -2532,31 +2532,35 @@ - name: binding an object deeply args: - - '. as {$foo, bar: {baz: {$qux}}} | {$foo, $qux}' - input: '{} {"foo": 10} {"foo": 20, "bar": { "baz": { "qux": 30 } } }' + - '. as {$foo, bar: {"baz": {$qux}, "": $quy}} | {$foo, $qux, $quy}' + input: '{} {"foo": 10} {"foo": 20, "bar": { "baz": { "qux": 30 }, "": -1 } }' expected: | { "foo": null, - "qux": null + "qux": null, + "quy": null } { "foo": 10, - "qux": null + "qux": null, + "quy": null } { "foo": 20, - "qux": 30 + "qux": 30, + "quy": -1 } - name: binding an object with expression args: - - '. as {as: $foo, ("e"+"x"+"p"): $bar, (.foo): $baz} | [$foo, $bar, $baz]' - input: '{"as": 1, "exp": 2, "foo": "bar", "bar": 3}' + - '. as {as: $foo, ("e"+"x"+"p"): $bar, (.foo): $baz, "\(.qux)": $qux} | [$foo, $bar, $baz, $qux]' + input: '{"as": 1, "exp": 2, "foo": "bar", "bar": 3, "qux": "quux", "quux": 4}' expected: | [ 1, 2, - 3 + 3, + 4 ] - name: binding an object error diff --git a/compiler.go b/compiler.go index 9dbd82ad..98d8a26c 100644 --- a/compiler.go +++ b/compiler.go @@ -576,9 +576,11 @@ func (c *compiler) compilePattern(p *Pattern) ([][2]int, error) { key, name = key[1:], key } c.append(&code{op: oppush, v: key}) - } else if kv.KeyString != "" { - key = kv.KeyString[1 : len(kv.KeyString)-1] - c.append(&code{op: oppush, v: key}) + } else if kv.KeyString != nil { + c.append(&code{op: opload, v: v}) + if err := c.compileString(kv.KeyString, nil); err != nil { + return nil, err + } } else if kv.Query != nil { c.append(&code{op: opload, v: v}) if err := c.compileQuery(kv.Query); err != nil { diff --git a/parser.go b/parser.go index a694099b..cea3654f 100644 --- a/parser.go +++ b/parser.go @@ -155,50 +155,50 @@ var yyExca = [...]int{ const yyPrivate = 57344 -const yyLast = 1018 +const yyLast = 1053 var yyAct = [...]int{ - 88, 234, 176, 111, 14, 171, 12, 177, 211, 192, - 122, 9, 31, 109, 116, 142, 48, 225, 97, 99, - 95, 96, 91, 77, 78, 51, 79, 80, 81, 162, - 124, 233, 224, 106, 103, 10, 245, 117, 107, 108, - 223, 232, 238, 105, 102, 237, 104, 209, 112, 244, - 208, 157, 158, 222, 123, 77, 78, 262, 79, 80, - 81, 257, 241, 227, 74, 76, 82, 83, 84, 85, - 86, 226, 75, 165, 273, 129, 143, 130, 131, 132, - 133, 134, 135, 136, 137, 138, 139, 140, 164, 77, - 78, 128, 79, 80, 81, 149, 74, 76, 82, 83, - 84, 85, 86, 127, 75, 160, 147, 198, 126, 144, - 197, 42, 43, 243, 166, 145, 146, 90, 181, 182, - 183, 82, 83, 84, 85, 86, 179, 75, 174, 180, - 185, 186, 82, 83, 84, 85, 86, 94, 75, 47, - 51, 75, 175, 163, 125, 93, 92, 94, 156, 193, - 188, 199, 265, 255, 202, 184, 203, 204, 205, 46, - 190, 10, 45, 169, 207, 170, 168, 200, 201, 212, - 212, 215, 90, 101, 213, 119, 112, 210, 100, 123, - 42, 43, 216, 181, 182, 183, 121, 219, 220, 187, - 3, 179, 28, 240, 180, 27, 228, 172, 173, 230, - 93, 92, 94, 11, 221, 84, 85, 86, 218, 75, - 239, 79, 80, 81, 7, 8, 5, 87, 178, 49, - 184, 110, 152, 44, 154, 217, 10, 254, 159, 193, - 80, 81, 90, 252, 253, 247, 256, 120, 191, 246, - 189, 141, 248, 249, 258, 212, 212, 206, 261, 259, - 260, 82, 83, 84, 85, 86, 266, 75, 268, 6, - 93, 92, 94, 4, 270, 271, 2, 1, 272, 82, - 83, 84, 85, 86, 277, 75, 0, 278, 269, 20, - 0, 19, 37, 24, 25, 26, 38, 40, 39, 41, - 23, 29, 30, 0, 42, 43, 98, 0, 17, 0, - 0, 0, 13, 18, 0, 15, 16, 22, 0, 151, - 13, 0, 0, 34, 33, 0, 0, 0, 21, 90, + 88, 234, 176, 111, 14, 171, 12, 122, 211, 31, + 177, 192, 109, 116, 9, 142, 48, 225, 97, 99, + 95, 96, 91, 143, 51, 162, 124, 10, 245, 223, + 233, 103, 224, 106, 157, 158, 232, 117, 107, 108, + 105, 244, 222, 238, 102, 112, 237, 77, 78, 104, + 79, 80, 81, 262, 257, 209, 144, 123, 208, 241, + 227, 226, 145, 165, 164, 128, 77, 78, 127, 79, + 80, 81, 84, 85, 86, 129, 75, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 74, 76, + 82, 83, 84, 85, 86, 149, 75, 90, 126, 198, + 243, 174, 197, 147, 47, 160, 75, 74, 76, 82, + 83, 84, 85, 86, 166, 75, 146, 276, 240, 156, + 275, 42, 43, 152, 163, 93, 92, 94, 125, 255, + 185, 186, 265, 90, 46, 181, 182, 183, 45, 51, + 119, 188, 175, 179, 42, 43, 180, 94, 100, 193, + 169, 199, 170, 168, 202, 194, 203, 204, 205, 101, + 190, 93, 92, 94, 207, 172, 173, 200, 201, 212, + 212, 215, 184, 112, 213, 98, 210, 217, 10, 216, + 187, 13, 123, 181, 182, 183, 121, 219, 220, 13, + 3, 179, 11, 5, 180, 90, 228, 7, 8, 230, + 44, 28, 27, 218, 221, 178, 87, 49, 77, 78, + 239, 79, 80, 81, 110, 82, 83, 84, 85, 86, + 184, 75, 151, 93, 92, 94, 10, 154, 254, 193, + 80, 81, 90, 252, 253, 194, 256, 247, 159, 246, + 120, 191, 248, 249, 258, 212, 212, 189, 261, 259, + 260, 82, 83, 84, 85, 86, 266, 75, 268, 141, + 93, 92, 94, 206, 270, 271, 6, 4, 272, 82, + 83, 84, 85, 86, 277, 75, 2, 278, 269, 20, + 1, 19, 37, 24, 25, 26, 38, 40, 39, 41, + 23, 29, 30, 0, 42, 43, 0, 0, 17, 0, + 0, 0, 0, 18, 0, 15, 16, 22, 0, 89, + 0, 0, 0, 34, 33, 0, 0, 0, 21, 90, 36, 0, 150, 32, 0, 148, 35, 20, 0, 19, 37, 24, 25, 26, 38, 40, 39, 41, 23, 29, 30, 0, 42, 43, 0, 0, 17, 93, 92, 94, - 0, 18, 0, 15, 16, 22, 0, 89, 0, 0, - 0, 34, 33, 0, 0, 0, 21, 90, 36, 0, + 0, 18, 0, 15, 16, 22, 0, 0, 0, 0, + 0, 34, 33, 0, 0, 0, 21, 0, 36, 0, 0, 32, 0, 229, 35, 20, 0, 19, 37, 24, 25, 26, 38, 40, 39, 41, 23, 29, 30, 0, - 42, 43, 0, 0, 17, 93, 92, 94, 0, 18, + 42, 43, 0, 0, 17, 0, 0, 0, 0, 18, 0, 15, 16, 22, 0, 0, 0, 0, 0, 34, 33, 0, 0, 0, 21, 0, 36, 0, 0, 32, 0, 118, 35, 20, 0, 19, 37, 24, 25, 26, @@ -207,98 +207,102 @@ var yyAct = [...]int{ 16, 22, 0, 0, 0, 0, 0, 34, 33, 0, 0, 0, 21, 0, 36, 0, 0, 32, 53, 54, 35, 55, 56, 57, 58, 59, 60, 61, 62, 63, - 64, 114, 115, 0, 0, 0, 0, 0, 0, 42, + 64, 114, 196, 0, 0, 0, 0, 0, 0, 42, 43, 0, 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 53, 54, 0, 55, 56, 57, 58, 59, - 60, 61, 62, 63, 64, 114, 196, 0, 113, 0, - 0, 0, 0, 194, 0, 0, 0, 65, 66, 67, + 60, 61, 62, 63, 64, 114, 115, 0, 195, 0, + 0, 0, 0, 42, 43, 0, 0, 65, 66, 67, 68, 69, 70, 71, 72, 73, 37, 24, 25, 26, 38, 40, 39, 41, 23, 29, 30, 0, 42, 43, - 77, 78, 195, 79, 80, 81, 0, 0, 0, 0, - 0, 22, 0, 0, 0, 0, 0, 34, 33, 0, - 81, 0, 21, 0, 36, 0, 0, 32, 77, 78, + 77, 78, 113, 79, 80, 81, 0, 0, 0, 0, + 0, 22, 0, 0, 0, 0, 0, 34, 33, 79, + 80, 81, 21, 0, 36, 0, 0, 32, 77, 78, 35, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, 75, - 0, 276, 77, 78, 275, 79, 80, 81, 82, 83, - 84, 85, 86, 0, 75, 0, 0, 0, 0, 74, + 0, 0, 0, 77, 78, 251, 79, 80, 81, 82, + 83, 84, 85, 86, 0, 75, 0, 0, 0, 74, + 76, 82, 83, 84, 85, 86, 81, 75, 0, 0, + 0, 77, 78, 231, 79, 80, 81, 0, 0, 0, + 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, + 86, 0, 75, 0, 0, 0, 77, 78, 167, 79, + 80, 81, 0, 0, 82, 83, 84, 85, 86, 0, + 75, 0, 74, 76, 82, 83, 84, 85, 86, 0, + 75, 0, 0, 77, 78, 279, 79, 80, 81, 0, + 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, + 83, 84, 85, 86, 0, 75, 0, 0, 77, 78, + 274, 79, 80, 81, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, + 86, 0, 75, 0, 0, 77, 78, 250, 79, 80, + 81, 0, 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, 75, 0, 0, - 0, 77, 78, 251, 79, 80, 81, 0, 0, 0, - 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, - 0, 75, 0, 0, 0, 77, 78, 231, 79, 80, - 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, - 75, 0, 0, 0, 77, 78, 167, 79, 80, 81, + 77, 78, 242, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, 83, - 84, 85, 86, 0, 75, 0, 0, 77, 78, 279, + 84, 85, 86, 0, 75, 0, 0, 77, 78, 214, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, - 85, 86, 0, 75, 0, 0, 77, 78, 274, 79, - 80, 81, 0, 0, 0, 0, 0, 0, 74, 76, - 82, 83, 84, 85, 86, 0, 75, 0, 0, 77, - 78, 250, 79, 80, 81, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, - 83, 84, 85, 86, 0, 75, 0, 0, 77, 78, - 242, 79, 80, 81, 0, 0, 0, 0, 0, 0, + 0, 74, 76, 82, 83, 84, 85, 86, 0, 75, + 0, 0, 77, 78, 161, 79, 80, 81, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 74, 76, + 82, 83, 84, 85, 86, 0, 75, 0, 273, 77, + 78, 0, 79, 80, 81, 0, 0, 0, 0, 0, + 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, + 0, 75, 0, 264, 77, 78, 0, 79, 80, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, 75, 0, - 0, 77, 78, 214, 79, 80, 81, 0, 0, 0, - 0, 0, 77, 78, 0, 79, 80, 81, 0, 74, - 76, 82, 83, 84, 85, 86, 0, 75, 0, 0, - 77, 78, 161, 79, 80, 81, 0, 0, 0, 0, + 263, 77, 78, 0, 79, 80, 81, 0, 0, 0, + 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, + 85, 86, 0, 75, 0, 236, 0, 0, 0, 77, + 78, 235, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, - 75, 0, 264, 74, 76, 82, 83, 84, 85, 86, - 0, 75, 0, 263, 77, 78, 0, 79, 80, 81, - 0, 74, 76, 82, 83, 84, 85, 86, 0, 75, - 0, 236, 0, 77, 78, 0, 79, 80, 81, 0, - 0, 0, 0, 0, 235, 0, 0, 77, 78, 0, - 79, 80, 81, 0, 0, 74, 76, 82, 83, 84, - 85, 86, 267, 75, 0, 0, 77, 78, 0, 79, - 80, 81, 0, 0, 74, 76, 82, 83, 84, 85, - 86, 155, 75, 0, 0, 0, 0, 0, 74, 76, - 82, 83, 84, 85, 86, 153, 75, 77, 78, 0, - 79, 80, 81, 0, 0, 0, 0, 74, 76, 82, - 83, 84, 85, 86, 0, 75, 0, 0, 0, 0, - 0, 0, 0, 0, 53, 54, 0, 55, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 50, 74, 76, - 82, 83, 84, 85, 86, 52, 75, 0, 0, 65, - 66, 67, 68, 69, 70, 71, 72, 73, + 75, 77, 78, 0, 79, 80, 81, 0, 267, 0, + 77, 78, 0, 79, 80, 81, 0, 0, 0, 0, + 74, 76, 82, 83, 84, 85, 86, 0, 75, 77, + 78, 0, 79, 80, 81, 155, 0, 0, 0, 153, + 0, 0, 74, 76, 82, 83, 84, 85, 86, 0, + 75, 74, 76, 82, 83, 84, 85, 86, 0, 75, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 74, 76, 82, 83, 84, 85, 86, 0, 75, 53, + 54, 0, 55, 56, 57, 58, 59, 60, 61, 62, + 63, 64, 50, 0, 0, 0, 0, 0, 0, 0, + 52, 0, 0, 0, 65, 66, 67, 68, 69, 70, + 71, 72, 73, } var yyPact = [...]int{ - 180, -1000, 203, -25, -1000, 410, 203, 134, 131, 84, - 977, -1000, 953, 410, 343, 520, 520, 410, 410, 157, - 153, 83, -1000, -1000, -1000, -1000, -1000, -11, -1000, -1000, - 152, -1000, 410, 520, 520, 461, 362, 154, -1000, -1000, - -1000, -1000, -1000, -1000, -1000, 172, -25, -1000, -31, 98, - 52, 47, 35, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + 180, -1000, 186, -33, -1000, 410, 186, 110, 106, 49, + 1012, -1000, 965, 410, 295, 520, 520, 410, 410, 127, + 139, 93, -1000, -1000, -1000, -1000, -1000, -8, -1000, -1000, + 116, -1000, 410, 520, 520, 495, 362, 119, -1000, -1000, + -1000, -1000, -1000, -1000, -1000, 172, -33, -1000, -35, 82, + 42, 12, 9, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, 410, -1000, 410, 410, 410, 410, - 410, 410, 410, 410, 410, 410, 410, -1000, 953, 55, - -1000, -1000, -1000, 83, 266, 295, 208, 922, 410, 903, - 103, -5, -1000, -1000, 410, -1000, 784, 93, 93, -32, - 97, 32, 17, 410, -1000, -1000, -1000, 627, -1000, -1000, - 135, 177, 73, -1000, -1000, 977, 101, 101, 101, 953, - 85, 85, 204, 222, 561, 74, 156, 156, 88, 88, - 88, 144, -1000, -1000, 55, 495, -1000, -1000, -1000, 51, - 410, 55, 55, 410, -1000, 410, 410, 410, 177, -8, - 953, -1000, -1000, 461, 520, 520, 755, -1000, -1000, -1000, - 410, -25, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, - -1000, -1000, -1000, -1000, 166, -1000, -1000, 410, 55, -6, - -1000, -29, -1000, 15, 7, 410, -1000, -1000, 314, 598, - -16, -26, 870, -1000, 953, 836, -13, -1000, -1000, 410, - -1000, -1000, 148, -1000, 6, 732, 58, -1000, -10, -1000, - 953, -1000, -1000, 55, -1000, 495, 55, 55, 703, -1000, - 574, -1000, 410, 410, 118, 410, -1000, 5, 177, 953, - 520, 520, -1000, -1000, -1000, 101, -1000, -1000, -1000, -1000, - 1, -1000, 818, 807, 116, 410, 889, 410, -1000, -1000, - -1000, -1000, 55, 410, 410, -1000, 953, 410, 19, -1000, - 680, 546, 870, -1000, -1000, -1000, 410, -1000, 651, -1000, + 410, 410, 410, 410, 410, 410, 410, -1000, 965, 2, + -1000, -1000, -1000, 93, 266, 208, 109, 946, 410, 937, + 74, -22, -1000, -1000, 410, -1000, 756, 171, 171, -36, + 78, 8, 7, 410, -1000, -1000, -1000, 599, -1000, -1000, + 122, 145, 46, -1000, -1000, 1012, 166, 166, 166, 965, + 204, 204, 562, 222, 617, 168, 23, 23, 53, 53, + 53, 135, -1000, -1000, 2, 461, -1000, -1000, -1000, 43, + 410, 2, 2, 410, -1000, 410, 410, 410, 145, 0, + 965, -1000, -1000, 495, 520, 520, 731, -1000, -1000, -1000, + 410, -33, -1000, -1000, -1000, -1000, -1000, -1000, -1000, -1000, + -1000, -1000, -1000, -1000, 118, -1000, -1000, 410, 2, -17, + -1000, -29, -1000, 5, 4, 410, -1000, -1000, 314, 574, + -21, -27, 887, -1000, 965, 860, -12, -1000, -1000, 410, + -1000, -1000, 73, -1000, 3, 704, 45, -1000, -18, -1000, + 965, -1000, -1000, 2, -1000, 461, 2, 2, 679, -1000, + 546, -1000, 410, 410, 94, 410, -1000, -2, 145, 965, + 520, 520, -1000, -1000, -1000, 166, -1000, -1000, -1000, -1000, + -3, -1000, 835, 808, 96, 410, 915, 410, -1000, -1000, + -1000, -1000, 2, 410, 410, -1000, 965, 410, 783, -1000, + 652, 62, 887, -1000, -1000, -1000, 410, -1000, 627, -1000, } var yyPgo = [...]int{ - 0, 267, 266, 263, 216, 259, 10, 203, 296, 247, - 0, 241, 15, 240, 238, 9, 4, 12, 237, 22, - 228, 1, 227, 224, 13, 221, 8, 2, 7, 16, - 219, 218, 208, 5, 195, 192, 14, 3, + 0, 280, 276, 267, 193, 266, 7, 192, 175, 263, + 0, 259, 15, 247, 241, 11, 4, 9, 240, 22, + 238, 1, 228, 227, 12, 214, 8, 2, 10, 16, + 207, 205, 203, 5, 202, 201, 13, 3, } var yyR1 = [...]int{ @@ -359,7 +363,7 @@ var yyChk = [...]int{ -10, 58, 61, 46, 56, 56, -10, 59, 31, 28, 30, -33, 20, 21, 55, -29, -27, -28, -31, 25, 28, 17, 18, 19, 54, -27, -27, 45, 6, -13, - -12, -14, -15, -37, 28, 57, 21, 59, 56, -10, + -12, -14, -15, -37, -17, 57, 21, 59, 56, -10, -12, -12, -10, -10, -10, -10, -9, -33, 58, 55, -24, -26, -16, -26, 58, -10, -6, 59, -32, -27, -10, -12, 59, 46, 61, 46, 56, 56, -10, 59, @@ -1084,7 +1088,7 @@ yydefault: yyDollar = yyS[yypt-3 : yypt+1] //line parser.go.y:286 { - yyVAL.value = &PatternObject{KeyString: yyDollar[1].token, Val: yyDollar[3].value.(*Pattern)} + yyVAL.value = &PatternObject{KeyString: yyDollar[1].value.(*String), Val: yyDollar[3].value.(*Pattern)} } case 53: yyDollar = yyS[yypt-5 : yypt+1] diff --git a/parser.go.y b/parser.go.y index 3b009b7e..534be7c8 100644 --- a/parser.go.y +++ b/parser.go.y @@ -282,9 +282,9 @@ objectpattern { $$ = &PatternObject{Key: $1, Val: $3.(*Pattern)} } - | tokString ':' pattern + | string ':' pattern { - $$ = &PatternObject{KeyString: $1, Val: $3.(*Pattern)} + $$ = &PatternObject{KeyString: $1.(*String), Val: $3.(*Pattern)} } | '(' query ')' ':' pattern { diff --git a/query.go b/query.go index 4886045a..ea782b29 100644 --- a/query.go +++ b/query.go @@ -352,7 +352,7 @@ func (e *Pattern) String() string { // PatternObject ... type PatternObject struct { Key string - KeyString string + KeyString *String Query *Query Val *Pattern KeyOnly string @@ -362,8 +362,8 @@ func (e *PatternObject) String() string { var s strings.Builder if e.Key != "" { s.WriteString(e.Key) - } else if e.KeyString != "" { - s.WriteString(e.KeyString) + } else if e.KeyString != nil { + fmt.Fprint(&s, e.KeyString) } else if e.Query != nil { fmt.Fprintf(&s, "(%s)", e.Query) }