Changeset 064e3ff for src/Parser/ExpressionNode.cc
- Timestamp:
- Aug 4, 2016, 5:26:08 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, 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:
- b87e2b60
- Parents:
- 76e8c55
- File:
-
- 1 edited
-
src/Parser/ExpressionNode.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r76e8c55 r064e3ff 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : T ue Aug 2 15:10:23 201613 // Update Count : 3 2212 // Last Modified On : Thu Aug 4 16:11:23 2016 13 // Update Count : 338 14 14 // 15 15 … … 258 258 OperatorNode::~OperatorNode() {} 259 259 260 OperatorNode::Type OperatorNode::get_type( void ) const {260 OperatorNode::Type OperatorNode::get_type( void ) const { 261 261 return type; 262 262 } … … 311 311 } 312 312 313 #include "Common/utility.h" 313 314 Expression *build_cast( TypeValueNode * arg, ExpressionNode *expr_node ) { 315 DeclarationNode *decl_node = arg->get_decl(); 316 317 Type *targetType = decl_node->buildType(); 318 if ( dynamic_cast< VoidType* >( targetType ) ) { 319 delete targetType; 320 return new CastExpr( maybeBuild<Expression>(expr_node) ); 321 } else { 322 return new CastExpr( maybeBuild<Expression>(expr_node), targetType ); 323 } // if 324 } 325 326 Expression *build_fieldSel( ExpressionNode *expr_node, VarRefNode *member ) { 327 NameExpr* memberExpr = dynamic_cast<NameExpr*> ( maybeBuild<Expression>( member) ); 328 assert( memberExpr ); 329 UntypedMemberExpr *ret = new UntypedMemberExpr( memberExpr->get_name(), maybeBuild<Expression>(expr_node) ); 330 delete member; 331 return ret; 332 } 333 334 Expression *build_pfieldSel( ExpressionNode *expr_node, VarRefNode *member ) { 335 NameExpr* memberExpr = dynamic_cast<NameExpr*> ( maybeBuild<Expression>( member) ); 336 assert( memberExpr ); 337 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) ); 338 deref->get_args().push_back( maybeBuild<Expression>(expr_node) ); 339 UntypedMemberExpr *ret = new UntypedMemberExpr( memberExpr->get_name(), deref ); 340 delete member; 341 return ret; 342 } 343 344 Expression *build_addressOf( ExpressionNode *expr_node ) { 345 return new AddressExpr( maybeBuild<Expression>(expr_node) ); 346 } 347 Expression *build_sizeOf( ExpressionNode *expr_node ) { 348 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( expr_node ) ) { 349 return new SizeofExpr( arg->get_decl()->buildType() ); 350 } else { 351 return new SizeofExpr( maybeBuild<Expression>(expr_node) ); 352 } // if 353 } 354 Expression *build_alignOf( ExpressionNode *expr_node ) { 355 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( expr_node ) ) { 356 return new AlignofExpr( arg->get_decl()->buildType() ); 357 } else { 358 return new AlignofExpr( maybeBuild<Expression>(expr_node) ); 359 } // if 360 } 361 Expression *build_offsetOf( TypeValueNode * arg, VarRefNode *member ) { 362 NameExpr *memberExpr = dynamic_cast<NameExpr *>( maybeBuild<Expression>( member ) ); 363 assert( memberExpr ); 364 return new UntypedOffsetofExpr( arg->get_decl()->buildType(), memberExpr->get_name() ); 365 } 366 367 CompositeExprNode2::CompositeExprNode2( Expression *expr ) : expr( expr ) {} 368 CompositeExprNode2::CompositeExprNode2( const CompositeExprNode2 &other ) : expr( other.expr->clone() ) {} 369 CompositeExprNode2::~CompositeExprNode2() { delete expr; } 370 void CompositeExprNode2::print( std::ostream &, int indent ) const { assert( false ); } 371 void CompositeExprNode2::printOneLine( std::ostream &, int indent ) const { assert( false ); } 372 314 373 315 374 Expression *CompositeExprNode::build() const { … … 388 447 case OperatorNode::LabelAddress: 389 448 return new UntypedExpr( new NameExpr( opName[ op->get_type() ] ), args ); 390 case OperatorNode::AddressOf:391 assert( args.size() == 1 );392 assert( args.front() );393 394 return new AddressExpr( args.front() );395 case OperatorNode::Cast:396 {397 TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args());398 assert( arg );399 400 DeclarationNode *decl_node = arg->get_decl();401 ExpressionNode *expr_node = dynamic_cast<ExpressionNode *>( arg->get_link());402 403 Type *targetType = decl_node->buildType();404 if ( dynamic_cast< VoidType* >( targetType ) ) {405 delete targetType;406 return new CastExpr( maybeBuild<Expression>(expr_node), maybeBuild< Expression >( get_argName() ) );407 } else {408 return new CastExpr( maybeBuild<Expression>(expr_node),targetType, maybeBuild< Expression >( get_argName() ) );409 } // if410 }411 case OperatorNode::FieldSel:412 {413 assert( args.size() == 2 );414 415 NameExpr *member = dynamic_cast<NameExpr *>( args.back());416 // TupleExpr *memberTup = dynamic_cast<TupleExpr *>( args.back());417 418 if ( member != 0 ) {419 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), args.front());420 delete member;421 return ret;422 /* else if ( memberTup != 0 )423 {424 UntypedMemberExpr *ret = new UntypedMemberExpr( memberTup->get_name(), args.front());425 delete member;426 return ret;427 } */428 } else429 assert( false );430 }431 case OperatorNode::PFieldSel:432 {433 assert( args.size() == 2 );434 435 NameExpr *member = dynamic_cast<NameExpr *>( args.back()); // modify for Tuples xxx436 assert( member != 0 );437 438 UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );439 deref->get_args().push_back( args.front() );440 441 UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );442 delete member;443 return ret;444 }445 case OperatorNode::SizeOf:446 {447 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()) ) {448 return new SizeofExpr( arg->get_decl()->buildType());449 } else {450 return new SizeofExpr( args.front());451 } // if452 }453 case OperatorNode::AlignOf:454 {455 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args()) ) {456 return new AlignofExpr( arg->get_decl()->buildType());457 } else {458 return new AlignofExpr( args.front());459 } // if460 }461 case OperatorNode::OffsetOf:462 {463 assert( args.size() == 2 );464 465 if ( TypeValueNode * arg = dynamic_cast<TypeValueNode *>( get_args() ) ) {466 NameExpr *member = dynamic_cast<NameExpr *>( args.back() );467 assert( member != 0 );468 469 return new UntypedOffsetofExpr( arg->get_decl()->buildType(), member->get_name() );470 } else assert( false );471 }472 449 case OperatorNode::Attr: 473 450 { … … 774 751 } 775 752 776 777 753 ExpressionNode *flattenCommas( ExpressionNode *list ) { 778 754 if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) {
Note:
See TracChangeset
for help on using the changeset viewer.