From 538459a8abf62bc85cc73b9e4eab9c29f732b282 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Tue, 20 Jul 2021 14:02:56 +0000
Subject: [PATCH] Added test document parser to check generators

---
 ast.h |  511 ++++++++++++++++++-------------------------------------
 1 files changed, 170 insertions(+), 341 deletions(-)

diff --git a/ast.h b/ast.h
index 613b5c4..41ef05e 100644
--- a/ast.h
+++ b/ast.h
@@ -3,26 +3,176 @@
 #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;
+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 Line: public ast_node {};
+
+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 Heading: public Line {
+	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 Line {
+	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 Line {
+	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_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:
@@ -41,325 +191,4 @@
 	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