Changes in src/Parser/ExpressionNode.cc [097e2b0:51b1202]
- File:
-
- 1 edited
-
src/Parser/ExpressionNode.cc (modified) (5 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Parser/ExpressionNode.cc
r097e2b0 r51b1202 10 10 // Created On : Sat May 16 13:17:07 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Oct 5 16:37:24201513 // Update Count : 2 5512 // Last Modified On : Tue Aug 11 15:13:48 2015 13 // Update Count : 200 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 be301 // ".0" or ".1", otherwise the program is invalid302 if ( ! (var->get_name() == ".0" || var->get_name() == ".1") ) {303 throw SemanticError( "invalid designator name: " + var->get_name() );304 } // if305 var->set_name( var->get_name().substr(1) );306 } // if307 } // if308 } // if309 292 } 310 293 … … 312 295 } 313 296 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 326 297 Expression *DesignatorNode::build() const { 327 Expression * ret = get_argName()->build();328 329 298 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 337 303 } 338 304 … … 418 384 419 385 CompositeExprNode::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); 422 388 } 423 389
Note:
See TracChangeset
for help on using the changeset viewer.