summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJo-Philipp Wich <jow@openwrt.org>2014-01-01 21:38:08 +0000
committerJo-Philipp Wich <jow@openwrt.org>2014-01-01 21:53:06 +0000
commitc95f8d8ed4035cdbebfdfb1ff0c94e3958f3ebb9 (patch)
treea96861bd8be4ce2a2d38763d73f3804367a18838
parent21634830501d0557e44fa5561f3f73e2b7c0ebc3 (diff)
downloadjsonpath-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.l2
-rw-r--r--matcher.c1
-rw-r--r--parser.y15
3 files changed, 15 insertions, 3 deletions
diff --git a/lexer.l b/lexer.l
index 18937e8..d1844a2 100644
--- a/lexer.l
+++ b/lexer.l
@@ -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; }
diff --git a/matcher.c b/matcher.c
index 9d2aa89..51e0e3c 100644
--- a/matcher.c
+++ b/matcher.c
@@ -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;
diff --git a/parser.y b/parser.y
index 75c3340..e3b9ee9 100644
--- a/parser.y
+++ b/parser.y
@@ -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