// Parse a postfix expr. // // postfix-expr ::= applicaiton-expr Tree* parse_postfix_expr(Parser& p) { if (Tree* t1 = parse_primary_expr(p)) { while (t1) { if (Tree* t2 = parse_dot_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_application_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_and_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_or_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_eq_comp_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_less_expr(p, t1)) t1 = t2; else if (Tree* t2 = parse_union(p, t1)) t1 = t2; else if (Tree* t2 = parse_intersect(p, t1)) t1 = t2; else if (Tree* t2 = parse_except(p, t1)) t1 = t2; else if (Tree* t2 = parse_join(p, t1)) t1 = t2; else if (Tree* t2 = parse_as(p, t1)) t1 = t2; else break; } return t1; } return parse_primary_expr(p); }
/* Parse @c with-except-finally statement. * * @param parse Parser object. * @return New syntax tree node. */ static stree_wef_t *parse_wef(parse_t *parse) { stree_wef_t *wef_s; stree_except_t *except_c; #ifdef DEBUG_PARSE_TRACE printf("Parse WEF statement.\n"); #endif wef_s = stree_wef_new(); list_init(&wef_s->except_clauses); if (lcur_lc(parse) == lc_with) { lmatch(parse, lc_with); lmatch(parse, lc_ident); lmatch(parse, lc_colon); (void) parse_texpr(parse); lmatch(parse, lc_assign); (void) parse_expr(parse); } lmatch(parse, lc_do); wef_s->with_block = parse_block(parse); while (lcur_lc(parse) == lc_except && !parse_is_error(parse)) { except_c = parse_except(parse); list_append(&wef_s->except_clauses, except_c); } if (lcur_lc(parse) == lc_finally) { lmatch(parse, lc_finally); lmatch(parse, lc_do); wef_s->finally_block = parse_block(parse); } else { wef_s->finally_block = NULL; } lmatch(parse, lc_end); return wef_s; }