Changes in uspace/app/sbi/src/parse.c [051bc69a:c5cb943d] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/app/sbi/src/parse.c
r051bc69a rc5cb943d 35 35 #include <assert.h> 36 36 #include <stdlib.h> 37 #include "cspan.h" 37 38 #include "debug.h" 38 39 #include "lex.h" … … 64 65 static stree_prop_t *parse_prop(parse_t *parse, stree_csi_t *outer_csi); 65 66 67 static void parse_symbol_attrs(parse_t *parse, stree_symbol_t *symbol); 66 68 static stree_symbol_attr_t *parse_symbol_attr(parse_t *parse); 67 69 … … 70 72 static stree_fun_sig_t *parse_fun_sig(parse_t *parse); 71 73 74 static void parse_prop_get(parse_t *parse, stree_prop_t *prop); 75 static void parse_prop_set(parse_t *parse, stree_prop_t *prop); 72 76 73 77 /* … … 175 179 stree_ident_t *targ_name; 176 180 stree_targ_t *targ; 181 stree_texpr_t *pref; 177 182 178 183 switch (dclass) { … … 212 217 /* Inheritance list */ 213 218 lskip(parse); 214 csi->base_csi_ref = parse_texpr(parse); 215 } else { 216 csi->base_csi_ref = NULL; 219 220 while (b_true) { 221 pref = parse_texpr(parse); 222 if (parse_is_error(parse)) 223 break; 224 225 list_append(&csi->inherit, pref); 226 if (lcur_lc(parse) != lc_plus) 227 break; 228 229 lskip(parse); 230 } 217 231 } 218 232 … … 224 238 csimbr = parse_csimbr(parse, csi); 225 239 if (csimbr == NULL) 240 continue; 241 242 list_append(&csi->members, csimbr); 243 } 244 245 lmatch(parse, lc_end); 246 247 if (outer_csi != NULL) { 248 switch (outer_csi->cc) { 249 case csi_class: 250 case csi_struct: 226 251 break; 227 228 list_append(&csi->members, csimbr); 229 } 230 231 lmatch(parse, lc_end); 252 case csi_interface: 253 cspan_print(csi->name->cspan); 254 printf(" Error: CSI declared inside interface.\n"); 255 parse_note_error(parse); 256 /* XXX Free csi */ 257 return NULL; 258 } 259 } 232 260 233 261 return csi; … … 253 281 stree_prop_t *prop; 254 282 283 csimbr = NULL; 284 255 285 switch (lcur_lc(parse)) { 256 286 case lc_class: … … 258 288 case lc_interface: 259 289 csi = parse_csi(parse, lcur_lc(parse), outer_csi); 260 csimbr = stree_csimbr_new(csimbr_csi); 261 csimbr->u.csi = csi; 290 if (csi != NULL) { 291 csimbr = stree_csimbr_new(csimbr_csi); 292 csimbr->u.csi = csi; 293 } 262 294 break; 263 295 case lc_new: 264 296 ctor = parse_ctor(parse, outer_csi); 265 csimbr = stree_csimbr_new(csimbr_ctor); 266 csimbr->u.ctor = ctor; 297 if (ctor != NULL) { 298 csimbr = stree_csimbr_new(csimbr_ctor); 299 csimbr->u.ctor = ctor; 300 } 267 301 break; 268 302 case lc_deleg: 269 303 deleg = parse_deleg(parse, outer_csi); 270 csimbr = stree_csimbr_new(csimbr_deleg); 271 csimbr->u.deleg = deleg; 304 if (deleg != NULL) { 305 csimbr = stree_csimbr_new(csimbr_deleg); 306 csimbr->u.deleg = deleg; 307 } 272 308 break; 273 309 case lc_enum: 274 310 enum_d = parse_enum(parse, outer_csi); 275 csimbr = stree_csimbr_new(csimbr_enum); 276 csimbr->u.enum_d = enum_d; 311 if (enum_d != NULL) { 312 csimbr = stree_csimbr_new(csimbr_enum); 313 csimbr->u.enum_d = enum_d; 314 } 277 315 break; 278 316 case lc_fun: … … 283 321 case lc_var: 284 322 var = parse_var(parse, outer_csi); 285 csimbr = stree_csimbr_new(csimbr_var); 286 csimbr->u.var = var; 323 if (var != NULL) { 324 csimbr = stree_csimbr_new(csimbr_var); 325 csimbr->u.var = var; 326 } 287 327 break; 288 328 case lc_prop: … … 294 334 lunexpected_error(parse); 295 335 lex_next(parse->lex); 296 csimbr = NULL;297 336 break; 298 337 } … … 311 350 stree_ctor_t *ctor; 312 351 stree_symbol_t *symbol; 313 stree_symbol_attr_t *attr;352 cspan_t *cspan; 314 353 315 354 ctor = stree_ctor_new(); … … 321 360 322 361 lmatch(parse, lc_new); 362 cspan = lprev_span(parse); 323 363 324 364 /* Fake identifier. */ … … 334 374 ctor->sig = parse_fun_sig(parse); 335 375 if (ctor->sig->rtype != NULL) { 336 printf("Error: Constructor of CSI '"); 376 cspan_print(cspan); 377 printf(" Error: Constructor of CSI '"); 337 378 symbol_print_fqn(csi_to_symbol(outer_csi)); 338 379 printf("' has a return type.\n"); … … 340 381 } 341 382 342 list_init(&symbol->attr);343 344 383 /* Parse attributes. */ 345 while (lcur_lc(parse) == lc_comma && !parse_is_error(parse)) { 346 lskip(parse); 347 attr = parse_symbol_attr(parse); 348 list_append(&symbol->attr, attr); 349 } 384 parse_symbol_attrs(parse, symbol); 350 385 351 386 ctor->proc = stree_proc_new(); … … 356 391 357 392 /* This constructor has no body. */ 358 printf("Error: Constructor of CSI '"); 393 cspan_print(cspan); 394 printf(" Error: Constructor of CSI '"); 359 395 symbol_print_fqn(csi_to_symbol(outer_csi)); 360 396 printf("' has no body.\n"); … … 368 404 } 369 405 406 switch (outer_csi->cc) { 407 case csi_class: 408 case csi_struct: 409 break; 410 case csi_interface: 411 cspan_print(ctor->name->cspan); 412 printf(" Error: Constructor declared inside interface.\n"); 413 parse_note_error(parse); 414 /* XXX Free ctor */ 415 return NULL; 416 } 417 370 418 return ctor; 371 419 } … … 409 457 410 458 if (list_is_empty(&enum_d->members)) { 459 cspan_print(enum_d->name->cspan); 411 460 printf("Error: Enum type '%s' has no members.\n", 412 461 strtab_get_str(enum_d->name->sid)); … … 416 465 lmatch(parse, lc_end); 417 466 467 if (outer_csi != NULL) { 468 switch (outer_csi->cc) { 469 case csi_class: 470 case csi_struct: 471 break; 472 case csi_interface: 473 cspan_print(enum_d->name->cspan); 474 printf(" Error: Enum declared inside interface.\n"); 475 parse_note_error(parse); 476 /* XXX Free enum */ 477 return NULL; 478 } 479 } 480 418 481 return enum_d; 419 482 } … … 449 512 stree_deleg_t *deleg; 450 513 stree_symbol_t *symbol; 451 stree_symbol_attr_t *attr;452 514 453 515 deleg = stree_deleg_new(); … … 467 529 deleg->sig = parse_fun_sig(parse); 468 530 469 list_init(&symbol->attr);470 471 531 /* Parse attributes. */ 472 while (lcur_lc(parse) == lc_comma && !parse_is_error(parse)) { 473 lskip(parse); 474 attr = parse_symbol_attr(parse); 475 list_append(&symbol->attr, attr); 476 } 532 parse_symbol_attrs(parse, symbol); 477 533 478 534 lmatch(parse, lc_scolon); 535 536 switch (outer_csi->cc) { 537 case csi_class: 538 case csi_struct: 539 break; 540 case csi_interface: 541 cspan_print(deleg->name->cspan); 542 printf(" Error: Delegate declared inside interface.\n"); 543 parse_note_error(parse); 544 /* XXX Free deleg */ 545 return NULL; 546 } 479 547 480 548 return deleg; … … 491 559 stree_fun_t *fun; 492 560 stree_symbol_t *symbol; 493 stree_symbol_attr_t *attr;561 bool_t body_expected; 494 562 495 563 fun = stree_fun_new(); … … 508 576 fun->sig = parse_fun_sig(parse); 509 577 510 list_init(&symbol->attr);511 512 578 /* Parse attributes. */ 513 while (lcur_lc(parse) == lc_comma && !parse_is_error(parse)) { 514 lskip(parse); 515 attr = parse_symbol_attr(parse); 516 list_append(&symbol->attr, attr); 517 } 579 parse_symbol_attrs(parse, symbol); 580 581 body_expected = !stree_symbol_has_attr(symbol, sac_builtin) && 582 (outer_csi->cc != csi_interface); 518 583 519 584 fun->proc = stree_proc_new(); … … 523 588 lskip(parse); 524 589 525 /* This function has no body. */ 526 if (!stree_symbol_has_attr(symbol, sac_builtin)) { 527 printf("Error: Function '"); 590 /* Body not present */ 591 if (body_expected) { 592 cspan_print(fun->name->cspan); 593 printf(" Error: Function '"); 528 594 symbol_print_fqn(symbol); 529 printf("' has nobody.\n");595 printf("' should have a body.\n"); 530 596 parse_note_error(parse); 531 597 } 598 532 599 fun->proc->body = NULL; 533 600 } else { … … 535 602 fun->proc->body = parse_block(parse); 536 603 lmatch(parse, lc_end); 604 605 /* Body present */ 606 if (!body_expected) { 607 cspan_print(fun->name->cspan); 608 printf(" Error: Function declaration '"); 609 symbol_print_fqn(symbol); 610 printf("' should not have a body.\n"); 611 parse_note_error(parse); 612 } 537 613 } 538 614 … … 561 637 lmatch(parse, lc_colon); 562 638 var->type = parse_texpr(parse); 639 640 parse_symbol_attrs(parse, symbol); 641 563 642 lmatch(parse, lc_scolon); 643 644 switch (outer_csi->cc) { 645 case csi_class: 646 case csi_struct: 647 break; 648 case csi_interface: 649 cspan_print(var->name->cspan); 650 printf(" Error: Variable declared inside interface.\n"); 651 parse_note_error(parse); 652 /* XXX Free var */ 653 return NULL; 654 } 564 655 565 656 return var; … … 576 667 stree_prop_t *prop; 577 668 stree_symbol_t *symbol; 669 bool_t body_expected; 578 670 579 671 stree_ident_t *ident; … … 625 717 lmatch(parse, lc_colon); 626 718 prop->type = parse_texpr(parse); 719 720 /* Parse attributes. */ 721 parse_symbol_attrs(parse, symbol); 722 723 body_expected = (outer_csi->cc != csi_interface); 724 627 725 lmatch(parse, lc_is); 628 726 … … 630 728 switch (lcur_lc(parse)) { 631 729 case lc_get: 632 lskip(parse); 633 lmatch(parse, lc_is); 634 if (prop->getter != NULL) { 635 printf("Error: Duplicate getter.\n"); 636 (void) parse_block(parse); /* XXX Free */ 637 lmatch(parse, lc_end); 638 parse_note_error(parse); 639 break; 640 } 641 642 /* Create setter procedure */ 643 prop->getter = stree_proc_new(); 644 prop->getter->body = parse_block(parse); 645 prop->getter->outer_symbol = symbol; 646 647 lmatch(parse, lc_end); 730 parse_prop_get(parse, prop); 648 731 break; 649 732 case lc_set: 650 lskip(parse); 651 prop->setter_arg = stree_proc_arg_new(); 652 prop->setter_arg->name = parse_ident(parse); 653 prop->setter_arg->type = prop->type; 654 lmatch(parse, lc_is); 655 if (prop->setter != NULL) { 656 printf("Error: Duplicate setter.\n"); 657 (void) parse_block(parse); /* XXX Free */ 658 lmatch(parse, lc_end); 659 parse_note_error(parse); 660 } 661 662 /* Create setter procedure */ 663 prop->setter = stree_proc_new(); 664 prop->setter->body = parse_block(parse); 665 prop->setter->outer_symbol = symbol; 666 667 lmatch(parse, lc_end); 733 parse_prop_set(parse, prop); 668 734 break; 669 735 default: … … 677 743 } 678 744 745 /** Parse symbol attributes. 746 * 747 * Parse list of attributes and add them to @a symbol. 748 * 749 * @param parse Parser object 750 * @param symbol Symbol to add these attributes to 751 */ 752 static void parse_symbol_attrs(parse_t *parse, stree_symbol_t *symbol) 753 { 754 stree_symbol_attr_t *attr; 755 756 /* Parse attributes. */ 757 while (lcur_lc(parse) == lc_comma && !parse_is_error(parse)) { 758 lskip(parse); 759 attr = parse_symbol_attr(parse); 760 list_append(&symbol->attr, attr); 761 } 762 } 763 679 764 /** Parse symbol attribute. 680 765 * 681 * @param parse Parser object. 682 * @param outer_csi CSI containing this declaration or @c NULL if global. 683 * @return New syntax tree node. 766 * @param parse Parser object 767 * @return New syntax tree node 684 768 */ 685 769 static stree_symbol_attr_t *parse_symbol_attr(parse_t *parse) 686 770 { 687 771 stree_symbol_attr_t *attr; 688 689 if (lcur_lc(parse) != lc_builtin) { 690 printf("Error: Unexpected attribute '"); 772 symbol_attr_class_t sac; 773 774 /* Make compiler happy. */ 775 sac = 0; 776 777 switch (lcur_lc(parse)) { 778 case lc_builtin: sac = sac_builtin; break; 779 case lc_static: sac = sac_static; break; 780 default: 781 cspan_print(lcur_span(parse)); 782 printf(" Error: Unexpected attribute '"); 691 783 lem_print(lcur(parse)); 692 784 printf("'.\n"); 693 785 parse_note_error(parse); 786 break; 694 787 } 695 788 696 789 lskip(parse); 697 790 698 attr = stree_symbol_attr_new(sac _builtin);791 attr = stree_symbol_attr_new(sac); 699 792 return attr; 700 793 } … … 718 811 printf("Parse procedure argument.\n"); 719 812 #endif 720 813 list_init(&arg->attr); 721 814 722 815 /* Parse attributes. */ … … 740 833 741 834 if (lcur_lc(parse) != lc_packed) { 742 printf("Error: Unexpected attribute '"); 835 cspan_print(lcur_span(parse)); 836 printf(" Error: Unexpected attribute '"); 743 837 lem_print(lcur(parse)); 744 838 printf("'.\n"); … … 802 896 803 897 return sig; 898 } 899 900 /** Parse member property getter. 901 * 902 * @param parse Parser object. 903 * @param prop Property containing this declaration. 904 */ 905 static void parse_prop_get(parse_t *parse, stree_prop_t *prop) 906 { 907 cspan_t *cspan; 908 stree_block_t *block; 909 stree_proc_t *getter; 910 bool_t body_expected; 911 912 body_expected = (prop->symbol->outer_csi->cc != csi_interface); 913 914 lskip(parse); 915 cspan = lprev_span(parse); 916 917 if (prop->getter != NULL) { 918 cspan_print(cspan); 919 printf(" Error: Duplicate getter.\n"); 920 parse_note_error(parse); 921 return; 922 } 923 924 if (lcur_lc(parse) == lc_scolon) { 925 /* Body not present */ 926 lskip(parse); 927 block = NULL; 928 929 if (body_expected) { 930 cspan_print(prop->name->cspan); 931 printf(" Error: Property '"); 932 symbol_print_fqn(prop->symbol); 933 printf("' getter should have " 934 "a body.\n"); 935 parse_note_error(parse); 936 } 937 } else { 938 /* Body present */ 939 lmatch(parse, lc_is); 940 block = parse_block(parse); 941 lmatch(parse, lc_end); 942 943 if (!body_expected) { 944 cspan_print(prop->name->cspan); 945 printf(" Error: Property '"); 946 symbol_print_fqn(prop->symbol); 947 printf("' getter declaration should " 948 "not have a body.\n"); 949 parse_note_error(parse); 950 951 /* XXX Free block */ 952 block = NULL; 953 } 954 } 955 956 /* Create getter procedure */ 957 getter = stree_proc_new(); 958 getter->body = block; 959 getter->outer_symbol = prop->symbol; 960 961 /* Store getter in property. */ 962 prop->getter = getter; 963 } 964 965 966 /** Parse member property setter. 967 * 968 * @param parse Parser object. 969 * @param prop Property containing this declaration. 970 */ 971 static void parse_prop_set(parse_t *parse, stree_prop_t *prop) 972 { 973 cspan_t *cspan; 974 stree_block_t *block; 975 stree_proc_t *setter; 976 bool_t body_expected; 977 978 body_expected = (prop->symbol->outer_csi->cc != csi_interface); 979 980 lskip(parse); 981 cspan = lprev_span(parse); 982 983 if (prop->setter != NULL) { 984 cspan_print(cspan); 985 printf(" Error: Duplicate setter.\n"); 986 parse_note_error(parse); 987 return; 988 } 989 990 prop->setter_arg = stree_proc_arg_new(); 991 prop->setter_arg->name = parse_ident(parse); 992 prop->setter_arg->type = prop->type; 993 994 if (lcur_lc(parse) == lc_scolon) { 995 /* Body not present */ 996 lskip(parse); 997 998 block = NULL; 999 1000 if (body_expected) { 1001 cspan_print(prop->name->cspan); 1002 printf(" Error: Property '"); 1003 symbol_print_fqn(prop->symbol); 1004 printf("' setter should have " 1005 "a body.\n"); 1006 parse_note_error(parse); 1007 } 1008 } else { 1009 /* Body present */ 1010 lmatch(parse, lc_is); 1011 block = parse_block(parse); 1012 lmatch(parse, lc_end); 1013 1014 if (!body_expected) { 1015 cspan_print(prop->name->cspan); 1016 printf(" Error: Property '"); 1017 symbol_print_fqn(prop->symbol); 1018 printf("' setter declaration should " 1019 "not have a body.\n"); 1020 parse_note_error(parse); 1021 } 1022 } 1023 1024 1025 /* Create setter procedure */ 1026 setter = stree_proc_new(); 1027 setter->body = block; 1028 setter->outer_symbol = prop->symbol; 1029 1030 /* Store setter in property. */ 1031 prop->setter = setter; 804 1032 } 805 1033
Note:
See TracChangeset
for help on using the changeset viewer.