Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Parser/ExpressionNode.cc

    r097e2b0 r51b1202  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Oct  5 16:37:24 2015
    13 // Update Count     : 255
     12// Last Modified On : Tue Aug 11 15:13:48 2015
     13// Update Count     : 200
    1414//
    1515
     
    3232ExpressionNode::ExpressionNode() : ParseNode(), argName( 0 ) {}
    3333
    34 ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ), argName( 0 ) {}
     34ExpressionNode::ExpressionNode( const string *name_ ) : ParseNode( name_ ), argName( 0 ) {}
    3535
    3636ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ) {
     
    290290DesignatorNode::DesignatorNode( ExpressionNode *expr, bool isArrayIndex ) : isArrayIndex( isArrayIndex ) {
    291291        set_argName( expr );
    292         assert( get_argName() );
    293 
    294         if ( ! isArrayIndex ) {
    295                 if ( VarRefNode * var = dynamic_cast< VarRefNode * >( expr ) ) {
    296 
    297                         stringstream ss( var->get_name() );
    298                         double value;
    299                         if ( ss >> value ) {
    300                                 // this is a floating point constant. It MUST be
    301                                 // ".0" or ".1", otherwise the program is invalid
    302                                 if ( ! (var->get_name() == ".0" || var->get_name() == ".1") ) {
    303                                         throw SemanticError( "invalid designator name: " + var->get_name() );
    304                                 } // if
    305                                 var->set_name( var->get_name().substr(1) );
    306                         } // if
    307                 } // if
    308         } // if
    309292}
    310293
     
    312295}
    313296
    314 class DesignatorFixer : public Mutator {
    315 public:
    316         virtual Expression* mutate( NameExpr *nameExpr ) {
    317                 if ( nameExpr->get_name() == "0" || nameExpr->get_name() == "1" ) {
    318                         Constant val( new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nameExpr->get_name() );
    319                         delete nameExpr;
    320                         return new ConstantExpr( val );
    321                 }
    322                 return nameExpr;
    323         }
    324 };
    325 
    326297Expression *DesignatorNode::build() const {
    327         Expression * ret = get_argName()->build();
    328 
    329298        if ( isArrayIndex ) {
    330                 // need to traverse entire structure and change any instances of 0 or 1 to
    331                 // ConstantExpr
    332                 DesignatorFixer fixer;
    333                 ret = ret->acceptMutator( fixer );
    334         } // if
    335 
    336         return ret;
     299                return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) );
     300        } else {
     301                return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) );
     302        } // if
    337303}
    338304
     
    418384
    419385CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2):
    420         function( f ), arguments( arg1 ) {
    421         arguments->set_link( arg2 );
     386        function( f ), arguments( arg1) {
     387        arguments->set_link( arg2);
    422388}
    423389
Note: See TracChangeset for help on using the changeset viewer.