Changeset d2ded3e7 for src/Parser/ExpressionNode.cc
- Timestamp:
- Oct 28, 2015, 3:47:29 PM (8 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 37a3b8f9, 4673385, e56cfdb0
- Parents:
- 698664b (diff), 097e2b0 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r698664b rd2ded3e7 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Aug 11 15:13:48201513 // Update Count : 2 0012 // Last Modified On : Mon Oct 5 16:37:24 2015 13 // Update Count : 255 14 14 // 15 15 … … 32 32 ExpressionNode::ExpressionNode() : ParseNode(), argName( 0 ) {} 33 33 34 ExpressionNode::ExpressionNode( const string *name _ ) : ParseNode( name_), argName( 0 ) {}34 ExpressionNode::ExpressionNode( const string *name ) : ParseNode( name ), argName( 0 ) {} 35 35 36 36 ExpressionNode::ExpressionNode( const ExpressionNode &other ) : ParseNode( other.name ) { … … 290 290 DesignatorNode::DesignatorNode( ExpressionNode *expr, bool isArrayIndex ) : isArrayIndex( isArrayIndex ) { 291 291 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 292 309 } 293 310 … … 295 312 } 296 313 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 297 326 Expression *DesignatorNode::build() const { 327 Expression * ret = get_argName()->build(); 328 298 329 if ( isArrayIndex ) { 299 return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) ); 300 } else { 301 return new NameExpr( get_name(), maybeBuild< Expression >( get_argName() ) ); 302 } // if 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; 303 337 } 304 338 … … 384 418 385 419 CompositeExprNode::CompositeExprNode( ExpressionNode *f, ExpressionNode *arg1, ExpressionNode *arg2): 386 function( f ), arguments( arg1 ) {387 arguments->set_link( arg2 );420 function( f ), arguments( arg1 ) { 421 arguments->set_link( arg2 ); 388 422 } 389 423
Note: See TracChangeset
for help on using the changeset viewer.