Changeset fa36f29 in mainline for uspace/app/sbi/src/p_expr.c
- Timestamp:
- 2010-02-27T17:59:14Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 94d484a
- Parents:
- 09ababb7
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/p_expr.c
r09ababb7 rfa36f29 34 34 #include "list.h" 35 35 #include "mytypes.h" 36 #include "p_type.h" 36 37 #include "parse.h" 37 38 #include "stree.h" … … 42 43 static stree_expr_t *parse_comparative(parse_t *parse); 43 44 static stree_expr_t *parse_additive(parse_t *parse); 45 static stree_expr_t *parse_prefix(parse_t *parse); 46 static stree_expr_t *parse_prefix_new(parse_t *parse); 44 47 static stree_expr_t *parse_postfix(parse_t *parse); 45 48 static stree_expr_t *parse_pf_access(parse_t *parse, stree_expr_t *a); … … 48 51 static stree_expr_t *parse_nameref(parse_t *parse); 49 52 static stree_expr_t *parse_lit_int(parse_t *parse); 53 static stree_expr_t *parse_lit_ref(parse_t *parse); 50 54 static stree_expr_t *parse_lit_string(parse_t *parse); 55 static stree_expr_t *parse_self_ref(parse_t *parse); 51 56 52 57 /** Parse expression. */ … … 130 135 stree_binop_t *binop; 131 136 132 a = parse_p ostfix(parse);137 a = parse_prefix(parse); 133 138 while (lcur_lc(parse) == lc_plus) { 134 139 lskip(parse); 135 b = parse_p ostfix(parse);140 b = parse_prefix(parse); 136 141 137 142 binop = stree_binop_new(bo_plus); … … 145 150 146 151 return a; 152 } 153 154 /** Parse prefix expression. */ 155 static stree_expr_t *parse_prefix(parse_t *parse) 156 { 157 stree_expr_t *a; 158 159 switch (lcur_lc(parse)) { 160 case lc_plus: 161 printf("Unimplemented: Unary plus.\n"); 162 exit(1); 163 case lc_new: 164 a = parse_prefix_new(parse); 165 break; 166 default: 167 a = parse_postfix(parse); 168 break; 169 } 170 171 return a; 172 } 173 174 /** Parse @c new operator. */ 175 static stree_expr_t *parse_prefix_new(parse_t *parse) 176 { 177 stree_texpr_t *texpr; 178 stree_new_t *new_op; 179 stree_expr_t *expr; 180 181 lmatch(parse, lc_new); 182 texpr = parse_texpr(parse); 183 lmatch(parse, lc_lparen); 184 lmatch(parse, lc_rparen); 185 186 new_op = stree_new_new(); 187 new_op->texpr = texpr; 188 expr = stree_expr_new(ec_new); 189 expr->u.new_op = new_op; 190 191 return expr; 147 192 } 148 193 … … 240 285 expr = parse_lit_int(parse); 241 286 break; 287 case lc_nil: 288 expr = parse_lit_ref(parse); 289 break; 242 290 case lc_lit_string: 243 291 expr = parse_lit_string(parse); 292 break; 293 case lc_self: 294 expr = parse_self_ref(parse); 244 295 break; 245 296 default: … … 284 335 } 285 336 337 /** Parse reference literal (@c nil). */ 338 static stree_expr_t *parse_lit_ref(parse_t *parse) 339 { 340 stree_literal_t *literal; 341 stree_expr_t *expr; 342 343 lmatch(parse, lc_nil); 344 345 literal = stree_literal_new(ltc_ref); 346 347 expr = stree_expr_new(ec_literal); 348 expr->u.literal = literal; 349 350 return expr; 351 } 352 286 353 /** Parse string literal. */ 287 354 static stree_expr_t *parse_lit_string(parse_t *parse) … … 302 369 return expr; 303 370 } 371 372 /** Parse @c self keyword. */ 373 static stree_expr_t *parse_self_ref(parse_t *parse) 374 { 375 stree_self_ref_t *self_ref; 376 stree_expr_t *expr; 377 378 lmatch(parse, lc_self); 379 380 self_ref = stree_self_ref_new(); 381 382 expr = stree_expr_new(ec_self_ref); 383 expr->u.self_ref = self_ref; 384 385 return expr; 386 }
Note:
See TracChangeset
for help on using the changeset viewer.