static bool parse_not(ExprParseState *state) { if (state->token == TOKEN_NOT) { CHECK_ERROR(parse_next_token(state) && parse_not(state)); parse_add_func(state, OPCODE_FUNC1, 1, op_not); return true; } return parse_cmp(state); }
bool WhereMatcher::parse_or() { bool left = parse_not(); Token t = stream_get(); if (t.first == bool_or) { return left || parse_and(); } else { if (t.first != value_undefined_type) stream_unget(t); return left; } }
static bool parse_and(ExprParseState *state) { CHECK_ERROR(parse_not(state)); if (state->token == TOKEN_AND) { int jump = parse_add_jump(state, OPCODE_JMP_AND); CHECK_ERROR(parse_next_token(state) && parse_and(state)); parse_set_jump(state, jump); } return true; }
// unary-expr ::= - unary expr // + unary expr // ! unary expr // primary expr Expr* parse_unary_expr(Parser& p, Token_stream& ts) { if(ts.next()) { switch (ts.next()->kind()) { // negative case minus_tok: return parse_neg(p, ts); case plus_tok: return parse_pos(p, ts); case bang_tok: return parse_not(p, ts); default: return parse_primary_expr(p, ts); } } return nullptr; }
void parse_line(char *buff) { switch(*buff) { case '?': parse_ro_pred(buff+1); break; case '=': parse_copy_pred(buff+1); break; case '&': parse_binop_pred(buff+1, create_and); break; case '|': parse_binop_pred(buff+1, create_or); break; case '~': parse_not(buff+1); break; case 'P': parse_psi(buff+1); break; case 'H': parse_eta(buff+1); break; case '@': parse_updateuse(buff+1); case 'N': parse_node(buff+1); break; case 'E': parse_edge(buff+1); break; case 'C': parse_cond_edge(buff+1); break; } }