From ca483d438742be9650a5045e846b974f57c67e4f Mon Sep 17 00:00:00 2001 From: Joel Grunbaum <joelgrun@gmail.com> Date: Thu, 12 Aug 2021 10:05:25 +0000 Subject: [PATCH] Format code, add format for strikethrough and underline, replace line with word --- ast.h | 244 ++++++++++------ main.cpp | 8 gens/dot.h | 40 +- ast.cpp | 305 +++++++------------- spec.org | 10 gens.h | 37 +- gens/dot.cpp | 149 ++++++--- parsers/tester.cpp | 60 ++-- 8 files changed, 434 insertions(+), 419 deletions(-) diff --git a/ast.cpp b/ast.cpp index 2c349da..4f7d694 100644 --- a/ast.cpp +++ b/ast.cpp @@ -1,177 +1,114 @@ -#include <vector> -#include <string> #include "ast.h" +#include <string> +#include <vector> -MathInline::MathInline(std::string e) { - expr = e; -} -std::string MathInline::get_expr() { - return expr; -} -void* MathInline::visit(ast_visitor *v) { - return v->visit_MathInline(this); -} +MathInline::MathInline(std::string e) { expr = e; } +std::string MathInline::get_expr() { return expr; } +void *MathInline::visit(ast_visitor *v) { return v->visit_MathInline(this); } -Link::Link(std::string l, std::string t) { +Link::Link(std::string l, std::string t) +{ link = l; text = t; } -std::string Link::get_link() { - return link; -} +std::string Link::get_link() { return link; } +std::string Link::get_text() { return text; } +void *Link::visit(ast_visitor *v) { return v->visit_Link(this); } +Text::Text(std::string tt) { t = tt; } +std::string Text::get_text() { return t; } +void *Text::visit(ast_visitor *v) { return v->visit_Text(this); } +Format_Bold::Format_Bold(Format *ff) { f = ff; } +Format_Bold::~Format_Bold() { delete f; } +Format *Format_Bold::get_f() { return f; } +void *Format_Bold::visit(ast_visitor *v) { return v->visit_Format_Bold(this); } +Format_Italic::Format_Italic(Format *ff) { f = ff; } +Format_Italic::~Format_Italic() { delete f; } +Format *Format_Italic::get_f() { return f; } -std::string Link::get_text() { - return text; -} - -void* Link::visit(ast_visitor *v) { - return v->visit_Link(this); -} - -Text::Text(std::string tt) { - t=tt; -} - -std::string Text::get_text() { - return t; -} - -void* Text::visit(ast_visitor *v) { - return v->visit_Text(this); -} - -Format_Bold::Format_Bold(Format* ff) { - f=ff; -} - -Format_Bold::~Format_Bold() { - delete f; -} - -Format* Format_Bold::get_f() { - return f; -} - -void* Format_Bold::visit(ast_visitor *v) { - return v->visit_Format_Bold(this); -} - -Format_Italic::Format_Italic(Format* ff) { - f=ff; -} - -Format_Italic::~Format_Italic() { - delete f; -} - -Format* Format_Italic::get_f() { - return f; -} - -void* Format_Italic::visit(ast_visitor *v) { +void *Format_Italic::visit(ast_visitor *v) +{ return v->visit_Format_Italic(this); } -Format_Verbatim::Format_Verbatim(Format* ff) { - f=ff; -} +Format_Verbatim::Format_Verbatim(Format *ff) { f = ff; } +Format_Verbatim::~Format_Verbatim() { delete f; } +Format *Format_Verbatim::get_f() { return f; } -Format_Verbatim::~Format_Verbatim() { - delete f; -} - -Format* Format_Verbatim::get_f() { - return f; -} - -void* Format_Verbatim::visit(ast_visitor *v) { +void *Format_Verbatim::visit(ast_visitor *v) +{ return v->visit_Format_Verbatim(this); } -Heading::Heading(int l, Line_Word *w) { +Format_Underline::Format_Underline(Format *ff) { f = ff; } +Format_Underline::~Format_Underline() { delete f; } +Format *Format_Underline::get_f() { return f; } + +void *Format_Underline::visit(ast_visitor *v) +{ + return v->visit_Format_Underline(this); +} + +Format_Strikethrough::Format_Strikethrough(Format *ff) { f = ff; } +Format_Strikethrough::~Format_Strikethrough() { delete f; } +Format *Format_Strikethrough::get_f() { return f; } + +void *Format_Strikethrough::visit(ast_visitor *v) +{ + return v->visit_Format_Strikethrough(this); +} + +Heading::Heading(int l, Line_Word *w) +{ level = l; words = w; } -Heading::~Heading() { - delete words; -} +Heading::~Heading() { delete words; } +int Heading::get_level() { return level; } +Line_Word *Heading::get_words() { return words; } +void *Heading::visit(ast_visitor *v) { return v->visit_Heading(this); } -int Heading::get_level() { - return level; -} - -Line_Word* Heading::get_words() { - return words; -} - -void* Heading::visit(ast_visitor *v) { - return v->visit_Heading(this); -} - -List::List(int l, int n, Line_Word *w) { +List::List(int l, int n, Line_Word *w) +{ level = l; number = n; words = w; } -List::~List() { - delete words; -} +List::~List() { delete words; } +int List::get_level() { return level; } +int List::get_number() { return number; } +Line_Word *List::get_words() { return words; } +void *List::visit(ast_visitor *v) { return v->visit_List(this); } +MathDisp::MathDisp(std::string e) { expr = e; } +std::string MathDisp::get_expr() { return expr; } +void *MathDisp::visit(ast_visitor *v) { return v->visit_MathDisp(this); } -int List::get_level() { - return level; -} - -int List::get_number() { - return number; -} - -Line_Word* List::get_words() { - return words; -} - -void* List::visit(ast_visitor *v) { - return v->visit_List(this); -} - -MathDisp::MathDisp(std::string e) { - expr = e; -} - -std::string MathDisp::get_expr() { - return expr; -} - -void* MathDisp::visit(ast_visitor *v) { - return v->visit_MathDisp(this); -} - -Line_Word::~Line_Word() { - for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) { +Line_Word::~Line_Word() +{ + for (std::vector<Word *>::size_type i = 0; i < words.size(); i++) { delete words[i]; } words.clear(); } -int Line_Word::add_word(Word *w) { +int Line_Word::add_word(Word *w) +{ words.push_back(w); return 0; } -std::vector<Word*>* Line_Word::get_words() { - return &words; -} +std::vector<Word *> *Line_Word::get_words() { return &words; } +void *Line_Word::visit(ast_visitor *v) { return v->visit_Line_Word(this); } -void* Line_Word::visit(ast_visitor *v) { - return v->visit_Line_Word(this); -} - -Block_Table::~Block_Table() { - for (std::vector<std::vector<Line_Word*>*>::size_type i = 0; i < table.size(); i++) { - std::vector<Line_Word*> *t = table[i]; - for (std::vector<Line_Word*>::size_type j = 0; j < t->size(); j++) { +Block_Table::~Block_Table() +{ + for (std::vector<std::vector<Line_Word *> *>::size_type i = 0; + i < table.size(); i++) { + std::vector<Line_Word *> *t = table[i]; + for (std::vector<Line_Word *>::size_type j = 0; j < t->size(); + j++) { delete (*t)[j]; } t->clear(); @@ -180,16 +117,20 @@ table.clear(); } -std::vector<std::vector<Line_Word*>*>* Block_Table::get_table() { +std::vector<std::vector<Line_Word *> *> *Block_Table::get_table() +{ return &table; } -int Block_Table::add_row(std::vector<Line_Word*>* row) { +int Block_Table::add_row(std::vector<Line_Word *> *row) +{ table.push_back(row); return 0; } -std::vector<Line_Word*>* Block_Table::get_row(std::vector<Line_Word*>::size_type i) { +std::vector<Line_Word *> * +Block_Table::get_row(std::vector<Line_Word *>::size_type i) +{ if (i < table.size()) { return table[i]; } else { @@ -197,86 +138,54 @@ } } -void* Block_Table::visit(ast_visitor *v) { - return v->visit_Block_Table(this); -} +void *Block_Table::visit(ast_visitor *v) { return v->visit_Block_Table(this); } -Block_Code::Block_Code(std::string l) { +Block_Code::Block_Code(std::string l) +{ lang = l; c = ""; } -int Block_Code::add_line(std::string add) { +int Block_Code::add_line(std::string add) +{ c = c + add + "\n"; return 0; } -std::string Block_Code::get_lang() { - return lang; -} +std::string Block_Code::get_lang() { return lang; } +std::string Block_Code::get_code() { return c; } +void *Block_Code::visit(ast_visitor *v) { return v->visit_Block_Code(this); } -std::string Block_Code::get_code() { - return c; -} +Block_Word::Block_Word(Line_Word *lw) { words = lw; } +Block_Word::~Block_Word() { delete words; } +int Block_Word::add_word(Word *w) { return words->add_word(w); } +Line_Word *Block_Word::get_words() { return words; } +void *Block_Word::visit(ast_visitor *v) { return v->visit_Block_Word(this); } -void* Block_Code::visit(ast_visitor *v) { - return v->visit_Block_Code(this); -} - -Block_Line::~Block_Line() { - for (std::vector<Line*>::size_type i = 0; i < lines.size(); i++) { - delete lines[i]; - } - lines.clear(); -} - -std::vector<Line*>* Block_Line::get_lines() { - return &lines; -} - -int Block_Line::add_line(Line* l) { - lines.push_back(l); - return 0; -} - -void* Block_Line::visit(ast_visitor *v) { - return v->visit_Block_Line(this); -} - -Document::Document(std::string t, std::string a, std::string d) { +Document::Document(std::string t, std::string a, std::string d) +{ title = t; author = a; date = d; } -Document::~Document() { - for (std::vector<Block*>::size_type i = 0; i < blocks.size(); i++) { +Document::~Document() +{ + for (std::vector<Block *>::size_type i = 0; i < blocks.size(); i++) { delete blocks[i]; } blocks.clear(); } -std::string Document::get_title() { - return title; -} +std::string Document::get_title() { return title; } +std::string Document::get_author() { return author; } +std::string Document::get_date() { return date; } +std::vector<Block *> *Document::get_blocks() { return &blocks; } -std::string Document::get_author() { - return author; -} - -std::string Document::get_date() { - return date; -} - -std::vector<Block*>* Document::get_blocks() { - return &blocks; -} - -int Document::add_block(Block *b) { +int Document::add_block(Block *b) +{ blocks.push_back(b); return 0; } -void* Document::visit(ast_visitor *v) { - return v->visit_Document(this); -} +void *Document::visit(ast_visitor *v) { return v->visit_Document(this); } diff --git a/ast.h b/ast.h index 41ef05e..91b93f7 100644 --- a/ast.h +++ b/ast.h @@ -1,11 +1,11 @@ #ifndef AST_H #define AST_H -#include <vector> #include <string> +#include <vector> -//class ast_node; +// class ast_node; class ast_visitor; -//class Document; +// class Document; // class Block; // class Block_Table; // class Block_Code; @@ -24,171 +24,233 @@ // class Format_Verbatim; // class Text; -class ast_node { -public: - virtual ~ast_node()=default; - virtual void* visit(ast_visitor *v)=0; +class ast_node +{ + public: + virtual ~ast_node() = default; + virtual void *visit(ast_visitor *v) = 0; }; -class Word: public ast_node {}; +class Word : public ast_node +{ +}; -class MathInline: public Word { +class MathInline : public Word +{ std::string expr; -public: + + public: MathInline(std::string e); std::string get_expr(); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; -class Link: public Word { +class Link : public Word +{ std::string link, text; -public: + + public: Link(std::string l, std::string t); std::string get_link(); std::string get_text(); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; -class Format: public Word {}; +class Format : public Word +{ +}; -class Text: public Format { +class Text : public Format +{ std::string t; -public: + + public: Text(std::string tt); std::string get_text(); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; -class Format_Bold: public Format { +class Format_Bold : public Format +{ Format *f; -public: - Format_Bold(Format* ff); + + public: + Format_Bold(Format *ff); ~Format_Bold(); - Format* get_f(); - void* visit(ast_visitor *v); + Format *get_f(); + void *visit(ast_visitor *v); }; -class Format_Italic: public Format { +class Format_Italic : public Format +{ Format *f; -public: - Format_Italic(Format* ff); + + public: + Format_Italic(Format *ff); ~Format_Italic(); - Format* get_f(); - void* visit(ast_visitor *v); + Format *get_f(); + void *visit(ast_visitor *v); }; -class Format_Verbatim: public Format { +class Format_Verbatim : public Format +{ Format *f; -public: - Format_Verbatim(Format* ff); - ~Format_Verbatim(); - Format* get_f(); - void* visit(ast_visitor *v); -}; -class Line: public ast_node {}; -class Line_Word: public Line { - std::vector<Word*> words; -public: + public: + Format_Verbatim(Format *ff); + ~Format_Verbatim(); + Format *get_f(); + void *visit(ast_visitor *v); +}; + +class Format_Underline : public Format +{ + Format *f; + + public: + Format_Underline(Format *ff); + ~Format_Underline(); + Format *get_f(); + void *visit(ast_visitor *v); +}; + +class Format_Strikethrough : public Format +{ + Format *f; + + public: + Format_Strikethrough(Format *ff); + ~Format_Strikethrough(); + Format *get_f(); + void *visit(ast_visitor *v); +}; + +// class Line : public ast_node {}; + +class Line_Word : public Word +{ + std::vector<Word *> words; + + public: ~Line_Word(); int add_word(Word *w); - std::vector<Word*>* get_words(); - void* visit(ast_visitor *v); + std::vector<Word *> *get_words(); + void *visit(ast_visitor *v); }; -class Heading: public Line { +class Heading : public Word +{ int level; Line_Word *words; -public: + + public: Heading(int l, Line_Word *w); ~Heading(); int get_level(); - Line_Word* get_words(); - void* visit(ast_visitor *v); + Line_Word *get_words(); + void *visit(ast_visitor *v); }; -class List: public Line { +class List : public Word +{ int level, number; Line_Word *words; -public: + + public: List(int l, int n, Line_Word *w); ~List(); int get_level(); int get_number(); - Line_Word* get_words(); - void* visit(ast_visitor *v); + Line_Word *get_words(); + void *visit(ast_visitor *v); }; -class MathDisp: public Line { +class MathDisp : public Word +{ std::string expr; -public: + + public: MathDisp(std::string e); std::string get_expr(); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; +class Block : public ast_node +{ +}; -class Block: public ast_node {}; +class Block_Table : public Block +{ + std::vector<std::vector<Line_Word *> *> table; -class Block_Table: public Block { - std::vector<std::vector<Line_Word*>*> table; -public: + public: ~Block_Table(); - std::vector<std::vector<Line_Word*>*>* get_table(); - int add_row(std::vector<Line_Word*>* row); - std::vector<Line_Word*>* get_row(std::vector<Line_Word*>::size_type i); - void* visit(ast_visitor *v); + std::vector<std::vector<Line_Word *> *> *get_table(); + int add_row(std::vector<Line_Word *> *row); + std::vector<Line_Word *> * + get_row(std::vector<Line_Word *>::size_type i); + void *visit(ast_visitor *v); }; -class Block_Code: public Block { +class Block_Code : public Block +{ std::string c; std::string lang; -public: + + public: Block_Code(std::string l); int add_line(std::string add); std::string get_lang(); std::string get_code(); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; -class Block_Line: public Block { - std::vector<Line*> lines; -public: - ~Block_Line(); - std::vector<Line*>* get_lines(); - int add_line(Line* l); - void* visit(ast_visitor *v); +class Block_Word : public Block +{ + Line_Word *words; + + public: + Block_Word(Line_Word *lw); + ~Block_Word(); + int add_word(Word *w); + Line_Word *get_words(); + void *visit(ast_visitor *v); }; -class Document: public ast_node { +class Document : public ast_node +{ std::string title, author, date; - std::vector<Block*> blocks; -public: + std::vector<Block *> blocks; + + public: Document(std::string t, std::string a, std::string d); ~Document(); std::string get_title(); std::string get_author(); std::string get_date(); - std::vector<Block*>* get_blocks(); + std::vector<Block *> *get_blocks(); int add_block(Block *b); - void* visit(ast_visitor *v); + void *visit(ast_visitor *v); }; -class ast_visitor { -public: - virtual void* visit_Document(Document *d)=0; - virtual void* visit_Block_Table(Block_Table *bt)=0; - virtual void* visit_Block_Code(Block_Code *bc)=0; - virtual void* visit_Block_Line(Block_Line *bl)=0; - virtual void* visit_Heading(Heading *h)=0; - virtual void* visit_List(List *l)=0; - virtual void* visit_MathDisp(MathDisp *md)=0; - virtual void* visit_Line_Word(Line_Word *lw)=0; - virtual void* visit_Link(Link *l)=0; - virtual void* visit_MathInline(MathInline *mi)=0; - virtual void* visit_Format_Bold(Format_Bold *fb)=0; - virtual void* visit_Format_Italic(Format_Italic *fi)=0; - virtual void* visit_Format_Verbatim(Format_Verbatim *fv)=0; - virtual void* visit_Text(Text *t)=0; +class ast_visitor +{ + public: + virtual void *visit_Document(Document *d) = 0; + virtual void *visit_Block_Table(Block_Table *bt) = 0; + virtual void *visit_Block_Code(Block_Code *bc) = 0; + virtual void *visit_Block_Word(Block_Word *bw) = 0; + virtual void *visit_Heading(Heading *h) = 0; + virtual void *visit_List(List *l) = 0; + virtual void *visit_MathDisp(MathDisp *md) = 0; + virtual void *visit_Line_Word(Line_Word *lw) = 0; + virtual void *visit_Link(Link *l) = 0; + virtual void *visit_MathInline(MathInline *mi) = 0; + virtual void *visit_Format_Bold(Format_Bold *fb) = 0; + virtual void *visit_Format_Italic(Format_Italic *fi) = 0; + virtual void *visit_Format_Verbatim(Format_Verbatim *fv) = 0; + virtual void *visit_Format_Underline(Format_Underline *fu) = 0; + virtual void *visit_Format_Strikethrough(Format_Strikethrough *fs) = 0; + virtual void *visit_Text(Text *t) = 0; }; #endif diff --git a/gens.h b/gens.h index 6ffed04..8a14ba3 100644 --- a/gens.h +++ b/gens.h @@ -2,24 +2,25 @@ #define GENS_H #include "ast.h" -class gen: public ast_visitor { -public: - virtual ~gen()=default; - virtual void set_file(std::string file_name)=0; - virtual void* visit_Document(Document *d)=0; - virtual void* visit_Block_Table(Block_Table *bt)=0; - virtual void* visit_Block_Code(Block_Code *bc)=0; - virtual void* visit_Block_Line(Block_Line *bl)=0; - virtual void* visit_Heading(Heading *h)=0; - virtual void* visit_List(List *l)=0; - virtual void* visit_MathDisp(MathDisp *md)=0; - virtual void* visit_Line_Word(Line_Word *lw)=0; - virtual void* visit_Link(Link *l)=0; - virtual void* visit_MathInline(MathInline *mi)=0; - virtual void* visit_Format_Bold(Format_Bold *fb)=0; - virtual void* visit_Format_Italic(Format_Italic *fi)=0; - virtual void* visit_Format_Verbatim(Format_Verbatim *fv)=0; - virtual void* visit_Text(Text *t)=0; +class gen : public ast_visitor +{ + public: + virtual ~gen() = default; + virtual void set_file(std::string file_name) = 0; + virtual void *visit_Document(Document *d) = 0; + virtual void *visit_Block_Table(Block_Table *bt) = 0; + virtual void *visit_Block_Code(Block_Code *bc) = 0; + virtual void *visit_Block_Word(Block_Word *bl) = 0; + virtual void *visit_Heading(Heading *h) = 0; + virtual void *visit_List(List *l) = 0; + virtual void *visit_MathDisp(MathDisp *md) = 0; + virtual void *visit_Line_Word(Line_Word *lw) = 0; + virtual void *visit_Link(Link *l) = 0; + virtual void *visit_MathInline(MathInline *mi) = 0; + virtual void *visit_Format_Bold(Format_Bold *fb) = 0; + virtual void *visit_Format_Italic(Format_Italic *fi) = 0; + virtual void *visit_Format_Verbatim(Format_Verbatim *fv) = 0; + virtual void *visit_Text(Text *t) = 0; }; #include "gens/dot.h" diff --git a/gens/dot.cpp b/gens/dot.cpp index be955d9..542b6a1 100644 --- a/gens/dot.cpp +++ b/gens/dot.cpp @@ -1,32 +1,30 @@ +#include "dot.h" +#include "../ast.h" +#include "../gens.h" #include <fstream> #include <iostream> #include <string> -#include "../ast.h" -#include "../gens.h" -#include "dot.h" -dot_gen::~dot_gen() { - out.close(); -} +dot_gen::~dot_gen() { out.close(); } -void dot_gen::set_file(std::string file_name) { - out.open(file_name); -} +void dot_gen::set_file(std::string file_name) { out.open(file_name); } -std::string* dot_gen::new_node() { +std::string *dot_gen::new_node() +{ std::string *o = new std::string(); - *o = "Node"+std::to_string(node_cnt++); + *o = "Node" + std::to_string(node_cnt++); return o; } -void* dot_gen::visit_Document(Document *d) { +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); + 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; } @@ -35,17 +33,21 @@ return NULL; } -void* dot_gen::visit_Block_Table(Block_Table *bt) { +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(); + 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++) { + 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); + 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; } @@ -54,103 +56,138 @@ return b_id; } -void* dot_gen::visit_Block_Code(Block_Code *bc) { +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; + out << *c_id << " [label=\"Block Code(" << bc->get_lang() << ")\"];" + << std::endl; return c_id; } -void* dot_gen::visit_Block_Line(Block_Line *bl) { - std::string *bl_id = new_node(); - std::vector<Line*> *l = bl->get_lines(); - out << *bl_id << " [label=\"Block Line\"];" << std::endl; - for (std::vector<Line*>::size_type i = 0; i < l->size(); i++) { - std::string *ret_id = (std::string*)(*l)[i]->visit(this); - out << *bl_id << "->" << *ret_id << ";" << std::endl; - delete ret_id; - } - return bl_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) { +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); + 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) { +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 << " [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) { +void *dot_gen::visit_MathDisp(MathDisp *md) +{ std::string *md_id = new_node(); - out << *md_id << " [label=\"MathDisp(" << md->get_expr() << ")\"];" << std::endl; + out << *md_id << " [label=\"MathDisp(" << md->get_expr() << ")\"];" + << std::endl; return md_id; } -void* dot_gen::visit_Line_Word(Line_Word *lw) { +void *dot_gen::visit_Line_Word(Line_Word *lw) +{ std::string *lw_id = new_node(); - std::vector<Word*> *w = lw->get_words(); + 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); + 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) { +void *dot_gen::visit_MathInline(MathInline *mi) +{ std::string *mi_id = new_node(); - out << *mi_id << " [label=\"Math Inline(" << mi->get_expr() << ")\"];" << std::endl; + out << *mi_id << " [label=\"Math Inline(" << mi->get_expr() << ")\"];" + << std::endl; return mi_id; } -void* dot_gen::visit_Link(Link *l) { +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; + out << *l_id << " [label=\"Link(" << l->get_link() << "," + << l->get_text() << ")\"];" << std::endl; return l_id; } -void* dot_gen::visit_Text(Text *t) { +void *dot_gen::visit_Text(Text *t) +{ std::string *t_id = new_node(); - out << *t_id << " [label=\"Text(" << t->get_text() << ")\"];" << std::endl; + out << *t_id << " [label=\"Text(" << t->get_text() << ")\"];" + << std::endl; return t_id; } -void* dot_gen::visit_Format_Bold(Format_Bold *fb) { +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); + 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) { +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); + 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) { +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); + 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; +} diff --git a/gens/dot.h b/gens/dot.h index 7c01fd5..d3975ff 100644 --- a/gens/dot.h +++ b/gens/dot.h @@ -1,29 +1,33 @@ #ifndef DOT_H #define DOT_H -#include <fstream> #include "../ast.h" #include "../gens.h" +#include <fstream> -class dot_gen: public gen { +class dot_gen : public gen +{ std::ofstream out; int node_cnt; -public: + + public: ~dot_gen(); void set_file(std::string file_name); - std::string* new_node(); - void* visit_Document(Document *d); - void* visit_Block_Table(Block_Table *bt); - void* visit_Block_Code(Block_Code *bc); - void* visit_Block_Line(Block_Line *bl); - void* visit_Heading(Heading *h); - void* visit_List(List *l); - void* visit_MathDisp(MathDisp *md); - void* visit_Line_Word(Line_Word *lw); - void* visit_MathInline(MathInline *mi); - void* visit_Link(Link *l); - void* visit_Text(Text *t); - void* visit_Format_Bold(Format_Bold *fb); - void* visit_Format_Italic(Format_Italic *fi); - void* visit_Format_Verbatim(Format_Verbatim *fv); + std::string *new_node(); + void *visit_Document(Document *d); + void *visit_Block_Table(Block_Table *bt); + void *visit_Block_Code(Block_Code *bc); + void *visit_Block_Word(Block_Word *bl); + void *visit_Heading(Heading *h); + void *visit_List(List *l); + void *visit_MathDisp(MathDisp *md); + void *visit_Line_Word(Line_Word *lw); + void *visit_MathInline(MathInline *mi); + void *visit_Link(Link *l); + void *visit_Text(Text *t); + void *visit_Format_Bold(Format_Bold *fb); + void *visit_Format_Italic(Format_Italic *fi); + void *visit_Format_Verbatim(Format_Verbatim *fv); + void *visit_Format_Strikethrough(Format_Strikethrough *fs); + void *visit_Format_Underline(Format_Underline *fu); }; #endif diff --git a/main.cpp b/main.cpp index 9105006..7b9abdd 100644 --- a/main.cpp +++ b/main.cpp @@ -1,14 +1,14 @@ -#include <iostream> -#include <string> #include "ast.h" #include "gens.h" #include "parsers.h" +#include <iostream> +#include <string> -int main(int argc, char** argv) +int main(int argc, char **argv) { Document *d; parser *p = new tester(); - gen *g = new dot_gen(); + dot_gen *g = new dot_gen(); g->set_file("temp.dot"); d = p->parse(); d->visit(g); diff --git a/parsers/tester.cpp b/parsers/tester.cpp index bfbdbda..74b2195 100644 --- a/parsers/tester.cpp +++ b/parsers/tester.cpp @@ -1,51 +1,51 @@ -#include <string> -#include "../ast.h" #include "tester.h" +#include "../ast.h" +#include <string> -void tester::set_file(std::string file_name) +void tester::set_file(std::string file_name) { return; } + +Document *tester::parse() { - return; -} + Document *d = new Document("a", "b", "c"); -Document* tester::parse() -{ - Document *d = new Document("a","b","c"); - - //block line test - Block_Line *bl = new Block_Line(); Line_Word *lw = new Line_Word(); - d->add_block(bl); - bl->add_line(lw); + Block_Word *bw = new Block_Word(lw); + d->add_block(bw); + + // Formats lw->add_word(new Format_Bold(new Text("Bold"))); lw->add_word(new Format_Italic(new Text("Italic"))); lw->add_word(new Format_Verbatim(new Text("Verbatim"))); lw->add_word(new Text("Text")); - lw->add_word(new Format_Bold(new Format_Italic(new Text("BoldItalic")))); - lw->add_word(new MathInline("1+1=2")); - lw->add_word(new Link("link","text")); + lw->add_word( + new Format_Bold(new Format_Italic(new Text("BoldItalic")))); + lw->add_word(new Format_Strikethrough(new Text("Strikethrough"))); + lw->add_word(new Format_Underline(new Text("Underline"))); - //heading test + // Other words + lw->add_word(new MathInline("1+1=2")); + lw->add_word(new Link("link", "text")); + bw->add_word(new MathDisp("1+1=2")); + + // heading test lw = new Line_Word(); lw->add_word(new Text("heading")); Heading *h = new Heading(1, lw); - bl->add_line(h); + bw->add_word(h); - //list test + // list test lw = new Line_Word(); lw->add_word(new Text("ordered")); - List *l = new List(1,1,lw); - bl->add_line(l); + List *l = new List(1, 1, lw); + bw->add_word(l); lw = new Line_Word(); lw->add_word(new Text("unordered")); - l = new List(1,0,lw); - bl->add_line(l); + l = new List(1, 0, lw); + bw->add_word(l); - //mathdisp test - bl->add_line(new MathDisp("1+1=2")); - - //table test + // table test Block_Table *bt = new Block_Table(); - std::vector<Line_Word*>* row = new std::vector<Line_Word*>(); + std::vector<Line_Word *> *row = new std::vector<Line_Word *>(); lw = new Line_Word(); lw->add_word(new Text("Table1")); row->push_back(lw); @@ -53,7 +53,7 @@ lw->add_word(new Text("Table2")); row->push_back(lw); bt->add_row(row); - row = new std::vector<Line_Word*>(); + row = new std::vector<Line_Word *>(); lw = new Line_Word(); lw->add_word(new Text("Table3")); row->push_back(lw); @@ -63,7 +63,7 @@ bt->add_row(row); d->add_block(bt); - //code test + // code test Block_Code *bc = new Block_Code("C"); bc->add_line("#include <stdio.h>"); bc->add_line("int main(void)\n{\nprintf(\"Hello World!\\n\");\n}"); diff --git a/spec.org b/spec.org index 32ca5da..ddff731 100644 --- a/spec.org +++ b/spec.org @@ -18,12 +18,12 @@ - Link :: Link to other place, containing link text and link destination Document: Block* -Block: Table | Line* | Code +Block: Table | Word* | Code Table: Word* (2d array) Code: Straight strings -Line: Heading | List | Word* | MathDisp -Word: MathInline | Link | Format -Format: Bold | Italic | Verbatim | Text +# Line: Heading | List | Word* | MathDisp +Word: MathInline | Link | Format | Heading | List | MathDisp +Format: Bold | Italic | Verbatim | Text | Underline | Strikethrough Italic: Format Bold: Format Verbatim: Format @@ -61,6 +61,8 @@ Italic is between ~/ /~. Bold is between ~* *~. Verbatim is between ~\~ \~~. +Strikethrough is ~+ +~. +Underline is ~_ _~. *** Link Links are ~[[destination][text]]~. *** Comments -- Gitblit v1.10.0