static void vxp_expr_not(struct vxp *vxp, struct vex **pvex) { AN(pvex); AZ(*pvex); if (vxp->t->tok == T_NOT) { *pvex = vex_alloc(vxp); AN(*pvex); (*pvex)->tok = vxp->t->tok; vxp_NextToken(vxp); vxp_expr_group(vxp, &(*pvex)->a); return; } vxp_expr_group(vxp, pvex); }
static void vxp_expr_or(struct vxp *vxp, struct vex **pvex) { struct vex *a; AN(pvex); AZ(*pvex); vxp_expr_and(vxp, pvex); ERRCHK(vxp); while (vxp->t->tok == T_OR) { a = *pvex; *pvex = vex_alloc(vxp); AN(*pvex); (*pvex)->tok = vxp->t->tok; (*pvex)->a = a; vxp_NextToken(vxp); ERRCHK(vxp); vxp_expr_and(vxp, &(*pvex)->b); ERRCHK(vxp); } }
static void vxp_expr_cmp(struct vxp *vxp, struct vex **pvex) { AN(pvex); AZ(*pvex); *pvex = vex_alloc(vxp); AN(*pvex); vxp_expr_lhs(vxp, &(*pvex)->lhs); ERRCHK(vxp); /* Test operator */ switch (vxp->t->tok) { /* Single lhs expressions don't take any more tokens */ case EOI: case T_AND: case T_OR: case ')': (*pvex)->tok = T_TRUE; return; /* Valid operators */ case T_EQ: /* == */ case '<': /* < */ case '>': /* > */ case T_GEQ: /* >= */ case T_LEQ: /* <= */ case T_NEQ: /* != */ case T_SEQ: /* eq */ case T_SNEQ: /* ne */ case '~': /* ~ */ case T_NOMATCH: /* !~ */ (*pvex)->tok = vxp->t->tok; break; /* Error */ default: VSB_printf(vxp->sb, "Expected operator got '%.*s' ", PF(vxp->t)); vxp_ErrWhere(vxp, vxp->t, -1); return; } vxp_NextToken(vxp); ERRCHK(vxp); /* Value */ switch((*pvex)->tok) { case '\0': WRONG("Missing token"); break; case T_EQ: /* == */ case '<': /* < */ case '>': /* > */ case T_GEQ: /* >= */ case T_LEQ: /* <= */ case T_NEQ: /* != */ vxp_expr_num(vxp, &(*pvex)->rhs); break; case T_SEQ: /* eq */ case T_SNEQ: /* ne */ vxp_expr_str(vxp, &(*pvex)->rhs); break; case '~': /* ~ */ case T_NOMATCH: /* !~ */ vxp_expr_regex(vxp, &(*pvex)->rhs); break; default: INCOMPL(); } }