Changeset 640ffe6 in mainline for uspace/app/sbi/src/p_expr.c
- Timestamp:
- 2010-05-08T08:15:57Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 4039c77
- Parents:
- 1317380 (diff), 051bc69a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/p_expr.c
r1317380 r640ffe6 32 32 #include <stdlib.h> 33 33 #include "bigint.h" 34 #include "cspan.h" 34 35 #include "debug.h" 35 36 #include "lex.h" … … 43 44 44 45 static stree_expr_t *parse_assign(parse_t *parse); 46 static stree_expr_t *parse_disjunctive(parse_t *parse); 47 static stree_expr_t *parse_conjunctive(parse_t *parse); 45 48 static stree_expr_t *parse_comparative(parse_t *parse); 46 49 static stree_expr_t *parse_additive(parse_t *parse); … … 95 98 stree_assign_t *assign; 96 99 97 a = parse_ comparative(parse);100 a = parse_disjunctive(parse); 98 101 99 102 switch (lcur_lc(parse)) { … … 109 112 110 113 lskip(parse); 111 b = parse_ comparative(parse);114 b = parse_disjunctive(parse); 112 115 113 116 assign->dest = a; … … 116 119 tmp = stree_expr_new(ec_assign); 117 120 tmp->u.assign = assign; 121 tmp->cspan = cspan_merge(a->cspan, b->cspan); 122 123 assign->expr = tmp; 124 118 125 return tmp; 126 } 127 128 /** Parse disjunctive expression. 129 * 130 * @param parse Parser object. 131 */ 132 static stree_expr_t *parse_disjunctive(parse_t *parse) 133 { 134 stree_expr_t *a, *b, *tmp; 135 stree_binop_t *binop; 136 cspan_t *cs; 137 138 a = parse_conjunctive(parse); 139 cs = a->cspan; 140 141 while (lcur_lc(parse) == lc_or) { 142 if (parse_is_error(parse)) 143 break; 144 145 lskip(parse); 146 b = parse_conjunctive(parse); 147 148 binop = stree_binop_new(bo_or); 149 binop->arg1 = a; 150 binop->arg2 = b; 151 152 tmp = stree_expr_new(ec_binop); 153 tmp->u.binop = binop; 154 tmp->cspan = cspan_merge(cs, b->cspan); 155 binop->expr = tmp; 156 157 a = tmp; 158 cs = tmp->cspan; 159 } 160 161 return a; 162 } 163 164 /** Parse conjunctive expression. 165 * 166 * @param parse Parser object. 167 */ 168 static stree_expr_t *parse_conjunctive(parse_t *parse) 169 { 170 stree_expr_t *a, *b, *tmp; 171 stree_binop_t *binop; 172 cspan_t *cs; 173 174 a = parse_comparative(parse); 175 cs = a->cspan; 176 177 while (lcur_lc(parse) == lc_and) { 178 if (parse_is_error(parse)) 179 break; 180 181 lskip(parse); 182 b = parse_comparative(parse); 183 184 binop = stree_binop_new(bo_and); 185 binop->arg1 = a; 186 binop->arg2 = b; 187 188 tmp = stree_expr_new(ec_binop); 189 tmp->u.binop = binop; 190 tmp->cspan = cspan_merge(cs, b->cspan); 191 binop->expr = tmp; 192 193 a = tmp; 194 cs = tmp->cspan; 195 } 196 197 return a; 119 198 } 120 199 … … 128 207 stree_binop_t *binop; 129 208 binop_class_t bc; 209 cspan_t *cs; 130 210 131 211 a = parse_additive(parse); 212 cs = a->cspan; 132 213 133 214 while (lcur_lc(parse) == lc_equal || lcur_lc(parse) == lc_notequal || … … 157 238 tmp = stree_expr_new(ec_binop); 158 239 tmp->u.binop = binop; 240 tmp->cspan = cspan_merge(cs, b->cspan); 241 binop->expr = tmp; 242 159 243 a = tmp; 244 cs = tmp->cspan; 160 245 } 161 246 … … 172 257 stree_binop_t *binop; 173 258 binop_class_t bc; 259 cspan_t *cs; 174 260 175 261 a = parse_multip(parse); 262 cs = a->cspan; 263 176 264 while (lcur_lc(parse) == lc_plus || lcur_lc(parse) == lc_minus) { 177 265 if (parse_is_error(parse)) … … 193 281 tmp = stree_expr_new(ec_binop); 194 282 tmp->u.binop = binop; 283 tmp->cspan = cspan_merge(cs, b->cspan); 284 binop->expr = tmp; 285 195 286 a = tmp; 287 cs = tmp->cspan; 196 288 } 197 289 … … 208 300 stree_binop_t *binop; 209 301 binop_class_t bc; 302 cspan_t *cs; 210 303 211 304 a = parse_prefix(parse); 305 cs = a->cspan; 306 212 307 while (lcur_lc(parse) == lc_mult) { 213 308 if (parse_is_error(parse)) … … 228 323 tmp = stree_expr_new(ec_binop); 229 324 tmp->u.binop = binop; 325 tmp->cspan = cspan_merge(cs, b->cspan); 326 binop->expr = tmp; 327 230 328 a = tmp; 329 cs = tmp->cspan; 231 330 } 232 331 … … 244 343 stree_unop_t *unop; 245 344 unop_class_t uc; 345 cspan_t *cs0; 246 346 247 347 switch (lcur_lc(parse)) { 248 348 case lc_plus: 249 349 case lc_minus: 350 case lc_not: 250 351 if (parse_is_error(parse)) 251 352 return parse_recovery_expr(parse); … … 254 355 case lc_plus: uc = uo_plus; break; 255 356 case lc_minus: uc = uo_minus; break; 357 case lc_not: uc = uo_not; break; 256 358 default: assert(b_false); 257 359 } 258 360 361 cs0 = lcur_span(parse); 259 362 lskip(parse); 260 363 a = parse_postfix(parse); … … 265 368 tmp = stree_expr_new(ec_unop); 266 369 tmp->u.unop = unop; 370 tmp->cspan = cspan_merge(cs0, a->cspan); 371 unop->expr = tmp; 267 372 a = tmp; 268 373 break; … … 287 392 stree_new_t *new_op; 288 393 stree_expr_t *expr; 289 394 stree_expr_t *arg; 395 cspan_t *cs0, *cs1; 396 397 cs0 = lcur_span(parse); 290 398 lmatch(parse, lc_new); 291 399 texpr = parse_texpr(parse); 292 400 293 /* Parenthesis should be present except for arrays. */ 294 if (texpr->tc != tc_tindex) { 295 lmatch(parse, lc_lparen); 296 lmatch(parse, lc_rparen); 297 } 401 /* XXX Take span from texpr */ 402 cs1 = lprev_span(parse); 298 403 299 404 new_op = stree_new_new(); … … 302 407 expr->u.new_op = new_op; 303 408 409 list_init(&new_op->ctor_args); 410 411 /* Parenthesized arguments should be present except for arrays. */ 412 if (texpr->tc != tc_tindex) { 413 lmatch(parse, lc_lparen); 414 415 /* Parse constructor arguments */ 416 417 if (lcur_lc(parse) != lc_rparen) { 418 while (!parse_is_error(parse)) { 419 arg = parse_expr(parse); 420 list_append(&new_op->ctor_args, arg); 421 422 if (lcur_lc(parse) == lc_rparen) 423 break; 424 lmatch(parse, lc_comma); 425 } 426 } 427 428 lmatch(parse, lc_rparen); 429 cs1 = cspan_merge(cs0, lprev_span(parse)); 430 } 431 432 expr->cspan = cspan_merge(cs0, cs1); 433 new_op->expr = expr; 434 304 435 return expr; 305 436 } … … 354 485 stree_expr_t *expr; 355 486 stree_access_t *access; 487 cspan_t *cs1; 356 488 357 489 lmatch(parse, lc_period); 358 490 ident = parse_ident(parse); 491 492 /* XXX Take span from ident */ 493 cs1 = lprev_span(parse); 359 494 360 495 access = stree_access_new(); … … 364 499 expr = stree_expr_new(ec_access); 365 500 expr->u.access = access; 501 expr->cspan = cspan_merge(a->cspan, cs1); 502 503 access->expr = expr; 366 504 367 505 return expr; … … 377 515 stree_call_t *call; 378 516 stree_expr_t *arg; 517 cspan_t *cs1; 379 518 380 519 lmatch(parse, lc_lparen); … … 398 537 399 538 lmatch(parse, lc_rparen); 539 cs1 = lprev_span(parse); 400 540 401 541 expr = stree_expr_new(ec_call); 402 542 expr->u.call = call; 543 expr->cspan = cspan_merge(a->cspan, cs1); 544 call->expr = expr; 403 545 404 546 return expr; … … 414 556 stree_index_t *index; 415 557 stree_expr_t *arg; 558 cspan_t *cs1; 416 559 417 560 lmatch(parse, lc_lsbr); … … 435 578 436 579 lmatch(parse, lc_rsbr); 580 cs1 = lprev_span(parse); 437 581 438 582 expr = stree_expr_new(ec_index); 439 583 expr->u.index = index; 584 expr->cspan = cspan_merge(a->cspan, cs1); 585 index->expr = expr; 440 586 441 587 return expr; … … 451 597 stree_texpr_t *texpr; 452 598 stree_as_t *as_op; 599 cspan_t *cs1; 453 600 454 601 lmatch(parse, lc_as); 455 602 texpr = parse_texpr(parse); 603 604 /* XXX Take span from texpr */ 605 cs1 = lprev_span(parse); 456 606 457 607 as_op = stree_as_new(); 458 608 as_op->arg = a; 459 609 as_op->dtype = texpr; 610 460 611 expr = stree_expr_new(ec_as); 461 612 expr->u.as_op = as_op; 613 expr->cspan = cspan_merge(a->cspan, cs1); 614 615 as_op->expr = expr; 462 616 463 617 return expr; … … 471 625 { 472 626 stree_expr_t *expr; 627 cspan_t *cs0, *cs1; 473 628 474 629 if (lcur_lc(parse) == lc_lparen) { 630 cs0 = lcur_span(parse); 475 631 lskip(parse); 476 632 expr = parse_expr(parse); 477 633 lmatch(parse, lc_rparen); 634 cs1 = lprev_span(parse); 635 636 expr->cspan = cspan_merge(cs0, cs1); 478 637 } else { 479 638 expr = parse_primitive(parse); … … 482 641 return expr; 483 642 } 484 485 643 486 644 /** Parse primitive expression. … … 536 694 expr = stree_expr_new(ec_nameref); 537 695 expr->u.nameref = nameref; 696 expr->cspan = lprev_span(parse); 697 nameref->expr = expr; 538 698 539 699 return expr; … … 563 723 expr = stree_expr_new(ec_literal); 564 724 expr->u.literal = literal; 725 expr->cspan = lprev_span(parse); 726 literal->expr = expr; 565 727 566 728 return expr; … … 586 748 expr = stree_expr_new(ec_literal); 587 749 expr->u.literal = literal; 750 expr->cspan = lprev_span(parse); 751 literal->expr = expr; 588 752 589 753 return expr; … … 609 773 expr = stree_expr_new(ec_literal); 610 774 expr->u.literal = literal; 775 expr->cspan = lprev_span(parse); 776 literal->expr = expr; 611 777 612 778 return expr; … … 628 794 expr = stree_expr_new(ec_literal); 629 795 expr->u.literal = literal; 796 expr->cspan = lprev_span(parse); 797 literal->expr = expr; 630 798 631 799 return expr; … … 650 818 expr = stree_expr_new(ec_literal); 651 819 expr->u.literal = literal; 820 expr->cspan = lprev_span(parse); 821 literal->expr = expr; 652 822 653 823 return expr; … … 669 839 expr = stree_expr_new(ec_self_ref); 670 840 expr->u.self_ref = self_ref; 841 expr->cspan = lprev_span(parse); 842 self_ref->expr = expr; 671 843 672 844 return expr; … … 688 860 expr = stree_expr_new(ec_literal); 689 861 expr->u.literal = literal; 690 691 return expr; 692 } 862 literal->expr = expr; 863 864 return expr; 865 }
Note:
See TracChangeset
for help on using the changeset viewer.