Changes in src/Parser/StatementNode.cc [777bfcf:8cc5cb0]
- File:
-
- 1 edited
-
src/Parser/StatementNode.cc (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/StatementNode.cc
r777bfcf r8cc5cb0 10 10 // Created On : Sat May 16 14:59:41 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Sun Aug 14 13:10:54201613 // Update Count : 2 8812 // Last Modified On : Thu Aug 11 16:19:45 2016 13 // Update Count : 210 14 14 // 15 15 … … 34 34 }; 35 35 36 StatementNode::StatementNode() : ParseNode(), labels( 0 ), decl( 0 ) {} 37 38 StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), labels( 0 ) { 39 assert( false ); 36 StatementNode::StatementNode() : ParseNode(), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {} 37 38 StatementNode::StatementNode( const string *name ) : ParseNode( name ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {} 39 40 StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), isCatchRest ( false ) { 40 41 if ( decl ) { 41 42 if ( DeclarationNode *agg = decl->extractAggregate() ) { … … 45 46 nextStmt->decl = decl; 46 47 next = nextStmt; 47 if ( decl->get_ next() ) {48 next->set_next( new StatementNode( dynamic_cast< DeclarationNode *>( decl->get_next() ) ) );48 if ( decl->get_link() ) { 49 next->set_next( new StatementNode( dynamic_cast< DeclarationNode* >( decl->get_link() ) ) ); 49 50 decl->set_next( 0 ); 50 51 } // if 51 52 } else { 52 if ( decl->get_ next() ) {53 next = new StatementNode( dynamic_cast< DeclarationNode *>( decl->get_next() ) );53 if ( decl->get_link() ) { 54 next = new StatementNode( dynamic_cast< DeclarationNode* >( decl->get_link() ) ); 54 55 decl->set_next( 0 ); 55 56 } // if … … 59 60 } 60 61 61 StatementNode2::StatementNode2( DeclarationNode *decl ) { 62 if ( decl ) { 63 DeclarationNode *agg = decl->extractAggregate(); 64 if ( agg ) { 65 StatementNode *nextStmt = new StatementNode; 66 nextStmt->type = Decl; 67 nextStmt->decl = decl; 68 next = nextStmt; 69 if ( decl->get_next() ) { 70 next->set_next( new StatementNode2( dynamic_cast<DeclarationNode *>(decl->get_next()) ) ); 71 decl->set_next( 0 ); 72 } // if 73 } else { 74 if ( decl->get_next() ) { 75 next = new StatementNode2( dynamic_cast<DeclarationNode *>( decl->get_next() ) ); 76 decl->set_next( 0 ); 77 } // if 78 agg = decl; 79 } // if 80 stmt = new DeclStmt( noLabels, maybeBuild<Declaration>(agg) ); 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; 64 } 65 66 StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {} 67 68 StatementNode::~StatementNode() { 69 delete control; 70 delete block; 71 delete target; 72 delete decl; 73 } 74 75 StatementNode * StatementNode::newCatchStmt( DeclarationNode *d, StatementNode *s, bool catchRestP ) { 76 StatementNode *ret = new StatementNode( StatementNode::Catch, 0, s ); 77 ret->addDeclaration( d ); 78 ret->setCatchRest( catchRestP ); 79 80 return ret; 81 } 82 83 std::string StatementNode::get_target() const{ 84 if ( target ) 85 return *target; 86 87 return string(""); 88 } 89 90 StatementNode * StatementNode::clone() const { 91 StatementNode *newnode = new StatementNode( type, maybeClone( control ), maybeClone( block ) ); 92 if ( target ) { 93 newnode->target = new string( *target ); 81 94 } else { 82 assert( false ); 83 } // if 84 } 85 86 StatementNode::~StatementNode() { 87 delete decl; 88 } 89 90 StatementNode * StatementNode::clone() const { 91 assert( false ); 92 return 0; 95 newnode->target = 0; 96 } // if 97 newnode->decl = maybeClone( decl ); 98 return newnode; 93 99 } 94 100 … … 101 107 } 102 108 109 StatementNode *StatementNode::append_block( StatementNode *stmt ) { 110 if ( stmt != 0 ) { 111 if ( block == 0 ) 112 block = stmt; 113 else 114 block->set_link( stmt ); 115 } // if 116 return this; 117 } 118 103 119 StatementNode *StatementNode::append_last_case( StatementNode *stmt ) { 104 120 assert( false ); 121 if ( stmt != 0 ) { 122 StatementNode *next = ( StatementNode *)get_link(); 123 if ( next && ( next->get_type() == StatementNode::Case || next->get_type() == StatementNode::Default ) ) 124 next->append_last_case( stmt ); 125 else 126 if ( block == 0 ) 127 block = stmt; 128 else 129 block->set_link( stmt ); 130 } // if 105 131 return this; 106 132 } … … 108 134 StatementNode *StatementNode2::append_last_case( StatementNode *stmt ) { 109 135 StatementNode *prev = this; 110 // find end of list and maintain previous pointer 111 for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) { 136 for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_link() ) { 112 137 StatementNode2 *node = dynamic_cast<StatementNode2 *>(curr); 113 138 assert( node ); … … 115 140 prev = curr; 116 141 } // for 117 // conver from StatementNode list to Statement list118 142 StatementNode2 *node = dynamic_cast<StatementNode2 *>(prev); 119 143 std::list<Statement *> stmts; 120 144 buildList( stmt, stmts ); 121 // splice any new Statements to end of currents Statements122 CaseStmt *caseStmt = dynamic_cast<CaseStmt *>(node->stmt);145 CaseStmt * caseStmt; 146 caseStmt = dynamic_cast<CaseStmt *>(node->stmt); 123 147 caseStmt->get_statements().splice( caseStmt->get_statements().end(), stmts ); 124 148 return this; 125 149 } 126 150 127 Statement *StatementNode::build() const { 151 void StatementNode::print( std::ostream &os, int indent ) const { 152 if ( ! labels.empty() ) { 153 std::list<std::string>::const_iterator i; 154 155 os << string( indent, ' ' ); 156 for ( i = labels.begin(); i != labels.end(); i++ ) 157 os << *i << ":"; 158 os << endl; 159 } // if 160 128 161 switch ( type ) { 129 162 case Decl: 130 return new DeclStmt( noLabels, maybeBuild< Declaration >( decl ));131 assert( false );163 decl->print( os, indent ); 164 break; 132 165 case Exp: 166 if ( control ) { 167 os << string( indent, ' ' ); 168 control->print( os, indent ); 169 os << endl; 170 } else 171 os << string( indent, ' ' ) << "Null Statement" << endl; 172 break; 173 default: 174 os << string( indent, ' ' ) << StatementNode::StType[type] << endl; 175 if ( type == Catch ) { 176 if ( decl ) { 177 os << string( indent + ParseNode::indent_by, ' ' ) << "Declaration: " << endl; 178 decl->print( os, indent + 2 * ParseNode::indent_by ); 179 } else if ( isCatchRest ) { 180 os << string( indent + ParseNode::indent_by, ' ' ) << "Catches the rest " << endl; 181 } else { 182 ; // should never reach here 183 } // if 184 } // if 185 if ( control ) { 186 os << string( indent + ParseNode::indent_by, ' ' ) << "Control: " << endl; 187 control->printList( os, indent + 2 * ParseNode::indent_by ); 188 } // if 189 if ( block ) { 190 os << string( indent + ParseNode::indent_by, ' ' ) << "Cases: " << endl; 191 block->printList( os, indent + 2 * ParseNode::indent_by ); 192 } // if 193 if ( target ) { 194 os << string( indent + ParseNode::indent_by, ' ' ) << "Target: " << get_target() << endl; 195 } // if 196 break; 197 } // switch 198 } 199 200 Statement *StatementNode::build() const { 201 std::list<Statement *> branches; 202 std::list<Expression *> exps; 203 std::list<Label> labs; 204 205 if ( ! labels.empty() ) { 206 std::back_insert_iterator< std::list<Label> > lab_it( labs ); 207 copy( labels.begin(), labels.end(), lab_it ); 208 } // if 209 210 // try { 211 buildList<Statement, StatementNode>( get_block(), branches ); 212 213 switch ( type ) { 214 case Decl: 215 return new DeclStmt( labs, maybeBuild< Declaration >( decl ) ); 216 case Exp: 217 { 218 Expression *e = maybeBuild< Expression >( get_control() ); 219 220 if ( e ) 221 return new ExprStmt( labs, e ); 222 else 223 return new NullStmt( labs ); 224 } 225 assert( false ); 133 226 case If: 227 // { 228 // Statement *thenb = 0, *elseb = 0; 229 // assert( branches.size() >= 1 ); 230 231 // thenb = branches.front(); 232 // branches.pop_front(); 233 // if ( ! branches.empty() ) { 234 // elseb = branches.front(); 235 // branches.pop_front(); 236 // } // if 237 // return new IfStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), thenb, elseb ); 238 // } 239 assert( false ); 134 240 case Switch: 241 // return new SwitchStmt( labs, maybeBuild<Expression>(get_control()), branches ); 242 assert( false ); 135 243 case Case: 244 //return new CaseStmt( labs, maybeBuild<Expression>(get_control() ), branches ); 245 assert( false ); 136 246 case Default: 247 //return new CaseStmt( labs, 0, branches, true ); 248 assert( false ); 137 249 case While: 250 // assert( branches.size() == 1 ); 251 // return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front() ); 252 assert( false ); 138 253 case Do: 254 // assert( branches.size() == 1 ); 255 // return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front(), true ); 256 assert( false ); 139 257 case For: 258 // { 259 // assert( branches.size() == 1 ); 260 261 // ForCtlExprNode *ctl = dynamic_cast<ForCtlExprNode *>( get_control() ); 262 // assert( ctl != 0 ); 263 264 // std::list<Statement *> init; 265 // if ( ctl->get_init() != 0 ) { 266 // buildList( ctl->get_init(), init ); 267 // } // if 268 269 // Expression *cond = 0; 270 // if ( ctl->get_condition() != 0 ) 271 // cond = notZeroExpr( maybeBuild<Expression>(ctl->get_condition()) ); 272 273 // Expression *incr = 0; 274 // if ( ctl->get_change() != 0 ) 275 // incr = maybeBuild<Expression>(ctl->get_change()); 276 277 // return new ForStmt( labs, init, cond, incr, branches.front() ); 278 // } 279 assert( false ); 140 280 case Goto: 281 // { 282 // if ( get_target() == "" ) { // computed goto 283 // assert( get_control() != 0 ); 284 // return new BranchStmt( labs, maybeBuild<Expression>(get_control()), BranchStmt::Goto ); 285 // } // if 286 287 // return new BranchStmt( labs, get_target(), BranchStmt::Goto ); 288 // } 289 assert( false ); 141 290 case Break: 291 // return new BranchStmt( labs, get_target(), BranchStmt::Break ); 292 assert( false ); 142 293 case Continue: 294 // return new BranchStmt( labs, get_target(), BranchStmt::Continue ); 295 assert( false ); 143 296 case Return: 144 297 case Throw : 298 // buildList( get_control(), exps ); 299 // if ( exps.size() ==0 ) 300 // return new ReturnStmt( labs, 0, type == Throw ); 301 // if ( exps.size() > 0 ) 302 // return new ReturnStmt( labs, exps.back(), type == Throw ); 303 assert( false ); 145 304 case Try: 305 { 306 assert( branches.size() >= 0 ); 307 CompoundStmt *tryBlock = dynamic_cast<CompoundStmt *>( branches.front()); 308 branches.pop_front(); 309 FinallyStmt *finallyBlock = 0; 310 if ( ( finallyBlock = dynamic_cast<FinallyStmt *>( branches.back())) ) { 311 branches.pop_back(); 312 } // if 313 return new TryStmt( labs, tryBlock, branches, finallyBlock ); 314 } 146 315 case Catch: 316 { 317 assert( branches.size() == 1 ); 318 319 return new CatchStmt( labs, maybeBuild< Declaration >( decl ), branches.front(), isCatchRest ); 320 } 147 321 case Finally: 322 { 323 assert( branches.size() == 1 ); 324 CompoundStmt *block = dynamic_cast<CompoundStmt *>( branches.front() ); 325 assert( block != 0 ); 326 327 return new FinallyStmt( labs, block ); 328 } 148 329 case Asm: 330 assert( false ); 149 331 default: 150 assert( false );332 // shouldn't be here 151 333 return 0; 152 334 } // switch … … 240 422 } 241 423 242 Statement *build_try( StatementNode *try_stmt, StatementNode *catch_stmt, StatementNode *finally_stmt ) {243 std::list<Statement *> branches;244 buildList<Statement, StatementNode>( catch_stmt, branches );245 CompoundStmt *tryBlock = dynamic_cast<CompoundStmt *>(maybeBuild<Statement>(try_stmt));246 assert( tryBlock );247 FinallyStmt *finallyBlock = dynamic_cast<FinallyStmt *>(maybeBuild<Statement>(finally_stmt) );248 return new TryStmt( noLabels, tryBlock, branches, finallyBlock );249 }250 Statement *build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny ) {251 std::list<Statement *> branches;252 buildList<Statement, StatementNode>( stmt, branches );253 assert( branches.size() == 1 );254 return new CatchStmt( noLabels, maybeBuild<Declaration>(decl), branches.front(), catchAny );255 }256 Statement *build_finally( StatementNode *stmt ) {257 std::list<Statement *> branches;258 buildList<Statement, StatementNode>( stmt, branches );259 assert( branches.size() == 1 );260 return new FinallyStmt( noLabels, dynamic_cast<CompoundStmt *>( branches.front() ) );261 }262 263 424 264 425 CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {} 426 427 CompoundStmtNode::CompoundStmtNode( const string *name_ ) : StatementNode( name_ ), first( 0 ), last( 0 ) {} 265 428 266 429 CompoundStmtNode::CompoundStmtNode( StatementNode *stmt ) : first( stmt ) { … … 278 441 void CompoundStmtNode::add_statement( StatementNode *stmt ) { 279 442 if ( stmt != 0 ) { 280 last->set_l ast( stmt );281 last = ( StatementNode *)( stmt->get_ next());443 last->set_link( stmt ); 444 last = ( StatementNode *)( stmt->get_link()); 282 445 } // if 283 446 } … … 304 467 305 468 306 AsmStmtNode::AsmStmtNode( bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) : 307 voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) { 308 type = Asm; 469 AsmStmtNode::AsmStmtNode( Type t, bool voltile, ConstantExpr *instruction, ExpressionNode *output, ExpressionNode *input, ExpressionNode *clobber, LabelNode *gotolabels ) : 470 StatementNode( t ), voltile( voltile ), instruction( instruction ), output( output ), input( input ), clobber( clobber ) { 309 471 if ( gotolabels ) { 310 472 this->gotolabels = gotolabels->get_labels(); … … 315 477 AsmStmtNode::~AsmStmtNode() { 316 478 delete output; delete input; delete clobber; 479 } 480 481 void AsmStmtNode::print( std::ostream &os, int indent ) const { 482 StatementNode::print( os, indent ); // print statement labels 483 os << string( indent + ParseNode::indent_by, ' ' ) << "volatile:" << voltile << endl; 484 if ( instruction ) { 485 os << string( indent + ParseNode::indent_by, ' ' ) << "Instruction:" << endl; 486 // instruction->printList( os, indent + 2 * ParseNode::indent_by ); 487 } // if 488 if ( output ) { 489 os << string( indent + ParseNode::indent_by, ' ' ) << "Output:" << endl; 490 output->printList( os, indent + 2 * ParseNode::indent_by ); 491 } // if 492 if ( input ) { 493 os << string( indent + ParseNode::indent_by, ' ' ) << "Input:" << endl; 494 input->printList( os, indent + 2 * ParseNode::indent_by ); 495 } // if 496 if ( clobber ) { 497 os << string( indent + ParseNode::indent_by, ' ' ) << "Clobber:" << endl; 498 // clobber->printList( os, indent + 2 * ParseNode::indent_by ); 499 } // if 500 if ( ! gotolabels.empty() ) { 501 os << string( indent + ParseNode::indent_by, ' ' ) << "Goto Labels:" << endl; 502 os << string( indent + 2 * ParseNode::indent_by, ' ' ); 503 for ( std::list<Label>::const_iterator i = gotolabels.begin();; ) { 504 os << *i; 505 i++; 506 if ( i == gotolabels.end() ) break; 507 os << ", "; 508 } 509 os << endl; 510 } // if 317 511 } 318 512 … … 334 528 } 335 529 336 // Statement *build_asm( bool voltile, ConstantExpr *instruction, ExpressionNode *output = 0, ExpressionNode *input = 0, ExpressionNode *clobber = 0, LabelNode *gotolabels = 0 ) {337 // std::list<Label> labs;338 339 // if ( ! get_labels().empty() ) {340 // std::back_insert_iterator< std::list<Label> > lab_it( labs );341 // copy( get_labels().begin(), get_labels().end(), lab_it );342 // } // if343 344 // std::list< Expression * > out, in;345 // std::list< ConstantExpr * > clob;346 // buildList( output, out );347 // buildList( input, in );348 // buildList( clobber, clob );349 // std::list< Label > gotolabs = gotolabels;350 // return new AsmStmt( labs, voltile, instruction, out, in, clob, gotolabs );351 // }352 353 530 // Local Variables: // 354 531 // tab-width: 4 //
Note:
See TracChangeset
for help on using the changeset viewer.