-%union {
- struct jp_opcode *op;
-}
-
-
-%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 <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
-
-%error-verbose
-
-%%
-
-input
- : expr { s->path = $1; }
- ;
-
-expr
- : T_LABEL T_EQ path { $1->down = $3; $$ = $1; }
- | path { $$ = $1; }
- ;
-
-path
- : T_ROOT segments { $$ = jp_alloc_op(T_ROOT, 0, NULL, $2); }
- | T_THIS segments { $$ = jp_alloc_op(T_THIS, 0, NULL, $2); }
- ;
-
-segments
- : segments segment { $$ = append_op($1, $2); }
- | segment { $$ = $1; }
- ;
-
-segment
- : T_DOT T_LABEL { $$ = $2; }
- | T_DOT T_WILDCARD { $$ = $2; }
- | T_BROPEN or_exps T_BRCLOSE { $$ = $2; }
- ;
-
-or_exps
- : or_exp { $$ = $1->sibling ? jp_alloc_op(T_OR, 0, NULL, $1) : $1; }
- ;
-
-or_exp
- : or_exp T_OR and_exps { $$ = append_op($1, $3); }
- | and_exps { $$ = $1; }
- ;
-
-and_exps
- : and_exp { $$ = $1->sibling ? jp_alloc_op(T_AND, 0, NULL, $1) : $1; }
- ;
-
-and_exp
- : and_exp T_AND cmp_exp { $$ = append_op($1, $3); }
- | cmp_exp { $$ = $1; }
- ;
-
-cmp_exp
- : unary_exp T_LT unary_exp { $$ = jp_alloc_op(T_LT, 0, NULL, $1, $3); }
- | unary_exp T_LE unary_exp { $$ = jp_alloc_op(T_LE, 0, NULL, $1, $3); }
- | unary_exp T_GT unary_exp { $$ = jp_alloc_op(T_GT, 0, NULL, $1, $3); }
- | unary_exp T_GE unary_exp { $$ = jp_alloc_op(T_GE, 0, NULL, $1, $3); }
- | unary_exp T_EQ unary_exp { $$ = jp_alloc_op(T_EQ, 0, NULL, $1, $3); }
- | unary_exp T_NE unary_exp { $$ = jp_alloc_op(T_NE, 0, NULL, $1, $3); }
- | unary_exp { $$ = $1; }
- ;
-
-unary_exp
- : T_BOOL { $$ = $1; }
- | T_NUMBER { $$ = $1; }
- | T_STRING { $$ = $1; }
- | T_WILDCARD { $$ = $1; }
- | T_POPEN or_exps T_PCLOSE { $$ = $2; }
- | T_NOT unary_exp { $$ = jp_alloc_op(T_NOT, 0, NULL, $2); }
- | path { $$ = $1; }
- ;
-
-%%
-
-void
-yyerror(struct jp_state *s, const char *msg)
-{
- s->error = msg;
-}