Changeset 2a301ff for src/Parser/StatementNode.cc
- Timestamp:
- Aug 31, 2023, 11:31:15 PM (13 months ago)
- 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. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/StatementNode.cc
r92355883 r2a301ff 10 10 // Author : Rodolfo G. Esteves 11 11 // Created On : Sat May 16 14:59:41 2015 12 // Last Modified By : Andrew Beach13 // Last Modified On : Tue Apr 11 10:16:00202314 // Update Count : 42 812 // Last Modified By : Peter A. Buhr 13 // Last Modified On : Fri Aug 11 11:44:15 2023 14 // Update Count : 429 15 15 // 16 16 … … 361 361 362 362 ast::WaitUntilStmt::ClauseNode * build_waituntil_clause( const CodeLocation & loc, ExpressionNode * when, ExpressionNode * targetExpr, StatementNode * stmt ) { 363 364 365 366 367 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 ); 368 368 } 369 369 ast::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 ); 381 374 } 382 375 383 376 ast::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; 449 441 } 450 442
Note: See TracChangeset
for help on using the changeset viewer.