#include "node.hpp" #include "grammar.hpp" std::ostream& operator<<( std::ostream& o, const Node& n ) { n.printTo( o ); return o; } void Node::printTo( std::ostream& o ) const { o << ""; } void NBlock::printTo(std::ostream& o ) const { o << "NBlock[" << std::endl; StatementList::const_iterator eit = m_statements.end( ); for( StatementList::const_iterator it = m_statements.begin( ); it != eit; it++ ) { o << "\t"; (*it)->printTo( o ); o << std::endl; } o << "]" << std::endl; } void NInteger::printTo( std::ostream& o ) const { o << "NInteger[" << m_value << "]"; } void NStatement::printTo(std::ostream& o ) const { o << "NStatement"; } void NExpressionStatement::printTo( std::ostream& o ) const { o << "NStatement[" << m_expression << "]"; } void NIdentifier::printTo( std::ostream& o ) const { o << "NIdentifier['" << m_name << "']"; } void NAssignment::printTo( std::ostream& o ) const { o << "NAssignment[" << m_lhs << " = " << m_rhs << "]"; } void NVariableDeclaration::printTo( std::ostream& o ) const { o << "NVariableDeclaration["; m_type.printTo( o ); o << " "; m_name.printTo( o ); if( m_assigned_expr != 0 ) { o << "="; m_assigned_expr->printTo( o ); } o << "]"; } void NFunctionDeclaration::printTo( std::ostream& o ) const { o << "NFunctionDeclaration[returns: "; m_type.printTo( o ); o << ", name: "; m_name.printTo( o ); if( m_arguments.size( ) > 0 ) { o << ", params: "; VariableList::const_iterator eit = m_arguments.end( ); for( VariableList::const_iterator it = m_arguments.begin( ); it != eit; ) { (*it)->printTo( o ); it++; if( it != eit ) { o << ","; } } } o << ":" << std::endl; m_block.printTo( o ); o << "]"; } void NFunctionCall::printTo( std::ostream& o ) const { o << "NFunctionCall, "; o << "name: " << m_name << " ("; ExpressionList::const_iterator eit = m_arguments.end( ); for( ExpressionList::const_iterator it = m_arguments.begin( ); it != eit; ) { (*it)->printTo( o ); it++; if( it != eit ) { o << ","; } } o << ")"; } void NBinaryOperator::printTo( std::ostream& o ) const { o << "NExpression["; m_lhs.printTo( o ); o << " "; switch( m_op ) { case TPLUS: o << "+"; break; case TMUL: o << "*"; break; default: o << ""; break; } o << " "; m_rhs.printTo( o ); o << "]"; }