Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r76c62b2 rcccc534  
    99// Author           : Rodolfo G. Esteves
    1010// Created On       : Sat May 16 13:17:07 2015
    11 // Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Aug 31 21:05:04 2017
    13 // Update Count     : 605
     11// Last Modified By : Andrew Beach
     12// Last Modified On : Wed Aug  2 11:12:00 2017
     13// Update Count     : 568
    1414//
    1515
     
    5858static inline bool checkX( char c ) { return c == 'x' || c == 'X'; }
    5959
    60 static void sepNumeric( string & str, string & units ) {
    61         string::size_type posn = str.find_first_of( "`" );
    62         if ( posn != string::npos ) {
    63                 units = str.substr( posn );                                             // extract units
    64                 str.erase( posn );                                                              // remove units
    65         } // if
    66 } // sepNumeric
    67 
    68 Expression * build_constantInteger( std::string & str ) {
     60Expression * build_constantInteger( const std::string & str ) {
    6961        static const BasicType::Kind kind[2][3] = {
    7062                { BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt },
    7163                { BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt },
    7264        };
    73 
    74         string units;                                                                           // units
    75         sepNumeric( str, units );                                                       // separate constant from units
    76 
    7765        bool dec = true, Unsigned = false;                                      // decimal, unsigned constant
    7866        int size;                                                                                       // 0 => int, 1 => long, 2 => long long
     
    8169        Expression * ret;
    8270
    83         // ROB: what do we do with units on 0 and 1?
    8471        // special constants
    8572        if ( str == "0" ) {
     
    145132        } // if
    146133
    147 //      if ( units.length() == 0 ) {
    148                 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
    149 //      } else {
    150 //              // ROB: generate call to units routine
    151 //              ret = nullptr;
    152 //      } // if
     134        ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[Unsigned][size] ), str, v ) );
    153135  CLEANUP:
    154136        delete &str;                                                                            // created by lex
     
    156138} // build_constantInteger
    157139
    158 Expression * build_constantFloat( std::string & str ) {
     140Expression * build_constantFloat( const std::string & str ) {
    159141        static const BasicType::Kind kind[2][3] = {
    160142                { BasicType::Float, BasicType::Double, BasicType::LongDouble },
    161143                { BasicType::FloatComplex, BasicType::DoubleComplex, BasicType::LongDoubleComplex },
    162144        };
    163 
    164         string units;                                                                           // units
    165         sepNumeric( str, units );                                                       // separate constant from units
    166145
    167146        bool complx = false;                                                            // real, complex
     
    189168        } // if
    190169
    191         Expression * ret;
    192 //      if ( units.length() == 0 ) {
    193                 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
    194 //      } else {
    195 //              ret = nullptr;
    196 //              // ROB: generate call to units routine
    197 //      } // if
    198 
     170        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, kind[complx][size] ), str, v ) );
    199171        delete &str;                                                                            // created by lex
    200172        return ret;
    201173} // build_constantFloat
    202174
    203 static void sepString( string & str, string & units, char delimit ) {
    204         string::size_type posn = str.find_last_of( delimit ) + 1;
    205         if ( posn != str.length() ) {
    206                 units = str.substr( posn );                                             // extract units
    207                 str.erase( posn );                                                              // remove units
    208         } // if
    209 } // sepString
    210 
    211 Expression * build_constantChar( std::string & str ) {
    212         string units;                                                                           // units
    213         sepString( str, units, '\'' );                                          // separate constant from units
    214 
    215         Expression * ret;
    216 //      if ( units.length() == 0 ) {
    217                 ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
    218 //      } else {
    219 //              ret = nullptr;
    220 //              // ROB: generate call to units routine
    221 //      } // if
    222 
     175Expression * build_constantChar( const std::string & str ) {
     176        Expression * ret = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::Char ), str, (unsigned long long int)(unsigned char)str[1] ) );
    223177        delete &str;                                                                            // created by lex
    224178        return ret;
    225179} // build_constantChar
    226180
    227 ConstantExpr * build_constantStr( std::string & str ) {
    228         string units;                                                                           // units
    229         sepString( str, units, '"' );                                           // separate constant from units
    230 
    231         ConstantExpr * ret;
    232 //      if ( units.length() == 0 ) {
    233                 // string should probably be a primitive type
    234                 ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
    235                                                                                 new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
    236                                                                                 false, false );
    237                 ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
    238 //      } else {
    239 //              ret = nullptr;
    240 //              // ROB: generate call to units routine
    241 //      } // if
    242                
     181ConstantExpr * build_constantStr( const std::string & str ) {
     182        // string should probably be a primitive type
     183        ArrayType * at = new ArrayType( noQualifiers, new BasicType( Type::Qualifiers( Type::Const ), BasicType::Char ),
     184                                                                   new ConstantExpr( Constant::from_ulong( str.size() + 1 - 2 ) ), // +1 for '\0' and -2 for '"'
     185                                                                   false, false );
     186        ConstantExpr * ret = new ConstantExpr( Constant( at, str, (unsigned long long int)0 ) ); // constant 0 is ignored for pure string value
    243187        delete &str;                                                                            // created by lex
    244188        return ret;
     
    370314Expression * build_unary_ptr( OperKinds op, ExpressionNode * expr_node ) {
    371315        std::list< Expression * > args;
    372         args.push_back(  maybeMoveBuild< Expression >(expr_node) ); // xxx
     316        args.push_back(  maybeMoveBuild< Expression >(expr_node) ); // xxx -- this is exactly the same as the val case now, refactor this code.
    373317        return new UntypedExpr( new NameExpr( OperName[ (int)op ] ), args );
    374318} // build_unary_ptr
Note: See TracChangeset for help on using the changeset viewer.