-segment
- : T_DOT T_LABEL { $$ = $2; }
- | T_DOT T_WILDCARD { $$ = $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
- : 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;
-}
-
-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;