#ifndef AST_H
|
#define AST_H
|
#include <vector>
|
#include <string>
|
|
//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<Word*> words;
|
public:
|
Heading(int l, std::vector<Word*> w);
|
~Heading();
|
int get_level();
|
std::vector<Word*>* get_words();
|
void* visit(ast_visitor *v);
|
};
|
|
class List: public Line {
|
int level, number;
|
std::vector<Word*> words;
|
public:
|
List(int l, int n, std::vector<Word*> w);
|
~List();
|
int get_level();
|
int get_number();
|
std::vector<Word*>* 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<Word*> words;
|
public:
|
~Line_Word();
|
int add_word(Word *w);
|
std::vector<Word*>* get_words();
|
void* visit(ast_visitor *v);
|
};
|
|
class Block: public ast_node {};
|
|
class Block_Table: public Block {
|
std::vector<std::vector<Line_Word*>> table;
|
public:
|
~Block_Table();
|
std::vector<std::vector<Line_Word*>> get_table();
|
int add_row(std::vector<Line_Word*> 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<Line*> lines;
|
public:
|
~Block_Line();
|
std::vector<Line*>* get_lines();
|
int add_line(Line* l);
|
void* visit(ast_visitor *v);
|
};
|
|
class Document: public ast_node {
|
std::string *title, *author, *date;
|
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();
|
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
|