Ignore:
Timestamp:
Aug 4, 2016, 5:26:08 PM (9 years ago)
Author:
Peter A. Buhr <pabuhr@…>
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
Message:

add new type for ranges and refactor parser code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r76e8c55 r064e3ff  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Aug  2 15:10:23 2016
    13 // Update Count     : 322
     12// Last Modified On : Thu Aug  4 16:11:23 2016
     13// Update Count     : 338
    1414//
    1515
     
    258258OperatorNode::~OperatorNode() {}
    259259
    260 OperatorNode::Type OperatorNode::get_type( void ) const{
     260OperatorNode::Type OperatorNode::get_type( void ) const {
    261261        return type;
    262262}
     
    311311}
    312312
    313 #include "Common/utility.h"
     313
     314Expression *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
     326Expression *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
     334Expression *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
     344Expression *build_addressOf( ExpressionNode *expr_node ) {
     345                return new AddressExpr( maybeBuild<Expression>(expr_node) );
     346}
     347Expression *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}
     354Expression *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}
     361Expression *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
     367CompositeExprNode2::CompositeExprNode2( Expression *expr ) : expr( expr ) {}
     368CompositeExprNode2::CompositeExprNode2( const CompositeExprNode2 &other ) : expr( other.expr->clone() ) {}
     369CompositeExprNode2::~CompositeExprNode2() { delete expr; }
     370void CompositeExprNode2::print( std::ostream &, int indent ) const { assert( false ); }
     371void CompositeExprNode2::printOneLine( std::ostream &, int indent ) const { assert( false ); }
     372
    314373
    315374Expression *CompositeExprNode::build() const {
     
    388447          case OperatorNode::LabelAddress:
    389448                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                         } // if
    410                 }
    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                         } else
    429                                 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   xxx
    436                         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                         } // if
    452                 }
    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                         } // if
    460                 }
    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                 }
    472449          case OperatorNode::Attr:
    473450                {
     
    774751}
    775752
    776 
    777753ExpressionNode *flattenCommas( ExpressionNode *list ) {
    778754        if ( CompositeExprNode *composite = dynamic_cast< CompositeExprNode * >( list ) ) {
Note: See TracChangeset for help on using the changeset viewer.