Changeset bb7422a for src/Parser/InitializerNode.cc
- Timestamp:
- Apr 4, 2023, 2:25:52 PM (17 months ago)
- Branches:
- ADT, ast-experimental, master
- Children:
- beeff61e, e02e13f
- Parents:
- 4541b09
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/InitializerNode.cc
r4541b09 rbb7422a 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 13:20:24 2015 11 // Last Modified By : Peter A. Buhr12 // Last Modified On : Fri Jul 28 23:27:20 201713 // Update Count : 2 611 // Last Modified By : Andrew Beach 12 // Last Modified On : Tue Apr 4 11:18:00 2023 13 // Update Count : 27 14 14 // 15 15 … … 20 20 using namespace std; 21 21 22 #include "AST/Expr.hpp" // for Expr 23 #include "AST/Init.hpp" // for Designator, Init, ListInit, Sing... 22 24 #include "Common/SemanticError.h" // for SemanticError 23 25 #include "Common/utility.h" // for maybeBuild 24 26 #include "ParseNode.h" // for InitializerNode, ExpressionNode 25 #include "SynTree/Expression.h" // for Expression 26 #include "SynTree/Initializer.h" // for Initializer, ListInit, SingleInit 27 28 static ast::ConstructFlag toConstructFlag( bool maybeConstructed ) { 29 return maybeConstructed ? ast::MaybeConstruct : ast::NoConstruct; 30 } 27 31 28 32 InitializerNode::InitializerNode( ExpressionNode * _expr, bool aggrp, ExpressionNode * des ) … … 33 37 if ( kids ) 34 38 set_last( nullptr ); 35 } // InitializerNode::InitializerNode 39 } // InitializerNode::InitializerNode 36 40 37 41 InitializerNode::InitializerNode( InitializerNode * init, bool aggrp, ExpressionNode * des ) … … 85 89 } // InitializerNode::printOneLine 86 90 87 Initializer* InitializerNode::build() const {91 ast::Init * InitializerNode::build() const { 88 92 assertf( ! isDelete, "Should not build delete stmt InitializerNode" ); 89 93 if ( aggregate ) { 90 94 // steal designators from children 91 std:: list< Designation *> designlist;95 std::vector<ast::ptr<ast::Designation>> designlist; 92 96 InitializerNode * child = next_init(); 93 for ( ; child != nullptr; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) { 94 std::list< Expression * > desList; 95 buildList< Expression, ExpressionNode >( child->designator, desList ); 96 designlist.push_back( new Designation( desList ) ); 97 for ( ; child != nullptr ; child = dynamic_cast< InitializerNode * >( child->get_next() ) ) { 98 std::deque<ast::ptr<ast::Expr>> desList; 99 buildList( child->designator, desList ); 100 designlist.push_back( 101 new ast::Designation( location, std::move( desList ) ) ); 97 102 } // for 98 std::list< Initializer * > initlist; 99 buildList< Initializer, InitializerNode >( next_init(), initlist ); 100 return new ListInit( initlist, designlist, maybeConstructed ); 101 } else { 102 if ( get_expression() ) { 103 assertf( get_expression()->expr, "The expression of initializer must have value" ); 104 return new SingleInit( maybeBuild( get_expression() ), maybeConstructed ); 105 } // if 103 std::vector<ast::ptr<ast::Init>> initlist; 104 buildList( next_init(), initlist ); 105 return new ast::ListInit( location, 106 std::move( initlist ), 107 std::move( designlist ), 108 toConstructFlag( maybeConstructed ) 109 ); 110 } else if ( get_expression() ) { 111 assertf( get_expression()->expr, "The expression of initializer must have value" ); 112 return new ast::SingleInit( location, 113 maybeBuild( get_expression() ), 114 toConstructFlag( maybeConstructed ) 115 ); 106 116 } // if 107 117 return nullptr;
Note: See TracChangeset
for help on using the changeset viewer.