Changes in src/Parser/StatementNode.cc [145f1fc:7f5566b]
- File:
-
- 1 edited
-
src/Parser/StatementNode.cc (modified) (13 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/StatementNode.cc
r145f1fc r7f5566b 9 9 // Author : Rodolfo G. Esteves 10 10 // Created On : Sat May 16 14:59:41 2015 11 // Last Modified By : Rob Schluntz12 // Last Modified On : T ue Jul 14 12:20:44201513 // Update Count : 2111 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 30 14:39:39 2015 13 // Update Count : 130 14 14 // 15 15 … … 36 36 StatementNode::StatementNode() : ParseNode(), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {} 37 37 38 StatementNode::StatementNode( const string *name _ ) : ParseNode( name_), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}38 StatementNode::StatementNode( const string *name ) : ParseNode( name ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {} 39 39 40 40 StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), isCatchRest ( false ) { … … 60 60 } 61 61 62 StatementNode::StatementNode( Type t, ExpressionNode *ctrl_label, StatementNode *block_ ) : 63 type( t ), control( ctrl_label ), block( block_), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) { 64 if ( t == Default ) 65 control = 0; 62 StatementNode::StatementNode( Type t, ExpressionNode *ctrl_label, StatementNode *block ) : type( t ), control( ctrl_label ), block( block ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) { 63 this->control = ( t == Default ) ? 0 : control; 66 64 } 67 65 68 StatementNode::StatementNode( Type t, string *_target ) : 69 type( t ), control( 0 ), block( 0 ), labels( 0 ), target(_target ), decl( 0 ), isCatchRest ( false ) {} 66 StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {} 70 67 71 68 StatementNode::~StatementNode() { 72 69 delete control; 73 70 delete block; 74 delete labels;75 71 delete target; 76 72 delete decl; … … 103 99 } 104 100 105 void StatementNode::set_control( ExpressionNode *c ) {106 control = c;107 }108 109 StatementNode * StatementNode::set_block( StatementNode *b ) {110 block = b;111 112 return this;113 }114 115 ExpressionNode *StatementNode::get_control() const {116 return control;117 }118 119 StatementNode *StatementNode::get_block() const {120 return block;121 }122 123 StatementNode::Type StatementNode::get_type() const {124 return type;125 }126 127 101 StatementNode *StatementNode::add_label( const std::string *l ) { 128 102 if ( l != 0 ) { 129 if ( labels == 0 ) 130 labels = new std::list<std::string>(); 131 132 labels->push_front(*l ); 103 labels.push_front( *l ); 133 104 delete l; 134 105 } // if 135 106 return this; 136 107 } 137 138 std::list<std::string> *StatementNode::get_labels() const { return labels; }139 108 140 109 StatementNode *StatementNode::add_controlexp( ExpressionNode *e ) { 141 110 if ( control && e ) 142 111 control->add_to_list( e ); // xxx - check this 143 144 112 return this; 145 113 } … … 170 138 171 139 void StatementNode::print( std::ostream &os, int indent ) const { 172 if ( labels != 0 ) { 173 if ( ! labels->empty()) { 174 std::list<std::string>::const_iterator i; 175 176 os << string( indent, ' ' ); 177 for ( i = labels->begin(); i != labels->end(); i++ ) 178 os << *i << ":"; 179 os << endl; 180 } // if 140 if ( ! labels.empty() ) { 141 std::list<std::string>::const_iterator i; 142 143 os << string( indent, ' ' ); 144 for ( i = labels.begin(); i != labels.end(); i++ ) 145 os << *i << ":"; 146 os << endl; 181 147 } // if 182 148 … … 198 164 if ( decl ) { 199 165 os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl; 200 decl->print( os, indent + 2 *ParseNode::indent_by );166 decl->print( os, indent + 2 * ParseNode::indent_by ); 201 167 } else if ( isCatchRest ) { 202 168 os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl; … … 206 172 } // if 207 173 if ( control ) { 208 os << string( indent + ParseNode::indent_by, ' ' ) << " Expression: " << endl;209 control->printList( os, indent + 2 *ParseNode::indent_by );174 os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl; 175 control->printList( os, indent + 2 * ParseNode::indent_by ); 210 176 } // if 211 177 if ( block ) { 212 178 os << string( indent + ParseNode::indent_by, ' ' ) << "Branches of execution: " << endl; 213 block->printList( os, indent + 2 *ParseNode::indent_by );179 block->printList( os, indent + 2 * ParseNode::indent_by ); 214 180 } // if 215 181 if ( target ) { … … 225 191 std::list<Label> labs; 226 192 227 if ( labels != 0) {193 if ( ! labels.empty() ) { 228 194 std::back_insert_iterator< std::list<Label> > lab_it( labs ); 229 copy( labels ->begin(), labels->end(), lab_it );195 copy( labels.begin(), labels.end(), lab_it ); 230 196 } // if 231 197 … … 274 240 if ( ctl->get_init() != 0 ) { 275 241 buildList( ctl->get_init(), init ); 276 } 242 } // if 277 243 278 244 Expression *cond = 0; … … 341 307 return new FinallyStmt( labs, block ); 342 308 } 309 case Asm: 310 assert( false ); 343 311 default: 344 312 // shouldn't be here … … 346 314 } // switch 347 315 } 316 348 317 349 318 CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {} … … 378 347 Statement *CompoundStmtNode::build() const { 379 348 std::list<Label> labs; 380 std::list<std::string> *labels = get_labels();381 382 if ( labels != 0) {349 const std::list<std::string> &labels = get_labels(); 350 351 if ( ! labels.empty() ) { 383 352 std::back_insert_iterator< std::list<Label> > lab_it( labs ); 384 copy( labels ->begin(), labels->end(), lab_it );353 copy( labels.begin(), labels.end(), lab_it ); 385 354 } // if 386 355 … … 389 358 return cs; 390 359 } 360 361 362 AsmStmtNode::AsmStmtNode( Type t, bool voltile, ConstantNode *instruction, ExpressionNode *output, ExpressionNode *input, ConstantNode *clobber, LabelNode *gotolabels ) : 363 StatementNode( t ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) { 364 if ( gotolabels ) { 365 this->gotolabels = gotolabels->get_labels(); 366 delete gotolabels; 367 } // if 368 } 369 370 AsmStmtNode::~AsmStmtNode() { 371 delete instruction; delete output; delete input; delete clobber; 372 } 373 374 void AsmStmtNode::print( std::ostream &os, int indent ) const { 375 StatementNode::print( os, indent ); // print statement labels 376 os << string( indent + ParseNode::indent_by, ' ' ) << "volatile:" << voltile << endl; 377 if ( instruction ) { 378 os << string( indent + ParseNode::indent_by, ' ' ) << "Instruction:" << endl; 379 instruction->printList( os, indent + 2 * ParseNode::indent_by ); 380 } // if 381 if ( output ) { 382 os << string( indent + ParseNode::indent_by, ' ' ) << "Output:" << endl; 383 output->printList( os, indent + 2 * ParseNode::indent_by ); 384 } // if 385 if ( input ) { 386 os << string( indent + ParseNode::indent_by, ' ' ) << "Input:" << endl; 387 input->printList( os, indent + 2 * ParseNode::indent_by ); 388 } // if 389 if ( clobber ) { 390 os << string( indent + ParseNode::indent_by, ' ' ) << "Clobber:" << endl; 391 clobber->printList( os, indent + 2 * ParseNode::indent_by ); 392 } // if 393 if ( ! gotolabels.empty() ) { 394 os << string( indent + ParseNode::indent_by, ' ' ) << "Goto Labels:" << endl; 395 os << string( indent + 2 * ParseNode::indent_by, ' ' ); 396 for ( std::list<std::string>::const_iterator i = gotolabels.begin();; ) { 397 os << *i; 398 i++; 399 if ( i == gotolabels.end() ) break; 400 os << ", "; 401 } 402 os << endl; 403 } // if 404 } 405 406 Statement *AsmStmtNode::build() const { 407 std::list<Label> labs; 408 409 if ( ! get_labels().empty() ) { 410 std::back_insert_iterator< std::list<Label> > lab_it( labs ); 411 copy( get_labels().begin(), get_labels().end(), lab_it ); 412 } // if 413 414 std::list< Expression * > out, in; 415 std::list< ConstantExpr * > clob; 416 buildList( output, out ); 417 buildList( input, in ); 418 buildList( clobber, clob ); 419 std::list< Label > gotolabs = gotolabels; 420 return new AsmStmt( labs, voltile, (ConstantExpr *)maybeBuild< Expression >( instruction ), out, in, clob, gotolabs ); 421 } 422 391 423 392 424 void NullStmtNode::print( ostream &os, int indent ) const {
Note:
See TracChangeset
for help on using the changeset viewer.