#ifndef AST_H #define AST_H #include #include // class ast_node; class ast_visitor; // class Document; // class Block; // class Block_Table; // class Block_Code; // class Block_Line; // class Line; // class Word; // class Heading; // class List; // class MathDisp; // class Line_Word; // class Link; // class MathInline; // class Format; // class Format_Bold; // class Format_Italic; // class Format_Verbatim; // class Text; class ast_node { public: virtual ~ast_node() = default; virtual void *visit(ast_visitor *v) = 0; }; class Word : public ast_node { }; class MathInline : public Word { std::string expr; public: MathInline(std::string e); std::string get_expr(); void *visit(ast_visitor *v); }; class Link : public Word { std::string link, text; public: Link(std::string l, std::string t); std::string get_link(); std::string get_text(); void *visit(ast_visitor *v); }; class Format : public Word { }; class Text : public Format { std::string t; public: Text(std::string tt); std::string get_text(); void *visit(ast_visitor *v); }; class Format_Bold : public Format { Format *f; public: Format_Bold(Format *ff); ~Format_Bold(); Format *get_f(); void *visit(ast_visitor *v); }; class Format_Italic : public Format { Format *f; public: Format_Italic(Format *ff); ~Format_Italic(); Format *get_f(); void *visit(ast_visitor *v); }; class Format_Verbatim : public Format { Format *f; 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 words; public: ~Line_Word(); int add_word(Word *w); std::vector *get_words(); void *visit(ast_visitor *v); }; class Heading : public Word { int level; Line_Word *words; public: Heading(int l, Line_Word *w); ~Heading(); int get_level(); Line_Word *get_words(); void *visit(ast_visitor *v); }; class List : public Word { int level, number; Line_Word *words; 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); }; class MathDisp : public Word { std::string expr; public: MathDisp(std::string e); std::string get_expr(); void *visit(ast_visitor *v); }; class Block : public ast_node { }; class Block_Table : public Block { std::vector *> table; public: ~Block_Table(); std::vector *> *get_table(); int add_row(std::vector *row); std::vector * get_row(std::vector::size_type i); void *visit(ast_visitor *v); }; class Block_Code : public Block { std::string c; std::string lang; 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); }; 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 { std::string title, author, date; std::vector 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 *get_blocks(); int add_block(Block *b); 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_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