Ignore:
File:
1 edited

Legend:

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

    r051b3db8 rc5cb943d  
    11/*
    2  * Copyright (c) 2011 Jiri Svoboda
     2 * Copyright (c) 2010 Jiri Svoboda
    33 * All rights reserved.
    44 *
     
    8282static stree_vdecl_t *parse_vdecl(parse_t *parse);
    8383static stree_if_t *parse_if(parse_t *parse);
    84 static stree_switch_t *parse_switch(parse_t *parse);
    8584static stree_while_t *parse_while(parse_t *parse);
    8685static stree_for_t *parse_for(parse_t *parse);
     
    668667        stree_prop_t *prop;
    669668        stree_symbol_t *symbol;
     669        bool_t body_expected;
    670670
    671671        stree_ident_t *ident;
     
    720720        /* Parse attributes. */
    721721        parse_symbol_attrs(parse, symbol);
     722
     723        body_expected = (outer_csi->cc != csi_interface);
    722724
    723725        lmatch(parse, lc_is);
     
    10681070        stree_vdecl_t *vdecl_s;
    10691071        stree_if_t *if_s;
    1070         stree_switch_t *switch_s;
    10711072        stree_while_t *while_s;
    10721073        stree_for_t *for_s;
     
    10911092                stat->u.if_s = if_s;
    10921093                break;
    1093         case lc_switch:
    1094                 switch_s = parse_switch(parse);
    1095                 stat = stree_stat_new(st_switch);
    1096                 stat->u.switch_s = switch_s;
    1097                 break;
    10981094        case lc_while:
    10991095                while_s = parse_while(parse);
     
    12181214        lmatch(parse, lc_end);
    12191215        return if_s;
    1220 }
    1221 
    1222 /** Parse @c switch statement.
    1223  *
    1224  * @param parse         Parser object.
    1225  * @return              New syntax tree node.
    1226  */
    1227 static stree_switch_t *parse_switch(parse_t *parse)
    1228 {
    1229         stree_switch_t *switch_s;
    1230         stree_when_t *when_c;
    1231         stree_expr_t *expr;
    1232 
    1233 #ifdef DEBUG_PARSE_TRACE
    1234         printf("Parse 'switch' statement.\n");
    1235 #endif
    1236         lmatch(parse, lc_switch);
    1237 
    1238         switch_s = stree_switch_new();
    1239         list_init(&switch_s->when_clauses);
    1240 
    1241         switch_s->expr = parse_expr(parse);
    1242         lmatch(parse, lc_is);
    1243 
    1244         /* Parse @c when clauses. */
    1245         while (lcur_lc(parse) == lc_when) {
    1246                 lskip(parse);
    1247                 when_c = stree_when_new();
    1248                 list_init(&when_c->exprs);
    1249                 while (b_true) {
    1250                         expr = parse_expr(parse);
    1251                         list_append(&when_c->exprs, expr);
    1252                         if (lcur_lc(parse) != lc_comma)
    1253                                 break;
    1254                         lskip(parse);
    1255                 }
    1256 
    1257                 lmatch(parse, lc_do);
    1258                 when_c->block = parse_block(parse);
    1259 
    1260                 list_append(&switch_s->when_clauses, when_c);
    1261         }
    1262 
    1263         /* Parse @c else clause. */
    1264         if (lcur_lc(parse) == lc_else) {
    1265                 lskip(parse);
    1266                 lmatch(parse, lc_do);
    1267                 switch_s->else_block = parse_block(parse);
    1268         } else {
    1269                 switch_s->else_block = NULL;
    1270         }
    1271 
    1272         lmatch(parse, lc_end);
    1273         return switch_s;
    12741216}
    12751217
     
    17121654        case lc_except:
    17131655        case lc_finally:
    1714         case lc_when:
    17151656                return b_true;
    17161657        default:
Note: See TracChangeset for help on using the changeset viewer.