diff options
author | Jo-Philipp Wich <jow@openwrt.org> | 2014-01-01 21:38:08 +0000 |
---|---|---|
committer | Jo-Philipp Wich <jow@openwrt.org> | 2014-01-01 21:53:06 +0000 |
commit | c95f8d8ed4035cdbebfdfb1ff0c94e3958f3ebb9 (patch) | |
tree | a96861bd8be4ce2a2d38763d73f3804367a18838 | |
parent | 21634830501d0557e44fa5561f3f73e2b7c0ebc3 (diff) | |
download | jsonpath-c95f8d8ed4035cdbebfdfb1ff0c94e3958f3ebb9.tar.gz |
lexer, parser, matcher: extend grammar to allow comma separated keys/indexes as more readable alternative to or expressions
-rw-r--r-- | lexer.l | 2 | ||||
-rw-r--r-- | matcher.c | 1 | ||||
-rw-r--r-- | parser.y | 15 |
3 files changed, 15 insertions, 3 deletions
@@ -77,6 +77,7 @@ BROPEN "[" BRCLOSE "]" POPEN "(" PCLOSE ")" +COMMA "," ROOT "$" THIS "@" @@ -160,6 +161,7 @@ WS [ \t\n]* {BRCLOSE} { return T_BRCLOSE; } {POPEN} { return T_POPEN; } {PCLOSE} { return T_PCLOSE; } +{COMMA} { return T_UNION; } {ROOT} { return T_ROOT; } {THIS} { return T_THIS; } @@ -164,6 +164,7 @@ jp_expr(struct jp_opcode *op, struct json_object *root, struct json_object *cur, return true; case T_OR: + case T_UNION: for (sop = op->down; sop; sop = sop->sibling) if (jp_expr(sop, root, cur, idx, key, cb, priv)) return true; @@ -80,11 +80,11 @@ void jp_free(struct jp_state *s); %token T_ROOT T_THIS T_DOT T_BROPEN T_BRCLOSE -%token T_OR T_AND T_LT T_LE T_GT T_GE T_EQ T_NE T_POPEN T_PCLOSE T_NOT +%token T_OR T_AND T_LT T_LE T_GT T_GE T_EQ T_NE T_POPEN T_PCLOSE T_NOT T_UNION %token <op> T_BOOL T_NUMBER T_STRING T_LABEL T_WILDCARD -%type <op> expr path segments segment or_exps or_exp and_exps and_exp cmp_exp unary_exp +%type <op> expr path segments segment union_exps union_exp or_exps or_exp and_exps and_exp cmp_exp unary_exp %error-verbose @@ -112,7 +112,16 @@ segments segment : T_DOT T_LABEL { $$ = $2; } | T_DOT T_WILDCARD { $$ = $2; } - | T_BROPEN or_exps T_BRCLOSE { $$ = $2; } + | T_BROPEN union_exps T_BRCLOSE { $$ = $2; } + ; + +union_exps + : union_exp { $$ = $1->sibling ? jp_alloc_op(T_UNION, 0, NULL, $1) : $1; } + ; + +union_exp + : union_exp T_UNION or_exps { $$ = append_op($1, $3); } + | or_exps { $$ = $1; } ; or_exps |