Changeset 94d484a in mainline for uspace/app/sbi/src/p_expr.c


Ignore:
Timestamp:
2010-03-07T17:45:33Z (14 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d0febca
Parents:
fa36f29
Message:

Update SBI to rev. 90.

File:
1 edited

Legend:

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

    rfa36f29 r94d484a  
    4848static stree_expr_t *parse_pf_access(parse_t *parse, stree_expr_t *a);
    4949static stree_expr_t *parse_pf_call(parse_t *parse, stree_expr_t *a);
     50static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a);
    5051static stree_expr_t *parse_primitive(parse_t *parse);
    5152static stree_expr_t *parse_nameref(parse_t *parse);
     
    181182        lmatch(parse, lc_new);
    182183        texpr = parse_texpr(parse);
    183         lmatch(parse, lc_lparen);
    184         lmatch(parse, lc_rparen);
     184
     185        /* Parenthesis should be present except for arrays. */
     186        if (texpr->tc != tc_tindex) {
     187                lmatch(parse, lc_lparen);
     188                lmatch(parse, lc_rparen);
     189        }
    185190
    186191        new_op = stree_new_new();
     
    200205        a = parse_primitive(parse);
    201206
    202         while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen) {
     207        while (lcur_lc(parse) == lc_period || lcur_lc(parse) == lc_lparen ||
     208            lcur_lc(parse) == lc_lsbr) {
    203209
    204210                switch (lcur_lc(parse)) {
     
    209215                        tmp = parse_pf_call(parse, a);
    210216                        break;
     217                case lc_lsbr:
     218                        tmp = parse_pf_index(parse, a);
     219                        break;
    211220                default:
    212221                        assert(b_false);
     
    273282}
    274283
     284/** Parse index expression. */
     285static stree_expr_t *parse_pf_index(parse_t *parse, stree_expr_t *a)
     286{
     287        stree_expr_t *expr;
     288        stree_index_t *index;
     289        stree_expr_t *arg;
     290
     291        lmatch(parse, lc_lsbr);
     292
     293        index = stree_index_new();
     294        index->base = a;
     295        list_init(&index->args);
     296
     297        /* Parse indices */
     298
     299        if (lcur_lc(parse) != lc_rsbr) {
     300                while (b_true) {
     301                        arg = parse_expr(parse);
     302                        list_append(&index->args, arg);
     303
     304                        if (lcur_lc(parse) == lc_rsbr)
     305                                break;
     306                        lmatch(parse, lc_comma);
     307                }
     308        }
     309
     310        lmatch(parse, lc_rsbr);
     311
     312        expr = stree_expr_new(ec_index);
     313        expr->u.index = index;
     314
     315        return expr;
     316}
     317
    275318/** Parse primitive expression. */
    276319static stree_expr_t *parse_primitive(parse_t *parse)
Note: See TracChangeset for help on using the changeset viewer.