From bae0bb3362eb735294e41bb6fbf6eede480a5d70 Mon Sep 17 00:00:00 2001 From: Joel Grunbaum <joelgrun@gmail.com> Date: Tue, 13 Jul 2021 12:54:34 +0000 Subject: [PATCH] ast classes --- ast.h | 365 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 365 insertions(+), 0 deletions(-) diff --git a/ast.h b/ast.h new file mode 100644 index 0000000..613b5c4 --- /dev/null +++ b/ast.h @@ -0,0 +1,365 @@ +#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_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_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) { + expr = e; + } + ~MathInline() { + delete expr; + } + std::string *get_expr() { + return expr; + } + void* visit(ast_visitor *v) { + return v->visit_MathInline(this); + } +}; + +class Link: public Word { + std::string *link, *text; +public: + Link(std::string *l, std::string *t) { + link = l; + text = t; + } + ~Link() { + delete link; + delete text; + } + std::string *get_link() { + return link; + } + std::string *get_text() { + return text; + } + void* visit(ast_visitor *v) { + return v->visit_Link(this); + } +}; + +class Format: public Word {}; + +class Text: public Format { + std::string t; +public: + Text(std::string tt) { + t=tt; + } + std::string *get_text() { + return &t; + } + void* visit(ast_visitor *v) { + return v->visit_Text(this); + } +}; + +class Format_Bold: public Format { + Format *f; +public: + Format_Bold(Format* ff) { + f=ff; + } + ~Format_Bold() { + delete f; + } + Format *get_f() { + return f; + } + void* visit(ast_visitor *v) { + return v->visit_Format_Bold(this); + } +}; + +class Format_Italic: public Format { + Format *f; +public: + Format_Italic(Format* ff) { + f=ff; + } + ~Format_Italic() { + delete f; + } + Format *get_f() { + return f; + } + void* visit(ast_visitor *v) { + return v->visit_Format_Italic(this); + } +}; + +class Format_Verbatim: public Format { + Format *f; +public: + Format_Verbatim(Format* ff) { + f=ff; + } + ~Format_Verbatim() { + delete f; + } + Format *get_f() { + return f; + } + void* visit(ast_visitor *v) { + return v->visit_Format_Verbatim(this); + } +}; +class Line: public ast_node {}; + +class Heading: public Line { + int level; + std::vector<Word*> words; +public: + Heading(int l, std::vector<Word*> w) { + level = l; + words = w; + } + ~Heading() { + for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) { + delete words[i]; + } + words.clear(); + } + int get_level() { + return level; + } + std::vector<Word*>* get_words() { + return &words; + } + void* visit(ast_visitor *v) { + return v->visit_Heading(this); + } +}; + +class List: public Line { + int level, number; + std::vector<Word*> words; +public: + List(int l, int n, std::vector<Word*> w) { + level = l; + number = n; + words = w; + } + ~List() { + for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) { + delete words[i]; + } + words.clear(); + } + int get_level() { + return level; + } + int get_number() { + return number; + } + std::vector<Word*>* get_words() { + return &words; + } + void* visit(ast_visitor *v) { + return v->visit_List(this); + } +}; + +class MathDisp: public Line { + std::string *expr; +public: + MathDisp(std::string *e) { + expr = e; + } + ~MathDisp() { + delete expr; + } + std::string *get_expr() { + return expr; + } + void* visit(ast_visitor *v) { + return v->visit_MathDisp(this); + } +}; + +class Line_Word: public Line { + std::vector<Word*> words; +public: + ~Line_Word() { + for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) { + delete words[i]; + } + words.clear(); + } + int add_word(Word *w) { + words.push_back(w); + return 0; + } + std::vector<Word*> *get_words() { + return &words; + } + void* visit(ast_visitor *v) { + return v->visit_Line_Word(this); + } +}; + +class Block: public ast_node {}; + +class Block_Table: public Block { + std::vector<std::vector<Line_Word*>> table; +public: + ~Block_Table() { + for (std::vector<std::vector<Line_Word*>>::size_type i = 0; i < table.size(); i++) { + for (std::vector<Line_Word*>::size_type j = 0; j < table[i].size(); j++) { + delete table[i][j]; + } + table[i].clear(); + } + table.clear(); + } + std::vector<std::vector<Line_Word*>> get_table() { + return table; + } + int add_row(std::vector<Line_Word*> row) { + table.push_back(row); + return 0; + } + void* visit(ast_visitor *v) { + return v->visit_Block_Table(this); + } +}; + +class Block_Code: public Block { + std::string *c; + std::string *lang; +public: + Block_Code(std::string *l) { + lang = l; + c = new std::string(); + } + ~Block_Code() { + delete c; + delete lang; + } + int add_line(std::string *add) { + *c = *c + *add + "\n"; + return 0; + } + std::string *get_lang() { + return lang; + } + std::string *get_code() { + return c; + } + void* visit(ast_visitor *v) { + return v->visit_Block_Code(this); + } +}; + +class Block_Line: public Block { + std::vector<Line*> lines; +public: + ~Block_Line() { + for (std::vector<Line*>::size_type i = 0; i < lines.size(); i++) { + delete lines[i]; + } + lines.clear(); + } + std::vector<Line*> *get_lines() { + return &lines; + } + int add_line(Line* l) { + lines.push_back(l); + return 0; + } + void* visit(ast_visitor *v) { + return v->visit_Block_Line(this); + } +}; + +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) { + title = t; + author = a; + date = d; + } + ~Document() { + for (std::vector<Block*>::size_type i = 0; i < blocks.size(); i++) { + delete blocks[i]; + } + blocks.clear(); + delete title; + delete author; + delete date; + } + std::string *get_title() { + return title; + } + std::string *get_author() { + return author; + } + std::string *get_date() { + return date; + } + std::vector<Block*> *get_blocks() { + return &blocks; + } + int add_block(Block *b) { + blocks.push_back(b); + return 0; + } + void* visit(ast_visitor *v) { + return v->visit_Document(this); + } + +}; +#endif -- Gitblit v1.10.0