Showing the changes to src/core/chuck_parse.cpp (1 of 8 files). Show all
Unified · Split
| @@ -316,6 +316,22 @@ string absyn2str( a_Exp exp ) · 315 unmodified lines | ||
| 316 | 316 | |
| 317 | 317 | |
| 318 | 318 | |
| 319 | +//----------------------------------------------------------------------------- | |
| 320 | +// name: name_demangle() | |
| 321 | +// desc: demangle chuck function names | |
| 322 | +// e.g., input: "version@0@Machine" output: "version" | |
| 323 | +//----------------------------------------------------------------------------- | |
| 324 | +string name_demangle( const string & name ) | |
| 325 | +{ | |
| 326 | + // find the first @ | |
| 327 | + size_t pos = name.find_first_of('@'); | |
| 328 | + // if found, substring | |
| 329 | + return ( pos != string::npos ) ? name.substr(0,pos) : name; | |
| 330 | +} | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 319 | 335 | //----------------------------------------------------------------------------- |
| 320 | 336 | // name: absyn_exp2str() |
| 321 | 337 | // desc: convert abstract syntax exp to string |
| @@ -387,7 +403,7 @@ string absyn_exp2str( a_Exp exp, t_CKBOOL iterate ) · 65 unmodified lines | ||
| 387 | 403 | // next |
| 388 | 404 | exp = exp->next; |
| 389 | 405 | // if more |
| 390 | − if( exp ) str += ", "; | |
| 406 | + if( exp ) str += ","; | |
| 391 | 407 | } |
| 392 | 408 | |
| 393 | 409 | return str; |
| @@ -467,10 +483,48 @@ string absyn_op2str( ae_Operator op ) · 73 unmodified lines | ||
| 467 | 483 | //----------------------------------------------------------------------------- |
| 468 | 484 | string absyn_binary2str( a_Exp_Binary binary ) |
| 469 | 485 | { |
| 486 | + string lhs = absyn_exp2str(binary->lhs); | |
| 487 | + string op = absyn_op2str(binary->op); | |
| 488 | + string rhs = absyn_exp2str(binary->rhs); | |
| 489 | + | |
| 490 | + // use paren? | |
| 491 | + bool paren = false; | |
| 492 | + // spacing? | |
| 493 | + bool spacing = false; | |
| 494 | + | |
| 495 | + switch(binary->op) | |
| 496 | + { | |
| 497 | + case ae_op_plus_chuck: | |
| 498 | + case ae_op_minus_chuck: | |
| 499 | + case ae_op_times_chuck: | |
| 500 | + case ae_op_divide_chuck: | |
| 501 | + case ae_op_s_or_chuck: | |
| 502 | + case ae_op_s_and_chuck: | |
| 503 | + case ae_op_shift_left_chuck: | |
| 504 | + case ae_op_shift_right_chuck: | |
| 505 | + case ae_op_percent_chuck: | |
| 506 | + case ae_op_s_xor_chuck: | |
| 507 | + case ae_op_chuck: | |
| 508 | + case ae_op_unchuck: | |
| 509 | + case ae_op_upchuck: | |
| 510 | + case ae_op_lt: | |
| 511 | + case ae_op_gt: | |
| 512 | + case ae_op_le: | |
| 513 | + case ae_op_ge: | |
| 514 | + case ae_op_at_chuck: | |
| 515 | + paren = false; | |
| 516 | + spacing = true; | |
| 517 | + break; | |
| 518 | + default: | |
| 519 | + paren = true; | |
| 520 | + spacing = false; | |
| 521 | + break; | |
| 522 | + } | |
| 523 | + | |
| 470 | 524 | // (lhs OP rhs) |
| 471 | − return "(" + absyn_exp2str(binary->lhs) | |
| 472 | − + absyn_op2str(binary->op) | |
| 473 | − + absyn_exp2str(binary->rhs) + ")"; | |
| 525 | + string str = string(paren?"(":"") + lhs + (spacing?" ":"") + op + (spacing?" ":"") + rhs + (paren?")":""); | |
| 526 | + // return | |
| 527 | + return str; | |
| 474 | 528 | } |
| 475 | 529 | |
| 476 | 530 | |
| @@ -495,7 +549,7 @@ string absyn_unary2str( a_Exp_Unary unary ) · 18 unmodified lines | ||
| 495 | 549 | string absyn_cast2str( a_Exp_Cast cast ) |
| 496 | 550 | { |
| 497 | 551 | Chuck_Type * to = cast->self->type; |
| 498 | − return "$ " + to->name; | |
| 552 | + return absyn_exp2str(cast->exp) + "$" + to->name; | |
| 499 | 553 | } |
| 500 | 554 | |
| 501 | 555 | |
| @@ -538,9 +592,9 @@ string absyn_primary2str( a_Exp_Primary primary ) · 36 unmodified lines | ||
| 538 | 592 | { |
| 539 | 593 | case ae_primary_var: str = S_name(primary->var); break; |
| 540 | 594 | case ae_primary_num: str = to_string(primary->num); break; |
| 541 | − case ae_primary_float: str = primary->fnum; break; | |
| 542 | − case ae_primary_str: str = primary->str; break; | |
| 543 | − case ae_primary_char: str = primary->chr; break; | |
| 595 | + case ae_primary_float: str = to_string(primary->fnum); break; | |
| 596 | + case ae_primary_str: str = string("\"") + primary->str + "\""; break; | |
| 597 | + case ae_primary_char: str = string("'") + primary->chr + "'"; break; | |
| 544 | 598 | case ae_primary_array: str = "["+absyn_exp2str(primary->array->exp_list)+"]"; break; |
| 545 | 599 | case ae_primary_complex: str = "#("+absyn_exp2str(primary->complex->re)+")"; break; |
| 546 | 600 | case ae_primary_polar: str = "%("+absyn_exp2str(primary->polar->mod)+")"; break; |
| @@ -564,10 +618,7 @@ string absyn_primary2str( a_Exp_Primary primary ) · 17 unmodified lines | ||
| 564 | 618 | string absyn_array2str( a_Exp_Array array ) |
| 565 | 619 | { |
| 566 | 620 | string str; |
| 567 | − | |
| 568 | − t_CKUINT depth = 0; | |
| 569 | 621 | a_Array_Sub sub = NULL; |
| 570 | − t_CKBOOL is_str = FALSE; | |
| 571 | 622 | |
| 572 | 623 | // get the sub |
| 573 | 624 | sub = array->indices; |
| @@ -600,7 +651,7 @@ string absyn_func_call2str( a_Exp_Func_Call func_call ) · 26 unmodified lines | ||
| 600 | 651 | { |
| 601 | 652 | string str; |
| 602 | 653 | // function name |
| 603 | − str = absyn_exp2str( func_call->func ); | |
| 654 | + str = name_demangle( absyn_exp2str( func_call->func ) ); | |
| 604 | 655 | // args |
| 605 | 656 | str += "(" + absyn_exp2str( func_call->args ) + ")"; |
| 606 | 657 | // done |
| @@ -616,7 +667,8 @@ string absyn_func_call2str( a_Exp_Func_Call func_call ) · 9 unmodified lines | ||
| 616 | 667 | //----------------------------------------------------------------------------- |
| 617 | 668 | string absyn_dot_member2str( a_Exp_Dot_Member dot_member ) |
| 618 | 669 | { |
| 619 | − return absyn_exp2str(dot_member->base) + "." + S_name(dot_member->xid); | |
| 670 | + // return | |
| 671 | + return absyn_exp2str(dot_member->base) + "." + name_demangle(S_name(dot_member->xid)); | |
| 620 | 672 | } |
| 621 | 673 | |
| 622 | 674 | |
| @@ -651,7 +703,7 @@ string absyn_decl2str( a_Exp_Decl decl ) · 28 unmodified lines | ||
| 651 | 703 | while( list ) |
| 652 | 704 | { |
| 653 | 705 | // type |
| 654 | − str += list->var_decl->value->type->name + " " + (decl->type->ref ? "@" : "") + list->var_decl->value->name; | |
| 706 | + str += list->var_decl->value->type->name + " " + (decl->type->ref && !list->var_decl->array ? "@ " : "") + list->var_decl->value->name; | |
| 655 | 707 | // array? |
| 656 | 708 | if( list->var_decl->array ) |
| 657 | 709 | { |