/** Parse class, struct or interface member. * * @param parse Parser object. * @param outer_csi CSI containing this declaration. * @return New syntax tree node. In case of parse error, * @c NULL may (but need not) be returned. */ static stree_csimbr_t *parse_csimbr(parse_t *parse, stree_csi_t *outer_csi) { stree_csimbr_t *csimbr; stree_csi_t *csi; stree_ctor_t *ctor; stree_deleg_t *deleg; stree_enum_t *enum_d; stree_fun_t *fun; stree_var_t *var; stree_prop_t *prop; csimbr = NULL; switch (lcur_lc(parse)) { case lc_class: case lc_struct: case lc_interface: csi = parse_csi(parse, lcur_lc(parse), outer_csi); if (csi != NULL) { csimbr = stree_csimbr_new(csimbr_csi); csimbr->u.csi = csi; } break; case lc_new: ctor = parse_ctor(parse, outer_csi); if (ctor != NULL) { csimbr = stree_csimbr_new(csimbr_ctor); csimbr->u.ctor = ctor; } break; case lc_deleg: deleg = parse_deleg(parse, outer_csi); if (deleg != NULL) { csimbr = stree_csimbr_new(csimbr_deleg); csimbr->u.deleg = deleg; } break; case lc_enum: enum_d = parse_enum(parse, outer_csi); if (enum_d != NULL) { csimbr = stree_csimbr_new(csimbr_enum); csimbr->u.enum_d = enum_d; } break; case lc_fun: fun = parse_fun(parse, outer_csi); csimbr = stree_csimbr_new(csimbr_fun); csimbr->u.fun = fun; break; case lc_var: var = parse_var(parse, outer_csi); if (var != NULL) { csimbr = stree_csimbr_new(csimbr_var); csimbr->u.var = var; } break; case lc_prop: prop = parse_prop(parse, outer_csi); csimbr = stree_csimbr_new(csimbr_prop); csimbr->u.prop = prop; break; default: lunexpected_error(parse); lex_next(parse->lex); break; } return csimbr; }
static bool match(T& t, Context *ctx) { return parse_fun(t, ctx); }