Changes in src/Parser/ExpressionNode.cc [51b1202:097e2b0]
- File:
-
- 1 edited
-
src/Parser/ExpressionNode.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r51b1202 r097e2b0 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.