void display_graph( const Lexem *t, const char *file_name, const Lexem *avoid ) { std::ofstream f(file_name); f << "digraph popoterie {"; unsigned max_level = 1; display_graph_rec( f, t, 1, max_level, avoid ); for( unsigned i = 1; i <= max_level; ++i ) f << " " << i << " [ shape=plaintext ];\n "; for( unsigned i = 1; i <= max_level; ++i ) f << i << ( i<max_level ? " -> " : ";" ); f << "}"; f.close(); int res = system( ("dot -Tps "+std::string(file_name)+" > "+std::string(file_name)+".eps && gv "+std::string(file_name)+".eps").c_str() ); if ( res ) res = 0; }
void display_graph_rec( std::ostream &os, const Lexem *t, unsigned level, unsigned &max_level ) { unsigned j; max_level = std::max( max_level, level ); const Lexem *old_t = t; // nodes for(;t;t=t->next) { os << "{ rank = same; " << level << " node" << t << " [label=\""; for(unsigned i=0;i<t->si;++i) { if ( t->s[i]=='\n' ) os << "\\n"; else if ( t->s[i]=='"' ) os << "\\\""; else os << t->s[i]; } os << '(' << t->type << ')' << "\"] }\n"; // children for(j=0;j<2;++j) { if ( t->children[j] ) { display_graph_rec( os, t->children[j], level+1, max_level ); os << " node" << t << " -> node" << t->children[j] << ";\n"; } } // ascending edge if ( t->parent ) os << " node" << t << " -> node" << t->parent << " [color=red];\n"; } // edges t = old_t; for(;t;t=t->next) { if ( t->next ) os << " node" << t << " -> node" << t->next << " [color=green];\n"; if ( t->prev ) // os << " node" << t << " -> node" << t->prev << " [color=yellow];\n"; } }