-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 = strdup(msg);
-}
-
-static struct jp_opcode *
-append_op(struct jp_opcode *a, struct jp_opcode *b)
-{
- struct jp_opcode *tail = a;
-
- while (tail->sibling)
- tail = tail->sibling;
-
- tail->sibling = b;
-
- return a;
-}
-
-struct jp_opcode *
-_jp_alloc_op(struct jp_state *s, int type, int num, char *str, ...)
-{
- va_list ap;
- char *ptr;
- struct jp_opcode *newop, *child;
-
- newop = calloc_a(sizeof(*newop),
- str ? &ptr : NULL, str ? strlen(str) + 1 : 0);
-
- if (!newop)