Ignore:
Timestamp:
Aug 31, 2023, 11:31:15 PM (13 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
950c58e
Parents:
92355883 (diff), 686912c (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Resolve conflict

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/StatementNode.cc

    r92355883 r2a301ff  
    1010// Author           : Rodolfo G. Esteves
    1111// Created On       : Sat May 16 14:59:41 2015
    12 // Last Modified By : Andrew Beach
    13 // Last Modified On : Tue Apr 11 10:16:00 2023
    14 // Update Count     : 428
     12// Last Modified By : Peter A. Buhr
     13// Last Modified On : Fri Aug 11 11:44:15 2023
     14// Update Count     : 429
    1515//
    1616
     
    361361
    362362ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation & loc, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt ) {
    363     ast::WhenClause * clause = new ast::WhenClause( loc );
    364     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    365     clause->stmt = maybeMoveBuild( stmt );
    366     clause->target = maybeMoveBuild( targetExpr );
    367     return new ast::WaitUntilStmt::ClauseNode( clause );
     363        ast::WhenClause * clause = new ast::WhenClause( loc );
     364        clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
     365        clause->stmt = maybeMoveBuild( stmt );
     366        clause->target = maybeMoveBuild( targetExpr );
     367        return new ast::WaitUntilStmt::ClauseNode( clause );
    368368}
    369369ast::WaitUntilStmt::ClauseNode * build_waituntil_else( const CodeLocation & loc, ExpressionNode * when, StatementNode * stmt ) {
    370     ast::WhenClause * clause = new ast::WhenClause( loc );
    371     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    372     clause->stmt = maybeMoveBuild( stmt );
    373     return new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::ELSE, clause );
    374 }
    375 ast::WaitUntilStmt::ClauseNode * build_waituntil_timeout( const CodeLocation & loc, ExpressionNode * when, ExpressionNode * timeout, StatementNode * stmt ) {
    376     ast::WhenClause * clause = new ast::WhenClause( loc );
    377     clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
    378     clause->stmt = maybeMoveBuild( stmt );
    379     clause->target = maybeMoveBuild( timeout );
    380     return new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::TIMEOUT, clause );
     370        ast::WhenClause * clause = new ast::WhenClause( loc );
     371        clause->when_cond = notZeroExpr( maybeMoveBuild( when ) );
     372        clause->stmt = maybeMoveBuild( stmt );
     373        return new ast::WaitUntilStmt::ClauseNode( ast::WaitUntilStmt::ClauseNode::Op::ELSE, clause );
    381374}
    382375
    383376ast::WaitUntilStmt * build_waituntil_stmt( const CodeLocation & loc, ast::WaitUntilStmt::ClauseNode * root ) {
    384     ast::WaitUntilStmt * retStmt = new ast::WaitUntilStmt( loc );
    385     retStmt->predicateTree = root;
    386    
    387     // iterative tree traversal
    388     std::vector<ast::WaitUntilStmt::ClauseNode *> nodeStack; // stack needed for iterative traversal
    389     ast::WaitUntilStmt::ClauseNode * currNode = nullptr;
    390     ast::WaitUntilStmt::ClauseNode * lastInternalNode = nullptr;
    391     ast::WaitUntilStmt::ClauseNode * cleanup = nullptr; // used to cleanup removed else/timeout
    392     nodeStack.push_back(root);
    393 
    394     do {
    395         currNode = nodeStack.back();
    396         nodeStack.pop_back(); // remove node since it will be processed
    397 
    398         switch (currNode->op) {
    399             case ast::WaitUntilStmt::ClauseNode::LEAF:
    400                 retStmt->clauses.push_back(currNode->leaf);
    401                 break;
    402             case ast::WaitUntilStmt::ClauseNode::ELSE:
    403                 retStmt->else_stmt = currNode->leaf->stmt
    404                     ? ast::deepCopy( currNode->leaf->stmt )
    405                     : nullptr;
    406                
    407                 retStmt->else_cond = currNode->leaf->when_cond
    408                     ? ast::deepCopy( currNode->leaf->when_cond )
    409                     : nullptr;
    410 
    411                 delete currNode->leaf;
    412                 break;
    413             case ast::WaitUntilStmt::ClauseNode::TIMEOUT:
    414                 retStmt->timeout_time = currNode->leaf->target
    415                     ? ast::deepCopy( currNode->leaf->target )
    416                     : nullptr;
    417                 retStmt->timeout_stmt = currNode->leaf->stmt
    418                     ? ast::deepCopy( currNode->leaf->stmt )
    419                     : nullptr;
    420                 retStmt->timeout_cond = currNode->leaf->when_cond
    421                     ? ast::deepCopy( currNode->leaf->when_cond )
    422                     : nullptr;
    423 
    424                 delete currNode->leaf;
    425                 break;
    426             default:
    427                 nodeStack.push_back( currNode->right ); // process right after left
    428                 nodeStack.push_back( currNode->left );
    429 
    430                 // Cut else/timeout out of the tree
    431                 if ( currNode->op == ast::WaitUntilStmt::ClauseNode::LEFT_OR ) {
    432                     if ( lastInternalNode )
    433                         lastInternalNode->right = currNode->left;
    434                     else    // if not set then root is LEFT_OR
    435                         retStmt->predicateTree = currNode->left;
    436    
    437                     currNode->left = nullptr;
    438                     cleanup = currNode;
    439                 }
    440                
    441                 lastInternalNode = currNode;
    442                 break;
    443         }
    444     } while ( !nodeStack.empty() );
    445 
    446     if ( cleanup ) delete cleanup;
    447 
    448     return retStmt;
     377        ast::WaitUntilStmt * retStmt = new ast::WaitUntilStmt( loc );
     378        retStmt->predicateTree = root;
     379
     380        // iterative tree traversal
     381        std::vector<ast::WaitUntilStmt::ClauseNode *> nodeStack; // stack needed for iterative traversal
     382        ast::WaitUntilStmt::ClauseNode * currNode = nullptr;
     383        ast::WaitUntilStmt::ClauseNode * lastInternalNode = nullptr;
     384        ast::WaitUntilStmt::ClauseNode * cleanup = nullptr; // used to cleanup removed else/timeout
     385        nodeStack.push_back(root);
     386
     387        do {
     388                currNode = nodeStack.back();
     389                nodeStack.pop_back(); // remove node since it will be processed
     390
     391                switch (currNode->op) {
     392                case ast::WaitUntilStmt::ClauseNode::LEAF:
     393                        retStmt->clauses.push_back(currNode->leaf);
     394                        break;
     395                case ast::WaitUntilStmt::ClauseNode::ELSE:
     396                        retStmt->else_stmt = currNode->leaf->stmt
     397                                ? ast::deepCopy( currNode->leaf->stmt )
     398                                : nullptr;
     399                        retStmt->else_cond = currNode->leaf->when_cond
     400                                ? ast::deepCopy( currNode->leaf->when_cond )
     401                                : nullptr;
     402
     403                        delete currNode->leaf;
     404                        break;
     405                case ast::WaitUntilStmt::ClauseNode::TIMEOUT:
     406                        retStmt->timeout_time = currNode->leaf->target
     407                                ? ast::deepCopy( currNode->leaf->target )
     408                                : nullptr;
     409                        retStmt->timeout_stmt = currNode->leaf->stmt
     410                                ? ast::deepCopy( currNode->leaf->stmt )
     411                                : nullptr;
     412                        retStmt->timeout_cond = currNode->leaf->when_cond
     413                                ? ast::deepCopy( currNode->leaf->when_cond )
     414                                : nullptr;
     415
     416                        delete currNode->leaf;
     417                        break;
     418                default:
     419                        nodeStack.push_back( currNode->right ); // process right after left
     420                        nodeStack.push_back( currNode->left );
     421
     422                        // Cut else/timeout out of the tree
     423                        if ( currNode->op == ast::WaitUntilStmt::ClauseNode::LEFT_OR ) {
     424                                if ( lastInternalNode )
     425                                        lastInternalNode->right = currNode->left;
     426                                else // if not set then root is LEFT_OR
     427                                        retStmt->predicateTree = currNode->left;
     428
     429                                currNode->left = nullptr;
     430                                cleanup = currNode;
     431                        }
     432
     433                        lastInternalNode = currNode;
     434                        break;
     435                }
     436        } while ( !nodeStack.empty() );
     437
     438        if ( cleanup ) delete cleanup;
     439
     440        return retStmt;
    449441}
    450442
Note: See TracChangeset for help on using the changeset viewer.