Ignore:
Timestamp:
Aug 5, 2016, 12:06:21 PM (8 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:
71a3593
Parents:
51e076e
Message:

even more refactoring of parser code

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r51e076e r9706554  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Aug  5 07:56:23 2016
    13 // Update Count     : 375
     12// Last Modified On : Fri Aug  5 11:39:25 2016
     13// Update Count     : 391
    1414//
    1515
     
    289289}
    290290
    291 CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2):
     291CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2 ):
    292292        function( f ), arguments( arg1 ) {
    293293        arguments->set_link( arg2 );
     
    369369}
    370370
    371 Expression *build_opr1( OperatorNode::Type op, ExpressionNode *expr_node ) {
     371Expression *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}
     376Expression *build_unary_ptr( OperatorNode::Type op, ExpressionNode *expr_node ) {
    372377        std::list<Expression *> args;
    373378        args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node) ) );
    374379        return new UntypedExpr( new NameExpr( opName[ op ] ), args );
    375380}
    376 Expression *build_opr2( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
     381Expression *build_binary_val( OperatorNode::Type op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
    377382        std::list<Expression *> args;
    378383        args.push_back( maybeBuild<Expression>(expr_node1) );
     
    380385        return new UntypedExpr( new NameExpr( opName[ op ] ), args );
    381386}
     387Expression *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}
    382393
    383394Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {
     
    387398Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
    388399        return new CommaExpr( maybeBuild<Expression>(expr_node1), maybeBuild<Expression>(expr_node2) );
     400}
     401
     402Expression *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
     410Expression *build_tuple( ExpressionNode * expr ) {
     411        TupleExpr *ret = new TupleExpr();
     412        buildList( expr, ret->get_exprs() );
     413        return ret;
     414}
     415
     416Expression *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 );
    389421}
    390422
     
    406438        } // if
    407439
    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;
    464442}
    465443
Note: See TracChangeset for help on using the changeset viewer.