#ifndef AST_H
|
#define AST_H
|
#include <string>
|
#include <vector>
|
|
// 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<Word *> words;
|
|
public:
|
~Line_Word();
|
int add_word(Word *w);
|
std::vector<Word *> *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<std::vector<Line_Word *> *> table;
|
|
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);
|
};
|
|
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<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_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
|