Changeset 94b1f718
- Timestamp:
- May 23, 2019, 6:24:16 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 21a44ca
- Parents:
- a16e246
- Location:
- src/AST
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
src/AST/Label.hpp
ra16e246 r94b1f718 39 39 40 40 operator std::string () const { return name; } 41 bool empty() { return name.empty(); }41 bool empty() const { return name.empty(); } 42 42 }; 43 43 -
src/AST/Print.cpp
ra16e246 r94b1f718 118 118 } 119 119 120 void print( const std::vector<ast::Label> & labels ) { 121 if ( labels.empty() ) return; 122 os << indent << "... Labels: {"; 123 bool isFirst = true; 124 for ( const Label & l : labels ) { 125 if ( isFirst ) { isFirst = false; } else { os << ","; } 126 os << l; 127 } 128 os << "}" << endl; 129 } 130 120 131 void print( const ast::Expr::InferUnion & inferred, unsigned level = 0 ) { 121 132 switch ( inferred.mode ) { 122 133 case ast::Expr::InferUnion::Empty: return; 123 134 case ast::Expr::InferUnion::Slots: { 124 os << indent << "with " << inferred.data.resnSlots.size() << " pending inference slots"125 << std::endl;135 os << indent << "with " << inferred.data.resnSlots.size() 136 << " pending inference slots" << endl; 126 137 return; 127 138 } 128 139 case ast::Expr::InferUnion::Params: { 129 os << indent << "with inferred parameters " << level << ":" << std::endl;140 os << indent << "with inferred parameters " << level << ":" << endl; 130 141 ++indent; 131 142 for ( const auto & i : inferred.data.inferParams ) { 132 143 os << indent; 133 144 short_print( Decl::fromId( i.second.decl ) ); 134 os << std::endl;145 os << endl; 135 146 print( i.second.expr->inferred, level+1 ); 136 147 } … … 143 154 void print( const ast::ParameterizedType::ForallList & forall ) { 144 155 if ( forall.empty() ) return; 145 os << "forall" << std::endl;156 os << "forall" << endl; 146 157 ++indent; 147 158 printAll( forall ); … … 152 163 void print( const std::vector<ptr<Attribute>> & attrs ) { 153 164 if ( attrs.empty() ) return; 154 os << "with attributes" << std::endl;165 os << "with attributes" << endl; 155 166 ++indent; 156 167 printAll( attrs ); … … 160 171 void print( const std::vector<ptr<Expr>> & params ) { 161 172 if ( params.empty() ) return; 162 os << std::endl << indent << "... with parameters" << std::endl;173 os << endl << indent << "... with parameters" << endl; 163 174 ++indent; 164 175 printAll( params ); … … 226 237 227 238 if ( node->env ) { 228 os << std::endl << indent << "... with environment:" << std::endl;239 os << endl << indent << "... with environment:" << endl; 229 240 ++indent; 230 241 node->env->accept( *this ); … … 233 244 234 245 if ( node->extension ) { 235 os << std::endl << indent << "... with extension";246 os << endl << indent << "... with extension"; 236 247 } 237 248 } … … 378 389 379 390 virtual const ast::CompoundStmt * visit( const ast::CompoundStmt * node ) { 380 os << "Compound Stmt" << endl;391 os << "Compound Statement:" << endl; 381 392 ++indent; 382 393 printAll( node->kids ); … … 396 407 os << "Assembler Statement:" << endl; 397 408 ++indent; 398 os << indent << "instruction:" << endl << indent;399 node->instruction->accept( *this);409 os << indent-1 << "instruction:" << endl << indent; 410 safe_print( node->instruction ); 400 411 if ( ! node->output.empty() ) { 401 os << endl << indent +1 << "output:" << endl;412 os << endl << indent << "output:" << endl; 402 413 printAll( node->output ); 403 414 } // if 404 415 if ( ! node->input.empty() ) { 405 os << indent +1 << "input:" << endl;416 os << indent << "input:" << endl; 406 417 printAll( node->input ); 407 418 } // if 408 419 if ( ! node->clobber.empty() ) { 409 os << indent +1 << "clobber:" << endl;420 os << indent << "clobber:" << endl; 410 421 printAll( node->clobber ); 411 422 } // if … … 415 426 416 427 virtual const ast::Stmt * visit( const ast::DirectiveStmt * node ) { 417 os << "GCC Directive: " << node->directive << endl;428 os << "GCC Directive: " << node->directive << endl; 418 429 return node; 419 430 } 420 431 421 432 virtual const ast::Stmt * visit( const ast::IfStmt * node ) { 422 os << "If on condition: 423 os << indent+1;424 ++indent;433 os << "If on condition:" << endl; 434 ++indent; 435 os << indent; 425 436 safe_print( node->cond ); 426 437 --indent; 427 438 428 if ( ! node->inits.empty() ) {429 os << indent << "... with initialization: \n";430 ++indent; 431 for ( const Stmt * stmt : node->inits ) {439 if ( ! node->inits.empty() ) { 440 os << indent << "... with initialization:" << endl; 441 ++indent; 442 for ( const ast::Stmt * stmt : node->inits ) { 432 443 os << indent; 433 s tmt->accept( *this);444 safe_print( stmt ); 434 445 } 435 446 --indent; … … 437 448 } 438 449 439 os << indent << "... then: 450 os << indent << "... then:" << endl; 440 451 441 452 ++indent; … … 445 456 446 457 if ( node->elsePart != 0 ) { 447 os << indent << "... else: 458 os << indent << "... else:" << endl; 448 459 ++indent; 449 460 os << indent; … … 455 466 456 467 virtual const ast::Stmt * visit( const ast::WhileStmt * node ) { 468 if ( node->isDoWhile ) { os << "Do-"; } 469 os << "While on condition:" << endl; 470 ++indent; 471 safe_print( node->cond ); 472 os << indent-1 << "... with body:" << endl; 473 safe_print( node->body ); 474 475 if ( ! node->inits.empty() ) { 476 os << indent-1 << "... with inits:" << endl; 477 printAll( node->inits ); 478 } 479 --indent; 480 457 481 return node; 458 482 } 459 483 460 484 virtual const ast::Stmt * visit( const ast::ForStmt * node ) { 485 os << "For Statement" << endl; 486 487 if ( ! node->inits.empty() ) { 488 os << indent << "... initialization:" << endl; 489 ++indent; 490 for ( const ast::Stmt * stmt : node->inits ) { 491 os << indent+1; 492 safe_print( stmt ); 493 } 494 --indent; 495 } 496 497 if ( node->cond ) { 498 os << indent << "... condition:" << endl; 499 ++indent; 500 os << indent; 501 node->cond->accept( *this ); 502 --indent; 503 } 504 505 if ( node->inc ) { 506 os << indent << "... increment:" << endl; 507 ++indent; 508 os << indent; 509 node->inc->accept( *this ); 510 --indent; 511 } 512 513 if ( node->body ) { 514 os << indent << "... with body:" << endl; 515 ++indent; 516 os << indent; 517 node->body->accept( *this ); 518 --indent; 519 } 520 os << endl; 521 print( node->labels ); 522 461 523 return node; 462 524 } 463 525 464 526 virtual const ast::Stmt * visit( const ast::SwitchStmt * node ) { 527 os << "Switch on condition: "; 528 safe_print( node->cond ); 529 os << endl; 530 531 ++indent; 532 for ( const ast::Stmt * stmt : node->stmts ) { 533 stmt->accept( *this ); 534 } 535 --indent; 536 465 537 return node; 466 538 } 467 539 468 540 virtual const ast::Stmt * visit( const ast::CaseStmt * node ) { 541 if ( node->isDefault() ) { 542 os << indent << "Default "; 543 } else { 544 os << indent << "Case "; 545 safe_print( node->cond ); 546 } // if 547 os << endl; 548 549 ++indent; 550 for ( const ast::Stmt * stmt : node->stmts ) { 551 os << indent; 552 stmt->accept( *this ); 553 } 554 --indent; 555 469 556 return node; 470 557 } 471 558 472 559 virtual const ast::Stmt * visit( const ast::BranchStmt * node ) { 560 os << "Branch (" << node->kindName() << ")" << endl; 561 ++indent; 562 if ( ! node->target.empty() ) { 563 os << indent << "with target: " << node->target << endl; 564 } 565 566 if ( ! node->originalTarget.empty() ) { 567 os << indent << "with original target: " << node->originalTarget << endl; 568 } 569 570 if ( node->computedTarget ) { 571 os << indent << "with computed target: "; 572 node->computedTarget->accept( *this ); 573 os << endl; 574 } 575 --indent; 576 473 577 return node; 474 578 } 475 579 476 580 virtual const ast::Stmt * visit( const ast::ReturnStmt * node ) { 581 os << "Return Statement, returning"; 582 if ( node->expr ) { 583 ++indent; 584 os << ":" << endl << indent; 585 node->expr->accept( *this ); 586 --indent; 587 } else { 588 os << " void"; 589 } 590 os << endl; 591 477 592 return node; 478 593 } … … 503 618 504 619 virtual const ast::NullStmt * visit( const ast::NullStmt * node ) { 620 os << "Null Statement" << endl; 621 print( node->labels ); 622 505 623 return node; 506 624 } … … 516 634 virtual const ast::Expr * visit( const ast::ApplicationExpr * node ) { 517 635 ++indent; 518 os << "Application of" << std::endl << indent;636 os << "Application of" << endl << indent; 519 637 safe_print( node->func ); 520 os << std::endl;638 os << endl; 521 639 if ( ! node->args.empty() ) { 522 os << indent << "... to arguments" << std::endl;640 os << indent << "... to arguments" << endl; 523 641 printAll( node->args ); 524 642 } … … 531 649 virtual const ast::Expr * visit( const ast::UntypedExpr * node ) { 532 650 ++indent; 533 os << "Applying untyped:" << std::endl;651 os << "Applying untyped:" << endl; 534 652 os << indent; 535 653 safe_print( node->func ); 536 os << std::endl << indent-1 << "...to:" << std::endl;654 os << endl << indent-1 << "...to:" << endl; 537 655 printAll( node->args ); 538 656 --indent; … … 550 668 551 669 virtual const ast::Expr * visit( const ast::AddressExpr * node ) { 552 os << "Address of:" << std::endl;670 os << "Address of:" << endl; 553 671 ++indent; 554 672 os << indent; … … 568 686 virtual const ast::Expr * visit( const ast::CastExpr * node ) { 569 687 ++indent; 570 os << (node->isGenerated ? "Generated" : "Explicit") << " cast of:" << std::endl << indent;688 os << (node->isGenerated ? "Generated" : "Explicit") << " cast of:" << endl << indent; 571 689 safe_print( node->arg ); 572 os << std::endl << indent-1 << "... to:";690 os << endl << indent-1 << "... to:"; 573 691 if ( ! node->result ) { 574 692 os << " "; … … 577 695 os << " nothing"; 578 696 } else { 579 os << std::endl << indent;697 os << endl << indent; 580 698 node->result->accept( *this ); 581 699 } // if … … 588 706 virtual const ast::Expr * visit( const ast::KeywordCastExpr * node ) { 589 707 ++indent; 590 os << "Keyword Cast of:" << std::endl << indent;708 os << "Keyword Cast of:" << endl << indent; 591 709 safe_print( node->arg ); 592 710 --indent; 593 os << std::endl << indent << "... to: " << node->targetString();711 os << endl << indent << "... to: " << node->targetString(); 594 712 postprint( node ); 595 713 … … 599 717 virtual const ast::Expr * visit( const ast::VirtualCastExpr * node ) { 600 718 ++indent; 601 os << "Virtual Cast of:" << std::endl << indent;719 os << "Virtual Cast of:" << endl << indent; 602 720 safe_print( node->arg ); 603 os << std::endl << indent-1 << "... to:";721 os << endl << indent-1 << "... to:"; 604 722 if ( ! node->result ) { 605 723 os << " unknown"; 606 724 } else { 607 os << std::endl << indent;725 os << endl << indent; 608 726 node->result->accept( *this ); 609 727 } … … 616 734 virtual const ast::Expr * visit( const ast::UntypedMemberExpr * node ) { 617 735 ++indent; 618 os << "Untyped Member Expression, with field: " << std::endl << indent;736 os << "Untyped Member Expression, with field: " << endl << indent; 619 737 safe_print( node->member ); 620 os << indent-1 << "... from aggregate:" << std::endl << indent;738 os << indent-1 << "... from aggregate:" << endl << indent; 621 739 safe_print( node->aggregate ); 622 740 --indent; … … 628 746 virtual const ast::Expr * visit( const ast::MemberExpr * node ) { 629 747 ++indent; 630 os << "Member Expression, with field:" << std::endl << indent;748 os << "Member Expression, with field:" << endl << indent; 631 749 safe_print( node->member ); 632 os << std::endl << indent-1 << "... from aggregate:" << std::endl << indent;750 os << endl << indent-1 << "... from aggregate:" << endl << indent; 633 751 safe_print( node->aggregate ); 634 752 --indent; … … 722 840 virtual const ast::Expr * visit( const ast::ConditionalExpr * node ) { 723 841 ++indent; 724 os << "Conditional expression on:" << std::endl << indent;842 os << "Conditional expression on:" << endl << indent; 725 843 safe_print( node->arg1 ); 726 os << indent-1 << "First alternative:" << std::endl << indent;844 os << indent-1 << "First alternative:" << endl << indent; 727 845 safe_print( node->arg2 ); 728 os << indent-1 << "Second alternative:" << std::endl << indent;846 os << indent-1 << "Second alternative:" << endl << indent; 729 847 safe_print( node->arg3 ); 730 848 --indent; … … 736 854 virtual const ast::Expr * visit( const ast::CommaExpr * node ) { 737 855 ++indent; 738 os << "Comma Expression:" << std::endl << indent;856 os << "Comma Expression:" << endl << indent; 739 857 safe_print( node->arg1 ); 740 os << std::endl << indent;858 os << endl << indent; 741 859 safe_print( node->arg2 ); 742 860 --indent; … … 754 872 755 873 virtual const ast::Expr * visit( const ast::AsmExpr * node ) { 756 os << "Asm Expression:" << std::endl;874 os << "Asm Expression:" << endl; 757 875 ++indent; 758 876 if ( node->inout ) node->inout->accept( *this ); … … 766 884 virtual const ast::Expr * visit( const ast::ImplicitCopyCtorExpr * node ) { 767 885 ++indent; 768 os << "Implicit Copy Constructor Expression:" << std::endl << indent;886 os << "Implicit Copy Constructor Expression:" << endl << indent; 769 887 safe_print( node->callExpr ); 770 os << std::endl << indent-1 << "... with temporaries:" << std::endl;888 os << endl << indent-1 << "... with temporaries:" << endl; 771 889 printAll( node->tempDecls ); 772 os << std::endl << indent-1 << "... with return temporaries:" << std::endl;890 os << endl << indent-1 << "... with return temporaries:" << endl; 773 891 printAll( node->returnDecls ); 774 892 --indent; … … 779 897 780 898 virtual const ast::Expr * visit( const ast::ConstructorExpr * node ) { 781 os << "Constructor Expression:" << std::endl << indent+1;899 os << "Constructor Expression:" << endl << indent+1; 782 900 indent += 2; 783 901 safe_print( node->callExpr ); … … 790 908 virtual const ast::Expr * visit( const ast::CompoundLiteralExpr * node ) { 791 909 ++indent; 792 os << "Compound Literal Expression: " << std::endl << indent;910 os << "Compound Literal Expression: " << endl << indent; 793 911 safe_print( node->result ); 794 912 os << indent; … … 811 929 812 930 virtual const ast::Expr * visit( const ast::UntypedTupleExpr * node ) { 813 os << "Untyped Tuple:" << std::endl;931 os << "Untyped Tuple:" << endl; 814 932 ++indent; 815 933 printAll( node->exprs ); … … 821 939 822 940 virtual const ast::Expr * visit( const ast::TupleExpr * node ) { 823 os << "Tuple:" << std::endl;941 os << "Tuple:" << endl; 824 942 ++indent; 825 943 printAll( node->exprs ); … … 831 949 832 950 virtual const ast::Expr * visit( const ast::TupleIndexExpr * node ) { 833 os << "Tuple Index Expression, with tuple:" << std::endl;951 os << "Tuple Index Expression, with tuple:" << endl; 834 952 ++indent; 835 953 os << indent; 836 954 safe_print( node->tuple ); 837 os << indent << "with index: " << node->index << std::endl;955 os << indent << "with index: " << node->index << endl; 838 956 --indent; 839 957 postprint( node ); … … 843 961 844 962 virtual const ast::Expr * visit( const ast::TupleAssignExpr * node ) { 845 os << "Tuple Assignment Expression, with stmt expr:" << std::endl;963 os << "Tuple Assignment Expression, with stmt expr:" << endl; 846 964 ++indent; 847 965 os << indent; … … 855 973 virtual const ast::Expr * visit( const ast::StmtExpr * node ) { 856 974 ++indent; 857 os << "Statement Expression:" << std::endl << indent;975 os << "Statement Expression:" << endl << indent; 858 976 safe_print( node->stmts ); 859 977 if ( ! node->returnDecls.empty() ) { … … 873 991 virtual const ast::Expr * visit( const ast::UniqueExpr * node ) { 874 992 ++indent; 875 os << "Unique Expression with id: " << node->id << std::endl << indent;993 os << "Unique Expression with id: " << node->id << endl << indent; 876 994 safe_print( node->expr ); 877 995 if ( node->object ) { … … 887 1005 virtual const ast::Expr * visit( const ast::UntypedInitExpr * node ) { 888 1006 ++indent; 889 os << "Untyped Init Expression" << std::endl << indent;1007 os << "Untyped Init Expression" << endl << indent; 890 1008 safe_print( node->expr ); 891 1009 if ( ! node->initAlts.empty() ) { … … 903 1021 virtual const ast::Expr * visit( const ast::InitExpr * node ) { 904 1022 ++indent; 905 os << "Init Expression" << std::endl << indent;1023 os << "Init Expression" << endl << indent; 906 1024 safe_print( node->expr ); 907 1025 os << indent << "... with designation: "; … … 914 1032 virtual const ast::Expr * visit( const ast::DeletedExpr * node ) { 915 1033 ++indent; 916 os << "Deleted Expression" << std::endl << indent;1034 os << "Deleted Expression" << endl << indent; 917 1035 safe_print( node->expr ); 918 os << std::endl << indent << "... deleted by: ";1036 os << endl << indent << "... deleted by: "; 919 1037 safe_print( node->deleteStmt ); 920 1038 --indent; … … 925 1043 virtual const ast::Expr * visit( const ast::DefaultArgExpr * node ) { 926 1044 ++indent; 927 os << "Default Argument Expression" << std::endl << indent;1045 os << "Default Argument Expression" << endl << indent; 928 1046 safe_print( node->expr ); 929 1047 --indent; … … 934 1052 virtual const ast::Expr * visit( const ast::GenericExpr * node ) { 935 1053 ++indent; 936 os << "C11 _Generic Expression" << std::endl << indent;1054 os << "C11 _Generic Expression" << endl << indent; 937 1055 safe_print( node->control ); 938 os << std::endl << indent << "... with associations:" << std::endl;1056 os << endl << indent << "... with associations:" << endl; 939 1057 for ( const auto & assoc : node->associations ) { 940 1058 os << indent; … … 942 1060 os << "... type: "; 943 1061 assoc.type->accept( *this ); 944 os << std::endl << indent << "... expression: ";1062 os << endl << indent << "... expression: "; 945 1063 safe_print( assoc.expr ); 946 1064 } else { … … 948 1066 safe_print( assoc.expr ); 949 1067 } 950 os << std::endl;1068 os << endl; 951 1069 } 952 1070 --indent; … … 1025 1143 preprint( node ); 1026 1144 ++indent; 1027 os << "Qualified Type:" << std::endl << indent;1145 os << "Qualified Type:" << endl << indent; 1028 1146 safe_print( node->parent ); 1029 os << std::endl << indent;1147 os << endl << indent; 1030 1148 safe_print( node->child ); 1031 os << std::endl;1149 os << endl; 1032 1150 --indent; 1033 1151 … … 1038 1156 preprint( node ); 1039 1157 1040 os << "function" << std::endl;1158 os << "function" << endl; 1041 1159 if ( ! node->params.empty() ) { 1042 os << indent << "... with parameters" << std::endl;1160 os << indent << "... with parameters" << endl; 1043 1161 ++indent; 1044 1162 printAll( node->params ); 1045 1163 if ( node->isVarArgs ) { 1046 os << indent << "and a variable number of other arguments" << std::endl;1164 os << indent << "and a variable number of other arguments" << endl; 1047 1165 } 1048 1166 --indent; 1049 1167 } else if ( node->isVarArgs ) { 1050 os << indent+1 << "accepting unspecified arguments" << std::endl;1168 os << indent+1 << "accepting unspecified arguments" << endl; 1051 1169 } 1052 1170 1053 1171 os << indent << "... returning"; 1054 1172 if ( node->returns.empty() ) { 1055 os << " nothing" << std::endl;1173 os << " nothing" << endl; 1056 1174 } else { 1057 os << std::endl;1175 os << endl; 1058 1176 ++indent; 1059 1177 printAll( node->returns ); … … 1116 1234 virtual const ast::Type * visit( const ast::TupleType * node ) { 1117 1235 preprint( node ); 1118 os << "tuple of types" << std::endl;1236 os << "tuple of types" << endl; 1119 1237 ++indent; 1120 1238 printAll( node->types ); … … 1159 1277 virtual const ast::Designation * visit( const ast::Designation * node ) { 1160 1278 if ( node->designators.empty() ) return node; 1161 os << "... designated by: " << std::endl;1279 os << "... designated by: " << endl; 1162 1280 ++indent; 1163 1281 for ( const ast::Expr * d : node->designators ) { 1164 1282 os << indent; 1165 1283 d->accept( *this ); 1166 os << std::endl;1284 os << endl; 1167 1285 } 1168 1286 --indent; … … 1177 1295 1178 1296 virtual const ast::Init * visit( const ast::ListInit * node ) { 1179 os << "Compound initializer: " << std::endl;1297 os << "Compound initializer: " << endl; 1180 1298 ++indent; 1181 1299 for ( auto p : group_iterate( node->designations, node->initializers ) ) { … … 1184 1302 os << indent; 1185 1303 init->accept( *this ); 1186 os << std::endl;1304 os << endl; 1187 1305 if ( ! d->designators.empty() ) { 1188 1306 os << indent; … … 1195 1313 1196 1314 virtual const ast::Init * visit( const ast::ConstructorInit * node ) { 1197 os << "Constructor initializer: " << std::endl;1315 os << "Constructor initializer: " << endl; 1198 1316 if ( node->ctor ) { 1199 1317 os << indent << "... initially constructed with "; … … 1223 1341 os << "Attribute with name: " << node->name; 1224 1342 if ( node->params.empty() ) return node; 1225 os << " with parameters: " << std::endl;1343 os << " with parameters: " << endl; 1226 1344 ++indent; 1227 1345 printAll( node->params ); … … 1231 1349 1232 1350 virtual const ast::TypeSubstitution * visit( const ast::TypeSubstitution * node ) { 1233 os << indent << "Types:" << std::endl;1351 os << indent << "Types:" << endl; 1234 1352 for ( const auto& i : *node ) { 1235 1353 os << indent+1 << i.first << " -> "; … … 1237 1355 safe_print( i.second ); 1238 1356 indent -= 2; 1239 os << std::endl;1240 } 1241 os << indent << "Non-types:" << std::endl;1357 os << endl; 1358 } 1359 os << indent << "Non-types:" << endl; 1242 1360 for ( auto i = node->beginVar(); i != node->endVar(); ++i ) { 1243 1361 os << indent+1 << i->first << " -> "; … … 1245 1363 safe_print( i->second ); 1246 1364 indent -= 2; 1247 os << std::endl;1365 os << endl; 1248 1366 } 1249 1367 return node; -
src/AST/Stmt.hpp
ra16e246 r94b1f718 244 244 computedTarget(computedTarget), kind(Goto) {} 245 245 246 const char * kindName() { return kindNames[kind]; }246 const char * kindName() const { return kindNames[kind]; } 247 247 248 248 const Stmt * accept( Visitor & v ) const override { return v.visit( this ); }
Note: See TracChangeset
for help on using the changeset viewer.