void write_simple_cursor( std::ostream &out , Cursor t , bool write_infix , SymbolMapper const& mapper ) { if( ( t.size() == 2 ) && write_infix ) { Cursor left = t.children( 0 ); Cursor right = t.children( 1 ); if( left.size() == 2 ) out << "( "; write_simple_cursor( out , left , write_infix , mapper ); if( left.size() == 2 ) out << " )"; out << " " << mapper( *t ) << " "; if( right.size() == 2 ) out << "( "; write_simple_cursor( out , right , write_infix , mapper ); if( right.size() == 2 ) out << " )"; } else { out << mapper( *t ); if( t.size() > 0 ) { out << "( "; for( size_t i=0 ; i<t.size() ; ++i ) { if( i != 0 ) out << " , "; write_simple_cursor( out , t.children(i) , write_infix , mapper ); } out << " )"; } } }
void write_polish_cursor( std::ostream &out , Cursor t , std::string const& sep , std::string const &opening , std::string const& closing , SymbolMapper const& mapper ) { if( t.size() != 0 ) out << opening; out << mapper( *t ); if( t.size() != 0 ) { out << sep; write_polish_cursor( out , t.children( 0 ) , sep , opening , closing , mapper ); } for( size_t i=1 ; i<t.size(); ++i ) { out << sep; write_polish_cursor( out , t.children( i ) , sep , opening , closing , mapper ); } if( t.size() != 0 ) out << closing; }
void seperate_nodes( Cursor c , std::vector< Cursor > & internal, std::vector< Cursor > & terminal) { if( c.size() > 1 ) { internal.emplace_back( c ); for( size_t i = 0 ; i < c.size() ; ++i ) seperate_nodes( c.children( i ) , internal , terminal ); } else { terminal.emplace_back( c ); } }