#include "ParseNode.h" #include "SynTree/Expression.h" #include "SynTree/Initializer.h" #include "utility.h" #include "SemanticError.h" // #include // for strtol #include InitializerNode::InitializerNode( ExpressionNode *_expr, bool aggrp, ExpressionNode *des ) : ParseNode( "", _expr->get_filename(), _expr->get_lineno() ), expr( _expr ), aggregate( aggrp ), designator( des ), kids( 0 ) { if( des && des->get_lineno() < lineno ) { lineno = des->get_lineno(); } if ( aggrp ) kids = dynamic_cast< InitializerNode *>( get_link() ); if ( kids != 0 ) set_link( 0 ); } InitializerNode::InitializerNode( InitializerNode *init, bool aggrp, ExpressionNode *des ) : ParseNode( "", init->get_filename(), init->get_lineno() ), aggregate( aggrp ), designator( des ), kids( 0 ) { if( des && des->get_lineno() < lineno ) { lineno = des->get_lineno(); } if (init != 0) set_link(init); if ( aggrp ) kids = dynamic_cast< InitializerNode *>( get_link() ); if ( kids != 0 ) set_next( 0 ); } InitializerNode::~InitializerNode() { delete expr; } void InitializerNode::print( std::ostream &os, int indent ) const { os << std::string(indent, ' ') << "Initializer expression" << std::endl; } void InitializerNode::printOneLine( std::ostream &os ) const { if (!aggregate) { if ( designator != 0 ) { os << "designated by: ("; ExpressionNode *curdes = designator; while( curdes != 0){ curdes->printOneLine(os); curdes = (ExpressionNode *)(curdes->get_link()); if(curdes) os << ", "; } os << ")"; } if (expr) expr->printOneLine(os); } else // It's an aggregate { os << "["; if( next_init() != 0 ) next_init()->printOneLine(os); if (aggregate) os << "]"; } InitializerNode * moreInit; if ( get_link() != 0 && ((moreInit = dynamic_cast< InitializerNode * >( get_link() ) ) != 0) ) moreInit->printOneLine( os ); } Initializer *InitializerNode::build() const { if ( aggregate ) { assert( next_init() != 0 ); std::list< Initializer *> initlist; buildList( next_init(), initlist ); std::list< Expression *> designlist; if ( designator != 0 ) buildList( designator, designlist ); return new ListInit( initlist, designlist ); } else { std::list< Expression *> designators; if ( designator != 0 ) buildList( designator, designators ); return new SingleInit( get_expression()->build(), designators ); } return 0; // shouldn't be here }