示例#1
0
文件: parser.cpp 项目: artju01/waffle
// 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);
}
示例#2
0
/* 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;
}