Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/StatementNode.cc

    r777bfcf r8cc5cb0  
    1010// Created On       : Sat May 16 14:59:41 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Sun Aug 14 13:10:54 2016
    13 // Update Count     : 288
     12// Last Modified On : Thu Aug 11 16:19:45 2016
     13// Update Count     : 210
    1414//
    1515
     
    3434};
    3535
    36 StatementNode::StatementNode() : ParseNode(), labels( 0 ), decl( 0 ) {}
    37 
    38 StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), labels( 0 ) {
    39         assert( false );
     36StatementNode::StatementNode() : ParseNode(), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
     37
     38StatementNode::StatementNode( const string *name ) : ParseNode( name ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), decl( 0 ), isCatchRest ( false ) {}
     39
     40StatementNode::StatementNode( DeclarationNode *decl ) : type( Decl ), control( 0 ), block( 0 ), labels( 0 ), target( 0 ), isCatchRest ( false ) {
    4041        if ( decl ) {
    4142                if ( DeclarationNode *agg = decl->extractAggregate() ) {
     
    4546                        nextStmt->decl = decl;
    4647                        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() ) ) );
    4950                                decl->set_next( 0 );
    5051                        } // if
    5152                } 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() ) );
    5455                                decl->set_next( 0 );
    5556                        } // if
     
    5960}
    6061
    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) );
     62StatementNode::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
     66StatementNode::StatementNode( Type t, string *target ) : type( t ), control( 0 ), block( 0 ), labels( 0 ), target( target ), decl( 0 ), isCatchRest ( false ) {}
     67
     68StatementNode::~StatementNode() {
     69        delete control;
     70        delete block;
     71        delete target;
     72        delete decl;
     73}
     74
     75StatementNode * 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
     83std::string StatementNode::get_target() const{
     84        if ( target )
     85                return *target;
     86
     87        return string("");
     88}
     89
     90StatementNode * StatementNode::clone() const {
     91        StatementNode *newnode = new StatementNode( type, maybeClone( control ), maybeClone( block ) );
     92        if ( target ) {
     93                newnode->target = new string( *target );
    8194        } 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;
    9399}
    94100
     
    101107}
    102108
     109StatementNode *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
    103119StatementNode *StatementNode::append_last_case( StatementNode *stmt ) {
    104120        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
    105131        return this;
    106132}
     
    108134StatementNode *StatementNode2::append_last_case( StatementNode *stmt ) {
    109135        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() ) {
    112137                StatementNode2 *node = dynamic_cast<StatementNode2 *>(curr);
    113138                assert( node );
     
    115140                prev = curr;
    116141        } // for
    117         // conver from StatementNode list to Statement list
    118142        StatementNode2 *node = dynamic_cast<StatementNode2 *>(prev);
    119143        std::list<Statement *> stmts;
    120144        buildList( stmt, stmts );
    121         // splice any new Statements to end of currents Statements
    122         CaseStmt * caseStmt = dynamic_cast<CaseStmt *>(node->stmt);
     145        CaseStmt * caseStmt;
     146        caseStmt = dynamic_cast<CaseStmt *>(node->stmt);
    123147        caseStmt->get_statements().splice( caseStmt->get_statements().end(), stmts );
    124148        return this;
    125149}
    126150
    127 Statement *StatementNode::build() const {
     151void 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
    128161        switch ( type ) {
    129162          case Decl:
    130                 return new DeclStmt( noLabels, maybeBuild< Declaration >( decl ) );
    131                 assert( false );
     163                decl->print( os, indent );
     164                break;
    132165          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
     200Statement *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 );
    133226          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 );
    134240          case Switch:
     241                // return new SwitchStmt( labs, maybeBuild<Expression>(get_control()), branches );
     242                assert( false );
    135243          case Case:
     244                //return new CaseStmt( labs, maybeBuild<Expression>(get_control() ), branches );
     245                assert( false );
    136246          case Default:
     247                //return new CaseStmt( labs, 0, branches, true );
     248                assert( false );
    137249          case While:
     250                // assert( branches.size() == 1 );
     251                // return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front() );
     252                assert( false );
    138253          case Do:
     254                // assert( branches.size() == 1 );
     255                // return new WhileStmt( labs, notZeroExpr( maybeBuild<Expression>(get_control()) ), branches.front(), true );
     256                assert( false );
    139257          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 );
    140280          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 );
    141290          case Break:
     291                // return new BranchStmt( labs, get_target(), BranchStmt::Break );
     292                assert( false );
    142293          case Continue:
     294                // return new BranchStmt( labs, get_target(), BranchStmt::Continue );
     295                assert( false );
    143296          case Return:
    144297          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 );
    145304          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                }
    146315          case Catch:
     316                {
     317                        assert( branches.size() == 1 );
     318
     319                        return new CatchStmt( labs, maybeBuild< Declaration >( decl ), branches.front(), isCatchRest );
     320                }
    147321          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                }
    148329          case Asm:
     330                assert( false );
    149331          default:
    150                 assert( false );
     332                // shouldn't be here
    151333                return 0;
    152334        } // switch
     
    240422}
    241423
    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 
    263424
    264425CompoundStmtNode::CompoundStmtNode() : first( 0 ), last( 0 ) {}
     426
     427CompoundStmtNode::CompoundStmtNode( const string *name_ ) : StatementNode( name_ ), first( 0 ), last( 0 ) {}
    265428
    266429CompoundStmtNode::CompoundStmtNode( StatementNode *stmt ) : first( stmt ) {
     
    278441void CompoundStmtNode::add_statement( StatementNode *stmt ) {
    279442        if ( stmt != 0 ) {
    280                 last->set_last( stmt );
    281                 last = ( StatementNode *)( stmt->get_next());
     443                last->set_link( stmt );
     444                last = ( StatementNode *)( stmt->get_link());
    282445        } // if
    283446}
     
    304467
    305468
    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;
     469AsmStmtNode::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 ) {
    309471        if ( gotolabels ) {
    310472                this->gotolabels = gotolabels->get_labels();
     
    315477AsmStmtNode::~AsmStmtNode() {
    316478        delete output; delete input; delete clobber;
     479}
     480
     481void 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
    317511}
    318512
     
    334528}
    335529
    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 //      } // if
    343 
    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 
    353530// Local Variables: //
    354531// tab-width: 4 //
Note: See TracChangeset for help on using the changeset viewer.