#include "dot.h"
|
#include "../ast.h"
|
#include "../gens.h"
|
#include <fstream>
|
#include <iostream>
|
#include <string>
|
|
dot_gen::~dot_gen() { out.close(); }
|
|
void dot_gen::set_file(std::string file_name) { out.open(file_name); }
|
|
std::string *dot_gen::new_node()
|
{
|
std::string *o = new std::string();
|
*o = "Node" + std::to_string(node_cnt++);
|
return o;
|
}
|
|
void *dot_gen::visit_Document(Document *d)
|
{
|
out << "digraph ast {" << std::endl;
|
node_cnt = 0;
|
std::string *doc_id = new_node();
|
out << *doc_id << " [label=\"Document\"];" << std::endl;
|
std::vector<Block *> *b = d->get_blocks();
|
for (std::vector<Block *>::size_type i = 0; i < b->size(); i++) {
|
std::string *ret_id = (std::string *)(*b)[i]->visit(this);
|
out << *doc_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
}
|
out << "}" << std::endl;
|
delete doc_id;
|
return NULL;
|
}
|
|
void *dot_gen::visit_Block_Table(Block_Table *bt)
|
{
|
std::string *b_id = new_node();
|
std::vector<std::vector<Line_Word *> *> *t = bt->get_table();
|
out << *b_id << " [label=\"Block Table\"];" << std::endl;
|
for (std::vector<std::vector<Line_Word *> *>::size_type i = 0;
|
i < t->size(); i++) {
|
std::string *row_id = new_node();
|
out << *row_id << " [label=\"Row(" << i << ")\"];" << std::endl;
|
out << *b_id << "->" << *row_id << ";" << std::endl;
|
std::vector<Line_Word *> *r = (*t)[i];
|
for (std::vector<Line_Word *>::size_type j = 0; j < r->size();
|
j++) {
|
std::string *ret_id =
|
(std::string *)(*r)[j]->visit(this);
|
out << *row_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
}
|
delete row_id;
|
}
|
return b_id;
|
}
|
|
void *dot_gen::visit_Block_Code(Block_Code *bc)
|
{
|
std::string *c_id = new_node();
|
out << *c_id << " [label=\"Block Code(" << bc->get_lang() << ")\"];"
|
<< std::endl;
|
return c_id;
|
}
|
|
void *dot_gen::visit_Block_Word(Block_Word *bl)
|
{
|
std::string *bw_id = new_node();
|
out << *bw_id << " [label=\"Block Word\"];" << std::endl;
|
std::string *ret_id = (std::string *)bl->get_words()->visit(this);
|
out << *bw_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return bw_id;
|
}
|
|
void *dot_gen::visit_Heading(Heading *h)
|
{
|
std::string *h_id = new_node();
|
Line_Word *w = h->get_words();
|
out << *h_id << " [label=\"Heading\"];" << std::endl;
|
std::string *ret_id = (std::string *)w->visit(this);
|
out << *h_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return h_id;
|
}
|
|
void *dot_gen::visit_List(List *l)
|
{
|
std::string *l_id = new_node();
|
Line_Word *w = l->get_words();
|
out << *l_id << " [label=\"List(l: " << l->get_level()
|
<< ", n:" << l->get_number() << ")\"];" << std::endl;
|
std::string *ret_id = (std::string *)w->visit(this);
|
out << *l_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return l_id;
|
}
|
|
void *dot_gen::visit_MathDisp(MathDisp *md)
|
{
|
std::string *md_id = new_node();
|
out << *md_id << " [label=\"MathDisp(" << md->get_expr() << ")\"];"
|
<< std::endl;
|
return md_id;
|
}
|
|
void *dot_gen::visit_Line_Word(Line_Word *lw)
|
{
|
std::string *lw_id = new_node();
|
std::vector<Word *> *w = lw->get_words();
|
out << *lw_id << " [label=\"Line Word\"];" << std::endl;
|
for (std::vector<Word *>::size_type i = 0; i < w->size(); i++) {
|
std::string *ret_id = (std::string *)(*w)[i]->visit(this);
|
out << *lw_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
}
|
return lw_id;
|
}
|
|
void *dot_gen::visit_MathInline(MathInline *mi)
|
{
|
std::string *mi_id = new_node();
|
out << *mi_id << " [label=\"Math Inline(" << mi->get_expr() << ")\"];"
|
<< std::endl;
|
return mi_id;
|
}
|
|
void *dot_gen::visit_Link(Link *l)
|
{
|
std::string *l_id = new_node();
|
out << *l_id << " [label=\"Link(" << l->get_link() << ","
|
<< l->get_text() << ")\"];" << std::endl;
|
return l_id;
|
}
|
|
void *dot_gen::visit_Text(Text *t)
|
{
|
std::string *t_id = new_node();
|
out << *t_id << " [label=\"Text(" << t->get_text() << ")\"];"
|
<< std::endl;
|
return t_id;
|
}
|
|
void *dot_gen::visit_Format_Bold(Format_Bold *fb)
|
{
|
std::string *fb_id = new_node();
|
out << *fb_id << " [label=\"Format Bold\"];" << std::endl;
|
std::string *ret_id = (std::string *)fb->get_f()->visit(this);
|
out << *fb_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return fb_id;
|
}
|
|
void *dot_gen::visit_Format_Italic(Format_Italic *fi)
|
{
|
std::string *fi_id = new_node();
|
out << *fi_id << " [label=\"Format Italic\"];" << std::endl;
|
std::string *ret_id = (std::string *)fi->get_f()->visit(this);
|
out << *fi_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return fi_id;
|
}
|
|
void *dot_gen::visit_Format_Verbatim(Format_Verbatim *fv)
|
{
|
std::string *fv_id = new_node();
|
out << *fv_id << " [label=\"Format Verbatim\"];" << std::endl;
|
std::string *ret_id = (std::string *)fv->get_f()->visit(this);
|
out << *fv_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return fv_id;
|
}
|
|
void *dot_gen::visit_Format_Strikethrough(Format_Strikethrough *fs)
|
{
|
std::string *fs_id = new_node();
|
out << *fs_id << " [label=\"Format Strikethrough\"];" << std::endl;
|
std::string *ret_id = (std::string *)fs->get_f()->visit(this);
|
out << *fs_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return fs_id;
|
}
|
|
void *dot_gen::visit_Format_Underline(Format_Underline *fu)
|
{
|
std::string *fu_id = new_node();
|
out << *fu_id << " [label=\"Format Underline\"];" << std::endl;
|
std::string *ret_id = (std::string *)fu->get_f()->visit(this);
|
out << *fu_id << "->" << *ret_id << ";" << std::endl;
|
delete ret_id;
|
return fu_id;
|
}
|