#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); ~MathInline(); 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); ~Link(); 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 Line: public ast_node {}; class Heading: public Line { int level; std::vector words; public: Heading(int l, std::vector w); ~Heading(); int get_level(); std::vector* get_words(); void* visit(ast_visitor *v); }; class List: public Line { int level, number; std::vector words; public: List(int l, int n, std::vector w); ~List(); int get_level(); int get_number(); std::vector* get_words(); void* visit(ast_visitor *v); }; class MathDisp: public Line { std::string *expr; public: MathDisp(std::string *e); ~MathDisp(); std::string* get_expr(); void* visit(ast_visitor *v); }; class Line_Word: public Line { std::vector words; public: ~Line_Word(); int add_word(Word *w); std::vector* get_words(); 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); void* visit(ast_visitor *v); }; class Block_Code: public Block { std::string *c; std::string *lang; public: Block_Code(std::string *l); ~Block_Code(); int add_line(std::string *add); std::string* get_lang(); std::string* get_code(); void* visit(ast_visitor *v); }; class Block_Line: public Block { std::vector lines; public: ~Block_Line(); std::vector* get_lines(); int add_line(Line* l); 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_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; }; #endif