Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r1b772749 r8780e30  
    172172} // build_constantStr
    173173
     174Expression * build_field_name_FLOATINGconstant( const std::string & str ) {
     175        // str is of the form A.B -> separate at the . and return member expression
     176        int a, b;
     177        char dot;
     178        std::stringstream ss( str );
     179        ss >> a >> dot >> b;
     180        UntypedMemberExpr * ret = new UntypedMemberExpr(
     181                new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::SignedInt ), toString( b ) ) ),
     182                new ConstantExpr( Constant( new BasicType( emptyQualifiers, BasicType::SignedInt ), toString( a ) ) ) );
     183        delete &str;
     184        return ret;
     185} // build_field_name_FLOATINGconstant
     186
     187Expression * make_field_name_fraction_constants( Expression * fieldName, Expression * fracts ) {
     188        if ( fracts ) {
     189                if ( UntypedMemberExpr * memberExpr = dynamic_cast< UntypedMemberExpr * >( fracts ) ) {
     190                        memberExpr->set_member( make_field_name_fraction_constants( fieldName, memberExpr->get_aggregate() ) );
     191                        return memberExpr;
     192                } else {
     193                        return new UntypedMemberExpr( fracts, fieldName );
     194                }
     195        }
     196        return fieldName;
     197} // make_field_name_fraction_constants
     198
     199Expression * build_field_name_fraction_constants( Expression * fieldName, ExpressionNode * fracts ) {
     200        return make_field_name_fraction_constants( fieldName, maybeMoveBuild< Expression >( fracts ) );
     201} // build_field_name_fraction_constants
     202
     203Expression * build_field_name_REALFRACTIONconstant( const std::string & str ) {
     204        assert( str[0] == '.' );
     205        Expression * ret = build_constantInteger( *new std::string( str.substr(1) ) );
     206        delete &str;
     207        return ret;
     208} // build_field_name_REALFRACTIONconstant
     209
     210Expression * build_field_name_REALDECIMALconstant( const std::string & str ) {
     211        assert( str[str.size()-1] == '.' );
     212        Expression * ret = build_constantInteger( *new std::string( str.substr( 0, str.size()-1 ) ) );
     213        delete &str;
     214        return ret;
     215} // build_field_name_REALDECIMALconstant
     216
    174217NameExpr * build_varref( const string *name, bool labelp ) {
    175218        NameExpr *expr = new NameExpr( *name, nullptr );
     
    198241}
    199242
    200 Expression *build_fieldSel( ExpressionNode *expr_node, NameExpr *member ) {
    201         UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), maybeMoveBuild< Expression >(expr_node) );
    202         delete member;
    203         return ret;
    204 }
    205 
    206 Expression *build_pfieldSel( ExpressionNode *expr_node, NameExpr *member ) {
     243Expression *build_fieldSel( ExpressionNode *expr_node, Expression *member ) {
     244        UntypedMemberExpr *ret = new UntypedMemberExpr( member, maybeMoveBuild< Expression >(expr_node) );
     245        return ret;
     246}
     247
     248Expression *build_pfieldSel( ExpressionNode *expr_node, Expression *member ) {
    207249        UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
    208250        deref->get_args().push_back( maybeMoveBuild< Expression >(expr_node) );
    209         UntypedMemberExpr *ret = new UntypedMemberExpr( member->get_name(), deref );
    210         delete member;
     251        UntypedMemberExpr *ret = new UntypedMemberExpr( member, deref );
    211252        return ret;
    212253}
Note: See TracChangeset for help on using the changeset viewer.