From c95f8d8ed4035cdbebfdfb1ff0c94e3958f3ebb9 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Wed, 1 Jan 2014 21:38:08 +0000 Subject: [PATCH] lexer, parser, matcher: extend grammar to allow comma separated keys/indexes as more readable alternative to or expressions --- lexer.l | 2 ++ matcher.c | 1 + parser.y | 15 ++++++++++++--- 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 T_BOOL T_NUMBER T_STRING T_LABEL T_WILDCARD -%type expr path segments segment or_exps or_exp and_exps and_exp cmp_exp unary_exp +%type 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 -- 2.25.1