Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    ra839867 r2f22cc4  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Aug 25 21:39:40 2016
    13 // Update Count     : 503
     12// Last Modified On : Wed Aug 10 11:07:38 2016
     13// Update Count     : 486
    1414//
    1515
     
    3232using namespace std;
    3333
    34 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.get_name() ), extension( other.extension ) {}
     34ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ), extension( other.extension ) {}
    3535
    3636//##############################################################################
     
    5757static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
    5858
    59 Expression *build_constantInteger( const std::string & str ) {
     59Expression *build_constantInteger( std::string & str ) {
    6060        static const BasicType::Kind kind[2][3] = {
    6161                { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
     
    120120        } // if
    121121
    122         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str ) );
    123         delete &str;                                                                            // created by lex
    124         return ret;
     122        return new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[Unsigned][size] ), str ) );
    125123} // build_constantInteger
    126124
    127 Expression *build_constantFloat( const std::string & str ) {
     125Expression *build_constantFloat( std::string & str ) {
    128126        static const BasicType::Kind kind[2][3] = {
    129127                { BasicType::Float, BasicType::Double, BasicType::LongDouble },
     
    152150        } // if
    153151
    154         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str ) );
    155         delete &str;                                                                            // created by lex
    156         return ret;
     152        return new ConstantExpr( Constant( new BasicType( emptyQualifiers, kind[complx][size] ), str ) );
    157153} // build_constantFloat
    158154
    159 Expression *build_constantChar( const std::string & str ) {
    160         Expression * ret = new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str ) );
    161         delete &str;                                                                            // created by lex
    162         return ret;
     155Expression *build_constantChar( std::string & str ) {
     156        return new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::Char ), str ) );
    163157} // build_constantChar
    164158
    165 ConstantExpr *build_constantStr( const std::string & str ) {
     159ConstantExpr *build_constantStr( std::string & str ) {
    166160        // string should probably be a primitive type
    167161        ArrayType *at = new ArrayType( emptyQualifiers, new BasicType( emptyQualifiers, BasicType::Char ),
     
    169163                                                                                        toString( str.size()+1-2 ) ) ),  // +1 for '\0' and -2 for '"'
    170164                                                                   false, false );
    171         ConstantExpr * ret = new ConstantExpr( Constant( at, str ) );
    172         delete &str;                                                                            // created by lex
    173         return ret;
     165        return new ConstantExpr( Constant( at, str ) );
    174166} // build_constantStr
    175167
     168//##############################################################################
     169
    176170NameExpr * build_varref( const string *name, bool labelp ) {
    177         NameExpr *expr = new NameExpr( *name, nullptr );
    178         delete name;
    179         return expr;
    180 }
     171        return new NameExpr( *name, nullptr );
     172}
     173
     174//##############################################################################
    181175
    182176static const char *OperName[] = {
     
    184178        "SizeOf", "AlignOf", "OffsetOf", "?+?", "?-?", "?*?", "?/?", "?%?", "||", "&&",
    185179        "?|?", "?&?", "?^?", "Cast", "?<<?", "?>>?", "?<?", "?>?", "?<=?", "?>=?", "?==?", "?!=?",
    186         "?=?", "?@=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
     180        "?=?", "?*=?", "?/=?", "?%=?", "?+=?", "?-=?", "?<<=?", "?>>=?", "?&=?", "?^=?", "?|=?",
    187181        "?[?]", "...",
    188182        // monadic
     
    190184};
    191185
     186//##############################################################################
     187
    192188Expression *build_cast( DeclarationNode *decl_node, ExpressionNode *expr_node ) {
    193         Type *targetType = maybeMoveBuildType( decl_node );
     189        Type *targetType = decl_node->buildType();
    194190        if ( dynamic_cast< VoidType * >( targetType ) ) {
    195191                delete targetType;
    196                 return new CastExpr( maybeMoveBuild< Expression >(expr_node) );
     192                return new CastExpr( maybeBuild<Expression>(expr_node) );
    197193        } else {
    198                 return new CastExpr( maybeMoveBuild< Expression >(expr_node), targetType );
     194                return new CastExpr( maybeBuild<Expression>(expr_node), targetType );
    199195        } // if
    200196}
    201197
    202198Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) {
    203         UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeMoveBuild< Expression >(expr_node) );
     199        UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeBuild<Expression>(expr_node) );
    204200        delete member;
    205201        return ret;
     
    208204Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) {
    209205        UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
    210         deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) );
     206        deref->get_args().push_back( maybeBuild<Expression>(expr_node) );
    211207        UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );
    212208        delete member;
     
    215211
    216212Expression *build_addressOf( ExpressionNode *expr_node ) {
    217                 return new AddressExpr( maybeMoveBuild< Expression >(expr_node) );
     213                return new AddressExpr( maybeBuild<Expression>(expr_node) );
    218214}
    219215Expression *build_sizeOfexpr( ExpressionNode *expr_node ) {
    220         return new SizeofExpr( maybeMoveBuild< Expression >(expr_node) );
     216        return new SizeofExpr( maybeBuild<Expression>(expr_node) );
    221217}
    222218Expression *build_sizeOftype( DeclarationNode *decl_node ) {
    223         return new SizeofExpr( maybeMoveBuildType( decl_node ) );
     219        return new SizeofExpr( decl_node->buildType() );
    224220}
    225221Expression *build_alignOfexpr( ExpressionNode *expr_node ) {
    226         return new AlignofExpr( maybeMoveBuild< Expression >(expr_node) );
     222        return new AlignofExpr( maybeBuild<Expression>(expr_node) );
    227223}
    228224Expression *build_alignOftype( DeclarationNode *decl_node ) {
    229         return new AlignofExpr( maybeMoveBuildType( decl_node) );
     225        return new AlignofExpr( decl_node->buildType() );
    230226}
    231227Expression *build_offsetOf( DeclarationNode *decl_node, NameExpr *member ) {
    232         Expression* ret = new UntypedOffsetofExpr( maybeMoveBuildType( decl_node ), member->get_name() );
    233         delete member;
    234         return ret;
     228        return new UntypedOffsetofExpr( decl_node->buildType(), member->get_name() );
    235229}
    236230
    237231Expression *build_and_or( ExpressionNode *expr_node1, ExpressionNode *expr_node2, bool kind ) {
    238         return new LogicalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), notZeroExpr( maybeMoveBuild< Expression >(expr_node2) ), kind );
     232        return new LogicalExpr( notZeroExpr( maybeBuild<Expression>(expr_node1) ), notZeroExpr( maybeBuild<Expression>(expr_node2) ), kind );
    239233}
    240234
    241235Expression *build_unary_val( OperKinds op, ExpressionNode *expr_node ) {
    242         std::list< Expression * > args;
    243         args.push_back( maybeMoveBuild< Expression >(expr_node) );
     236        std::list<Expression *> args;
     237        args.push_back( maybeBuild<Expression>(expr_node) );
    244238        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    245239}
    246240Expression *build_unary_ptr( OperKinds op, ExpressionNode *expr_node ) {
    247         std::list< Expression * > args;
    248         args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node) ) );
     241        std::list<Expression *> args;
     242        args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node) ) );
    249243        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    250244}
    251245Expression *build_binary_val( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
    252         std::list< Expression * > args;
    253         args.push_back( maybeMoveBuild< Expression >(expr_node1) );
    254         args.push_back( maybeMoveBuild< Expression >(expr_node2) );
     246        std::list<Expression *> args;
     247        args.push_back( maybeBuild<Expression>(expr_node1) );
     248        args.push_back( maybeBuild<Expression>(expr_node2) );
    255249        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    256250}
    257251Expression *build_binary_ptr( OperKinds op, ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
    258         std::list< Expression * > args;
    259         args.push_back( new AddressExpr( maybeMoveBuild< Expression >(expr_node1) ) );
    260         args.push_back( maybeMoveBuild< Expression >(expr_node2) );
     252        std::list<Expression *> args;
     253        args.push_back( new AddressExpr( maybeBuild<Expression>(expr_node1) ) );
     254        args.push_back( maybeBuild<Expression>(expr_node2) );
    261255        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    262256}
    263257
    264258Expression *build_cond( ExpressionNode *expr_node1, ExpressionNode *expr_node2, ExpressionNode *expr_node3 ) {
    265         return new ConditionalExpr( notZeroExpr( maybeMoveBuild< Expression >(expr_node1) ), maybeMoveBuild< Expression >(expr_node2), maybeMoveBuild< Expression >(expr_node3) );
     259        return new ConditionalExpr( notZeroExpr( maybeBuild<Expression>(expr_node1) ), maybeBuild<Expression>(expr_node2), maybeBuild<Expression>(expr_node3) );
    266260}
    267261
    268262Expression *build_comma( ExpressionNode *expr_node1, ExpressionNode *expr_node2 ) {
    269         return new CommaExpr( maybeMoveBuild< Expression >(expr_node1), maybeMoveBuild< Expression >(expr_node2) );
     263        return new CommaExpr( maybeBuild<Expression>(expr_node1), maybeBuild<Expression>(expr_node2) );
    270264}
    271265
    272266Expression *build_attrexpr( NameExpr *var, ExpressionNode * expr_node ) {
    273         return new AttrExpr( var, maybeMoveBuild< Expression >(expr_node) );
     267        return new AttrExpr( var, maybeBuild<Expression>(expr_node) );
    274268}
    275269Expression *build_attrtype( NameExpr *var, DeclarationNode * decl_node ) {
    276         return new AttrExpr( var, maybeMoveBuildType( decl_node ) );
     270        return new AttrExpr( var, decl_node->buildType() );
    277271}
    278272
    279273Expression *build_tuple( ExpressionNode * expr_node ) {
    280274        TupleExpr *ret = new TupleExpr();
    281         buildMoveList( expr_node, ret->get_exprs() );
     275        buildList( expr_node, ret->get_exprs() );
    282276        return ret;
    283277}
    284278
    285279Expression *build_func( ExpressionNode * function, ExpressionNode * expr_node ) {
    286         std::list< Expression * > args;
    287         buildMoveList( expr_node, args );
    288         return new UntypedExpr( maybeMoveBuild< Expression >(function), args, nullptr );
     280        std::list<Expression *> args;
     281
     282        buildList( expr_node, args );
     283        return new UntypedExpr( maybeBuild<Expression>(function), args, nullptr );
    289284}
    290285
    291286Expression *build_range( ExpressionNode * low, ExpressionNode *high ) {
    292         return new RangeExpr( maybeMoveBuild< Expression >( low ), maybeMoveBuild< Expression >( high ) );
    293 }
    294 
    295 Expression *build_asmexpr( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
    296         return new AsmExpr( maybeMoveBuild< Expression >( inout ), constraint, maybeMoveBuild< Expression >(operand) );
    297 }
     287        Expression *low_cexpr = maybeBuild<Expression>( low );
     288        Expression *high_cexpr = maybeBuild<Expression>( high );
     289        return new RangeExpr( low_cexpr, high_cexpr );
     290}
     291
     292//##############################################################################
     293
     294Expression *build_asm( ExpressionNode *inout, ConstantExpr *constraint, ExpressionNode *operand ) {
     295        return new AsmExpr( maybeBuild< Expression >( inout ), constraint, maybeBuild<Expression>(operand) );
     296}
     297
     298//##############################################################################
     299
     300void LabelNode::print( std::ostream &os, int indent ) const {}
     301
     302void LabelNode::printOneLine( std::ostream &os, int indent ) const {}
     303
     304//##############################################################################
    298305
    299306Expression *build_valexpr( StatementNode *s ) {
    300         return new UntypedValofExpr( maybeMoveBuild< Statement >(s), nullptr );
    301 }
     307        return new UntypedValofExpr( maybeBuild<Statement>(s), nullptr );
     308}
     309
     310//##############################################################################
     311 
     312// ForCtlExprNode::ForCtlExprNode( ParseNode *init_, ExpressionNode *cond, ExpressionNode *incr ) throw ( SemanticError ) : condition( cond ), change( incr ) {
     313//      if ( init_ == 0 )
     314//              init = 0;
     315//      else {
     316//              DeclarationNode *decl;
     317//              ExpressionNode *exp;
     318
     319//              if (( decl = dynamic_cast<DeclarationNode *>(init_) ) != 0)
     320//                      init = new StatementNode( decl );
     321//              else if (( exp = dynamic_cast<ExpressionNode *>( init_)) != 0)
     322//                      init = new StatementNode( StatementNode::Exp, exp );
     323//              else
     324//                      throw SemanticError("Error in for control expression");
     325//      }
     326// }
     327
     328// ForCtlExprNode::ForCtlExprNode( const ForCtlExprNode &other )
     329//      : ExpressionNode( other ), init( maybeClone( other.init ) ), condition( maybeClone( other.condition ) ), change( maybeClone( other.change ) ) {
     330// }
     331
     332// ForCtlExprNode::~ForCtlExprNode() {
     333//      delete init;
     334//      delete condition;
     335//      delete change;
     336// }
     337
     338// Expression *ForCtlExprNode::build() const {
     339//      // this shouldn't be used!
     340//      assert( false );
     341//      return 0;
     342// }
     343
     344// void ForCtlExprNode::print( std::ostream &os, int indent ) const{
     345//      os << string( indent,' ' ) << "For Control Expression -- :" << endl;
     346
     347//      os << string( indent + 2, ' ' ) << "initialization:" << endl;
     348//      if ( init != 0 )
     349//              init->printList( os, indent + 4 );
     350
     351//      os << string( indent + 2, ' ' ) << "condition: " << endl;
     352//      if ( condition != 0 )
     353//              condition->print( os, indent + 4 );
     354//      os << string( indent + 2, ' ' ) << "increment: " << endl;
     355//      if ( change != 0 )
     356//              change->print( os, indent + 4 );
     357// }
     358
     359// void ForCtlExprNode::printOneLine( std::ostream &, int indent ) const {
     360//      assert( false );
     361// }
     362
     363//##############################################################################
     364
    302365Expression *build_typevalue( DeclarationNode *decl ) {
    303         return new TypeExpr( maybeMoveBuildType( decl ) );
    304 }
     366        return new TypeExpr( decl->buildType() );
     367}
     368
     369//##############################################################################
    305370
    306371Expression *build_compoundLiteral( DeclarationNode *decl_node, InitializerNode *kids ) {
    307         Declaration * newDecl = maybeBuild< Declaration >(decl_node); // compound literal type
     372        Declaration * newDecl = maybeBuild<Declaration>(decl_node); // compound literal type
    308373        if ( DeclarationWithType * newDeclWithType = dynamic_cast< DeclarationWithType * >( newDecl ) ) { // non-sue compound-literal type
    309                 return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeMoveBuild< Initializer >(kids) );
     374                return new CompoundLiteralExpr( newDeclWithType->get_type(), maybeBuild<Initializer>(kids) );
    310375        // these types do not have associated type information
    311376        } else if ( StructDecl * newDeclStructDecl = dynamic_cast< StructDecl * >( newDecl )  ) {
    312                 return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
     377                return new CompoundLiteralExpr( new StructInstType( Type::Qualifiers(), newDeclStructDecl->get_name() ), maybeBuild<Initializer>(kids) );
    313378        } else if ( UnionDecl * newDeclUnionDecl = dynamic_cast< UnionDecl * >( newDecl )  ) {
    314                 return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
     379                return new CompoundLiteralExpr( new UnionInstType( Type::Qualifiers(), newDeclUnionDecl->get_name() ), maybeBuild<Initializer>(kids) );
    315380        } else if ( EnumDecl * newDeclEnumDecl = dynamic_cast< EnumDecl * >( newDecl )  ) {
    316                 return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeMoveBuild< Initializer >(kids) );
     381                return new CompoundLiteralExpr( new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() ), maybeBuild<Initializer>(kids) );
    317382        } else {
    318383                assert( false );
Note: See TracChangeset for help on using the changeset viewer.