Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/app/sbi/src/parse.c

    r38aaacc2 r074444f  
    5454static stree_csimbr_t *parse_csimbr(parse_t *parse, stree_csi_t *outer_csi);
    5555
    56 static stree_deleg_t *parse_deleg(parse_t *parse, stree_csi_t *outer_csi);
    5756static stree_fun_t *parse_fun(parse_t *parse, stree_csi_t *outer_csi);
    5857static stree_var_t *parse_var(parse_t *parse, stree_csi_t *outer_csi);
     
    6362static stree_proc_arg_t *parse_proc_arg(parse_t *parse);
    6463static stree_arg_attr_t *parse_arg_attr(parse_t *parse);
    65 static stree_fun_sig_t *parse_fun_sig(parse_t *parse);
    66 
    6764
    6865/*
     
    160157        stree_symbol_t *symbol;
    161158        stree_ident_t *targ_name;
    162         stree_targ_t *targ;
    163159
    164160        switch (dclass) {
     
    174170        csi->name = parse_ident(parse);
    175171
    176         list_init(&csi->targ);
     172        list_init(&csi->targ_names);
    177173
    178174        while (lcur_lc(parse) == lc_slash) {
    179175                lskip(parse);
    180176                targ_name = parse_ident(parse);
    181 
    182                 targ = stree_targ_new();
    183                 targ->name = targ_name;
    184 
    185                 list_append(&csi->targ, targ);
     177                list_append(&csi->targ_names, targ_name);
    186178        }
    187179
     
    209201        while (lcur_lc(parse) != lc_end && !parse_is_error(parse)) {
    210202                csimbr = parse_csimbr(parse, csi);
    211                 if (csimbr == NULL)
    212                         break;
    213 
    214203                list_append(&csi->members, csimbr);
    215204        }
     
    224213 * @param parse         Parser object.
    225214 * @param outer_csi     CSI containing this declaration or @c NULL if global.
    226  * @return              New syntax tree node. In case of parse error,
    227  *                      @c NULL may (but need not) be returned.
     215 * @return              New syntax tree node.
    228216 */
    229217static stree_csimbr_t *parse_csimbr(parse_t *parse, stree_csi_t *outer_csi)
     
    232220
    233221        stree_csi_t *csi;
    234         stree_deleg_t *deleg;
    235222        stree_fun_t *fun;
    236223        stree_var_t *var;
     
    245232                csimbr->u.csi = csi;
    246233                break;
    247         case lc_deleg:
    248                 deleg = parse_deleg(parse, outer_csi);
    249                 csimbr = stree_csimbr_new(csimbr_deleg);
    250                 csimbr->u.deleg = deleg;
    251                 break;
    252234        case lc_fun:
    253235                fun = parse_fun(parse, outer_csi);
     
    268250                lunexpected_error(parse);
    269251                lex_next(parse->lex);
    270                 csimbr = NULL;
    271                 break;
    272252        }
    273253
     
    275255}
    276256
    277 /** Parse delegate.
     257
     258/** Parse member function.
    278259 *
    279260 * @param parse         Parser object.
     
    281262 * @return              New syntax tree node.
    282263 */
    283 static stree_deleg_t *parse_deleg(parse_t *parse, stree_csi_t *outer_csi)
    284 {
    285         stree_deleg_t *deleg;
    286         stree_symbol_t *symbol;
    287         stree_symbol_attr_t *attr;
    288 
    289         deleg = stree_deleg_new();
    290         symbol = stree_symbol_new(sc_deleg);
    291 
    292         symbol->u.deleg = deleg;
    293         symbol->outer_csi = outer_csi;
    294         deleg->symbol = symbol;
    295 
    296         lmatch(parse, lc_deleg);
    297         deleg->name = parse_ident(parse);
    298 
    299 #ifdef DEBUG_PARSE_TRACE
    300         printf("Parsing delegate '%s'.\n", strtab_get_str(deleg->name->sid));
    301 #endif
    302 
    303         deleg->sig = parse_fun_sig(parse);
    304 
    305         list_init(&symbol->attr);
    306 
    307         /* Parse attributes. */
    308         while (lcur_lc(parse) == lc_comma && !parse_is_error(parse)) {
    309                 lskip(parse);
    310                 attr = parse_symbol_attr(parse);
    311                 list_append(&symbol->attr, attr);
    312         }
    313 
    314         lmatch(parse, lc_scolon);
    315 
    316         return deleg;
    317 }
    318 
    319 /** Parse member function.
    320  *
    321  * @param parse         Parser object.
    322  * @param outer_csi     CSI containing this declaration or @c NULL if global.
    323  * @return              New syntax tree node.
    324  */
    325264static stree_fun_t *parse_fun(parse_t *parse, stree_csi_t *outer_csi)
    326265{
    327266        stree_fun_t *fun;
     267        stree_proc_arg_t *arg;
    328268        stree_symbol_t *symbol;
    329269        stree_symbol_attr_t *attr;
     
    338278        lmatch(parse, lc_fun);
    339279        fun->name = parse_ident(parse);
     280        lmatch(parse, lc_lparen);
    340281
    341282#ifdef DEBUG_PARSE_TRACE
    342283        printf("Parsing function '%s'.\n", strtab_get_str(fun->name->sid));
    343284#endif
    344         fun->sig = parse_fun_sig(parse);
     285
     286        list_init(&fun->args);
     287
     288        if (lcur_lc(parse) != lc_rparen) {
     289
     290                /* Parse formal parameters. */
     291                while (!parse_is_error(parse)) {
     292                        arg = parse_proc_arg(parse);
     293
     294                        if (stree_arg_has_attr(arg, aac_packed)) {
     295                                fun->varg = arg;
     296                                break;
     297                        } else {
     298                                list_append(&fun->args, arg);
     299                        }
     300
     301                        if (lcur_lc(parse) == lc_rparen)
     302                                break;
     303
     304                        lmatch(parse, lc_scolon);
     305                }
     306        }
     307
     308        lmatch(parse, lc_rparen);
     309
     310        if (lcur_lc(parse) == lc_colon) {
     311                lskip(parse);
     312                fun->rtype = parse_texpr(parse);
     313        } else {
     314                fun->rtype = NULL;
     315        }
    345316
    346317        list_init(&symbol->attr);
     
    551522        arg->type = parse_texpr(parse);
    552523
    553 #ifdef DEBUG_PARSE_TRACE
    554         printf("Parse procedure argument.\n");
    555 #endif
    556         list_init(&arg->attr);
     524        list_init(&arg->attr);
    557525
    558526        /* Parse attributes. */
     
    563531        }
    564532
     533#ifdef DEBUG_PARSE_TRACE
     534        printf("Parsed arg attr, type=%p.\n", arg->type);
     535#endif
    565536        return arg;
    566537}
     
    586557        attr = stree_arg_attr_new(aac_packed);
    587558        return attr;
    588 }
    589 
    590 /** Parse function signature.
    591  *
    592  * @param parse         Parser object.
    593  * @return              New syntax tree node.
    594  */
    595 static stree_fun_sig_t *parse_fun_sig(parse_t *parse)
    596 {
    597         stree_fun_sig_t *sig;
    598         stree_proc_arg_t *arg;
    599 
    600         sig = stree_fun_sig_new();
    601 
    602         lmatch(parse, lc_lparen);
    603 
    604 #ifdef DEBUG_PARSE_TRACE
    605         printf("Parsing function signature.\n");
    606 #endif
    607 
    608         list_init(&sig->args);
    609 
    610         if (lcur_lc(parse) != lc_rparen) {
    611 
    612                 /* Parse formal parameters. */
    613                 while (!parse_is_error(parse)) {
    614                         arg = parse_proc_arg(parse);
    615 
    616                         if (stree_arg_has_attr(arg, aac_packed)) {
    617                                 sig->varg = arg;
    618                                 break;
    619                         } else {
    620                                 list_append(&sig->args, arg);
    621                         }
    622 
    623                         if (lcur_lc(parse) == lc_rparen)
    624                                 break;
    625 
    626                         lmatch(parse, lc_scolon);
    627                 }
    628         }
    629 
    630         lmatch(parse, lc_rparen);
    631 
    632         if (lcur_lc(parse) == lc_colon) {
    633                 lskip(parse);
    634                 sig->rtype = parse_texpr(parse);
    635         } else {
    636                 sig->rtype = NULL;
    637         }
    638 
    639         return sig;
    640559}
    641560
Note: See TracChangeset for help on using the changeset viewer.