Changeset 9706554 for src/Parser/ExpressionNode.cc
- Timestamp:
- Aug 5, 2016, 12:06:21 PM (7 years ago)
- Branches:
- aaron-thesis, arm-eh, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, with_gc
- Children:
- 71a3593
- Parents:
- 51e076e
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r51e076e r9706554 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Aug 5 07:56:23201613 // Update Count : 3 7512 // Last Modified On : Fri Aug 5 11:39:25 2016 13 // Update Count : 391 14 14 // 15 15 … … 289 289 } 290 290 291 CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2 ):291 CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2 ): 292 292 function( f ), arguments( arg1 ) { 293 293 arguments->set_link( arg2 ); … … 369 369 } 370 370 371 Expression *build_opr1( OperatorNode::Type op, ExpressionNode *expr_node ) { 371 Expression *build_unary_val( OperatorNode::Type op, ExpressionNode *expr_node ) { 372 std::list<Expression *> args; 373 args.push_back( maybeBuild<Expression>(expr_node) ); 374 return new UntypedExpr( new NameExpr( opName[ op ] ), args ); 375 } 376 Expression *build_unary_ptr( OperatorNode::Type op, ExpressionNode *expr_node ) { 372 377 std::list<Expression *> args; 373 378 args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node) ) ); 374 379 return new UntypedExpr( new NameExpr( opName[ op ] ), args ); 375 380 } 376 Expression *build_ opr2( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {381 Expression *build_binary_val( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 377 382 std::list<Expression *> args; 378 383 args.push_back( maybeBuild<Expression>(expr_node1) ); … … 380 385 return new UntypedExpr( new NameExpr( opName[ op ] ), args ); 381 386 } 387 Expression *build_binary_ptr( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 388 std::list<Expression *> args; 389 args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node1) ) ); 390 args.push_back( maybeBuild<Expression>(expr_node2) ); 391 return new UntypedExpr( new NameExpr( opName[ op ] ), args ); 392 } 382 393 383 394 Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) { … … 387 398 Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) { 388 399 return new CommaExpr( maybeBuild<Expression>(expr_node1), maybeBuild<Expression>(expr_node2) ); 400 } 401 402 Expression *build_attr( VarRefNode *var, ExpressionNode * expr ) { 403 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( expr ) ) { 404 return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType() ); 405 } else { 406 return new AttrExpr( maybeBuild<Expression>(var), maybeBuild<Expression>(expr) ); 407 } // if 408 } 409 410 Expression *build_tuple( ExpressionNode * expr ) { 411 TupleExpr *ret = new TupleExpr(); 412 buildList( expr, ret->get_exprs() ); 413 return ret; 414 } 415 416 Expression *build_func( ExpressionNode * function, ExpressionNode * expr ) { 417 std::list<Expression *> args; 418 419 buildList( expr, args ); 420 return new UntypedExpr( maybeBuild<Expression>(function), args, nullptr ); 389 421 } 390 422 … … 406 438 } // if 407 439 408 switch ( op->get_type() ) { 409 case OperatorNode::Assign: 410 case OperatorNode::MulAssn: 411 case OperatorNode::DivAssn: 412 case OperatorNode::ModAssn: 413 case OperatorNode::PlusAssn: 414 case OperatorNode::MinusAssn: 415 case OperatorNode::LSAssn: 416 case OperatorNode::RSAssn: 417 case OperatorNode::AndAssn: 418 case OperatorNode::ERAssn: 419 case OperatorNode::OrAssn: 420 assert( ! args.empty() ); 421 args.front() = new AddressExpr( args.front() ); 422 case OperatorNode::UnPlus: 423 case OperatorNode::UnMinus: 424 case OperatorNode::PointTo: 425 case OperatorNode::Neg: 426 case OperatorNode::BitNeg: 427 case OperatorNode::LabelAddress: 428 return new UntypedExpr( new NameExpr( opName[ op->get_type() ] ), args ); 429 430 case OperatorNode::Attr: 431 { 432 VarRefNode *var = dynamic_cast<VarRefNode *>( get_args() ); 433 assert( var ); 434 if ( ! get_args()->get_link() ) { 435 return new AttrExpr( maybeBuild<Expression>(var), ( Expression*)0); 436 } else if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()->get_link() ) ) { 437 return new AttrExpr( maybeBuild<Expression>(var), arg->get_decl()->buildType() ); 438 } else { 439 return new AttrExpr( maybeBuild<Expression>(var), args.back() ); 440 } // if 441 } 442 case OperatorNode::Cond: 443 { 444 assert( args.size() == 3); 445 std::list< Expression * >::const_iterator i = args.begin(); 446 Expression *arg1 = notZeroExpr( *i++ ); 447 Expression *arg2 = *i++; 448 Expression *arg3 = *i++; 449 return new ConditionalExpr( arg1, arg2, arg3 ); 450 } 451 case OperatorNode::NCond: 452 throw UnimplementedError( "GNU 2-argument conditional expression" ); 453 // Tuples 454 case OperatorNode::TupleC: 455 { 456 TupleExpr *ret = new TupleExpr(); 457 std::copy( args.begin(), args.end(), back_inserter( ret->get_exprs() ) ); 458 return ret; 459 } 460 default: 461 assert( ((void)"CompositeExprNode::build", false) ); 462 return 0; 463 } // switch 440 assert( ((void)"CompositeExprNode::build", false) ); 441 return nullptr; 464 442 } 465 443
Note: See TracChangeset
for help on using the changeset viewer.