From c4c28eff5ddca866efc0998612fe737f45544842 Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Tue, 20 Jul 2021 14:02:29 +0000
Subject: [PATCH] Updated ast to store strings rather than string pointers

---
 ast.h            |  112 +++++++++---------
 gens/dot.h       |    5 
 ast.cpp          |  145 ++++++++++++++---------
 Makefile         |   15 +-
 parsers/Makefile |    4 
 gens.h           |   24 ++++
 gens/Makefile    |    2 
 gens/dot.cpp     |   39 +++---
 8 files changed, 199 insertions(+), 147 deletions(-)

diff --git a/Makefile b/Makefile
index 84ac690..28b96ea 100644
--- a/Makefile
+++ b/Makefile
@@ -10,24 +10,25 @@
 
 OBJS-top=$(patsubst %,$(BUILD_DIR)/%,$(_OBJS-top))
 
-.PHONY: directories parser gen clean
+.PHONY: parser gen clean default all
 
-default: docconv directories
+default: docconv $(BUILD_DIR)
+all: default
 
 docconv: parser gen $(OBJS-top)
 	$(CXX) $(CXXFLAGS) -o $@ $(BUILD_DIR)/*.o
 
 $(BUILD_DIR)/%.o: %.cpp
-	$(CXX) -c $(CXXFLAGS) -o $@ $<
+	$(CXX) -c $(CXXFLAGS) -o $@ $^
 
-parser: directories
+parser: $(BUILD_DIR)
 	$(MAKE) -C parsers
 
-gen: directories
+gen: $(BUILD_DIR)
 	$(MAKE) -C gens
 
-directories:
-	mkdir -p $(BUILD_DIR)
+$(BUILD_DIR):
+	mkdir -p $@
 
 clean:
 	rm -rf $(BUILD_DIR)
diff --git a/ast.cpp b/ast.cpp
index 64fa1ad..57bd9ae 100644
--- a/ast.cpp
+++ b/ast.cpp
@@ -2,33 +2,29 @@
 #include <string>
 #include "ast.h"
 
-MathInline::MathInline(std::string *e) {
+MathInline::MathInline(std::string e) {
 	expr = e;
 }
-MathInline::~MathInline() {
-	delete expr;
-}
-std::string* MathInline::get_expr() {
+std::string MathInline::get_expr() {
 	return expr;
 }
 void* MathInline::visit(ast_visitor *v) {
 	return v->visit_MathInline(this);
 }
 
-Link::Link(std::string *l, std::string *t) {
+Link::Link(std::string l, std::string t) {
 	link = l;
 	text = t;
 }
-Link::~Link() {
-	delete link;
-	delete text;
-}
-std::string* Link::get_link() {
+
+std::string Link::get_link() {
 	return link;
 }
-std::string* Link::get_text() {
+
+std::string Link::get_text() {
 	return text;
 }
+
 void* Link::visit(ast_visitor *v) {
 	return v->visit_Link(this);
 }
@@ -36,9 +32,11 @@
 Text::Text(std::string tt) {
 	t=tt;
 }
-std::string* Text::get_text() {
-	return &t;
+
+std::string Text::get_text() {
+	return t;
 }
+
 void* Text::visit(ast_visitor *v) {
 	return v->visit_Text(this);
 }
@@ -46,12 +44,15 @@
 Format_Bold::Format_Bold(Format* ff) {
 	f=ff;
 }
+
 Format_Bold::~Format_Bold() {
 	delete f;
 }
+
 Format* Format_Bold::get_f() {
 	return f;
 }
+
 void* Format_Bold::visit(ast_visitor *v) {
 	return v->visit_Format_Bold(this);
 }
@@ -59,12 +60,15 @@
 Format_Italic::Format_Italic(Format* ff) {
 	f=ff;
 }
+
 Format_Italic::~Format_Italic() {
 	delete f;
 }
+
 Format* Format_Italic::get_f() {
 	return f;
 }
+
 void* Format_Italic::visit(ast_visitor *v) {
 	return v->visit_Format_Italic(this);
 }
@@ -72,69 +76,74 @@
 Format_Verbatim::Format_Verbatim(Format* ff) {
 	f=ff;
 }
+
 Format_Verbatim::~Format_Verbatim() {
 	delete f;
 }
+
 Format* Format_Verbatim::get_f() {
 	return f;
 }
+
 void* Format_Verbatim::visit(ast_visitor *v) {
 	return v->visit_Format_Verbatim(this);
 }
 
-Heading::Heading(int l, std::vector<Word*> w) {
+Heading::Heading(int l, Line_Word *w) {
 	level = l;
 	words = w;
 }
+
 Heading::~Heading() {
-	for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) {
-		delete words[i];
-	}
-	words.clear();
+	delete words;
 }
+
 int Heading::get_level() {
 	return level;
 }
-std::vector<Word*>* Heading::get_words() {
-	return &words;
+
+Line_Word* Heading::get_words() {
+	return words;
 }
+
 void* Heading::visit(ast_visitor *v) {
 	return v->visit_Heading(this);
 }
 
-List::List(int l, int n, std::vector<Word*> w) {
+List::List(int l, int n, Line_Word *w) {
 	level = l;
 	number = n;
 	words = w;
 }
+
 List::~List() {
-	for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) {
-		delete words[i];
-	}
-	words.clear();
+	delete words;
 }
+
 int List::get_level() {
 	return level;
 }
+
 int List::get_number() {
 	return number;
 }
-std::vector<Word*>* List::get_words() {
-	return &words;
+
+Line_Word* List::get_words() {
+	return words;
 }
+
 void* List::visit(ast_visitor *v) {
 	return v->visit_List(this);
 }
 
-MathDisp::MathDisp(std::string *e) {
+MathDisp::MathDisp(std::string e) {
 	expr = e;
 }
-MathDisp::~MathDisp() {
-	delete expr;
-}
-std::string* MathDisp::get_expr() {
+
+std::string MathDisp::get_expr() {
 	return expr;
 }
+
 void* MathDisp::visit(ast_visitor *v) {
 	return v->visit_MathDisp(this);
 }
@@ -145,55 +154,70 @@
 	}
 	words.clear();
 }
+
 int Line_Word::add_word(Word *w) {
 	words.push_back(w);
 	return 0;
 }
+
 std::vector<Word*>* Line_Word::get_words() {
 	return &words;
 }
+
 void* Line_Word::visit(ast_visitor *v) {
 	return v->visit_Line_Word(this);
 }
 
 Block_Table::~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];
+	for (std::vector<std::vector<Line_Word*>*>::size_type i = 0; i < table.size(); i++) {
+		std::vector<Line_Word*> *t = table[i];
+		for (std::vector<Line_Word*>::size_type j = 0; j < t->size(); j++) {
+			delete (*t)[j];
 		}
-		table[i].clear();
+		table[i]->clear();
 	}
 	table.clear();
 }
-std::vector<std::vector<Line_Word*>> Block_Table::get_table() {
-	return table;
+
+std::vector<std::vector<Line_Word*>*>* Block_Table::get_table() {
+	return &table;
 }
-int Block_Table::add_row(std::vector<Line_Word*> row) {
+
+int Block_Table::add_row(std::vector<Line_Word*>* row) {
 	table.push_back(row);
 	return 0;
 }
+
+std::vector<Line_Word*>* Block_Table::get_row(std::vector<Line_Word*>::size_type i) {
+	if (i < table.size()) {
+		return table[i];
+	} else {
+		return NULL;
+	}
+}
+
 void* Block_Table::visit(ast_visitor *v) {
 	return v->visit_Block_Table(this);
 }
 
-Block_Code::Block_Code(std::string *l) {
+Block_Code::Block_Code(std::string l) {
 	lang = l;
-	c = new std::string();
+	c = "";
 }
-Block_Code::~Block_Code() {
-	delete c;
-	delete lang;
-}
-int Block_Code::add_line(std::string *add) {
-	*c = *c + *add + "\n";
+
+int Block_Code::add_line(std::string add) {
+	c = c + add + "\n";
 	return 0;
 }
-std::string* Block_Code::get_lang() {
+
+std::string Block_Code::get_lang() {
 	return lang;
 }
-std::string* Block_Code::get_code() {
+
+std::string Block_Code::get_code() {
 	return c;
 }
+
 void* Block_Code::visit(ast_visitor *v) {
 	return v->visit_Block_Code(this);
 }
@@ -204,47 +228,54 @@
 	}
 	lines.clear();
 }
+
 std::vector<Line*>* Block_Line::get_lines() {
 	return &lines;
 }
+
 int Block_Line::add_line(Line* l) {
 	lines.push_back(l);
 	return 0;
 }
+
 void* Block_Line::visit(ast_visitor *v) {
 	return v->visit_Block_Line(this);
 }
 
-Document::Document(std::string *t, std::string *a, std::string *d) {
+Document::Document(std::string t, std::string a, std::string d) {
 	title = t;
 	author = a;
 	date = d;
 }
+
 Document::~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* Document::get_title() {
+
+std::string Document::get_title() {
 	return title;
 }
-std::string* Document::get_author() {
+
+std::string Document::get_author() {
 	return author;
 }
-std::string* Document::get_date() {
+
+std::string Document::get_date() {
 	return date;
 }
+
 std::vector<Block*>* Document::get_blocks() {
 	return &blocks;
 }
+
 int Document::add_block(Block *b) {
 	blocks.push_back(b);
 	return 0;
 }
+
 void* Document::visit(ast_visitor *v) {
 	return v->visit_Document(this);
 }
diff --git a/ast.h b/ast.h
index ccc5e74..41ef05e 100644
--- a/ast.h
+++ b/ast.h
@@ -33,21 +33,19 @@
 class Word: public ast_node {};
 
 class MathInline: public Word {
-	std::string *expr;
+	std::string expr;
 public:
-	MathInline(std::string *e);
-	~MathInline();
-	std::string* get_expr();
+	MathInline(std::string e);
+	std::string get_expr();
 	void* visit(ast_visitor *v);
 };
 
 class Link: public Word {
-	std::string *link, *text;
+	std::string link, text;
 public:
-	Link(std::string *l, std::string *t);
-	~Link();
-	std::string* get_link();
-	std::string* get_text();
+	Link(std::string l, std::string t);
+	std::string get_link();
+	std::string get_text();
 	void* visit(ast_visitor *v);
 };
 
@@ -57,7 +55,7 @@
 	std::string t;
 public:
 	Text(std::string tt);
-	std::string* get_text();
+	std::string get_text();
 	void* visit(ast_visitor *v);
 };
 
@@ -89,38 +87,6 @@
 };
 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:
@@ -130,26 +96,58 @@
 	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;
+	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<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;
+	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();
+	Block_Code(std::string l);
+	int add_line(std::string add);
+	std::string get_lang();
+	std::string get_code();
 	void* visit(ast_visitor *v);
 };
 
@@ -163,14 +161,14 @@
 };
 
 class Document: public ast_node {
-	std::string *title, *author, *date;
+	std::string title, author, date;
 	std::vector<Block*> blocks;
 public:
-	Document(std::string *t, std::string *a, std::string *d);
+	Document(std::string t, std::string a, std::string d);
 	~Document();
-	std::string* get_title();
-	std::string* get_author();
-	std::string* get_date();
+	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);
diff --git a/gens.h b/gens.h
index f48784f..d69d229 100644
--- a/gens.h
+++ b/gens.h
@@ -1 +1,25 @@
+#ifndef GENS_H
+#define GENS_H
+#include "ast.h"
+
+class gen: public ast_visitor {
+public:
+	virtual void set_file(std::string file_name)=0;
+	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;
+};
+
 #include "gens/dot.h"
+#endif
diff --git a/gens/Makefile b/gens/Makefile
index 1112400..d901d07 100644
--- a/gens/Makefile
+++ b/gens/Makefile
@@ -5,4 +5,4 @@
 default: $(OBJS-gen)
 
 $(BUILD_DIR)/%.o: %.cpp
-	$(CXX) -c $(CXXFLAGS) -o $@ $<
+	$(CXX) -c $(CXXFLAGS) -o $@ $^
diff --git a/gens/dot.cpp b/gens/dot.cpp
index 9f987b7..e7fe3ef 100644
--- a/gens/dot.cpp
+++ b/gens/dot.cpp
@@ -3,15 +3,16 @@
 #include <string>
 #include "../ast.h"
 #include "../gens.h"
-
-dot_gen::dot_gen(std::string fname) {
-	out.open(fname);
-}
+#include "dot.h"
 
 dot_gen::~dot_gen() {
 	out.close();
 }
 
+void dot_gen::set_file(std::string file_name) {
+	out.open(file_name);
+}
+
 std::string* dot_gen::new_node() {
 	std::string *o = new std::string();
 	*o = "Node"+std::to_string(node_cnt++);
@@ -42,7 +43,7 @@
 
 void* dot_gen::visit_Block_Code(Block_Code *bc) {
 	std::string *c_id = new_node();
-	out << *c_id << " [label=\"Block Code(" << *(bc->get_lang()) << ")];" << std::endl;
+	out << *c_id << " [label=\"Block Code(" << bc->get_lang() << ")\"];" << std::endl;
 	return c_id;
 }
 
@@ -60,31 +61,27 @@
 
 void* dot_gen::visit_Heading(Heading *h) {
 	std::string *h_id = new_node();
-	std::vector<Word*> *w = h->get_words();
+	Line_Word *w = h->get_words();
 	out << *h_id << " [label=\"Heading\"];" << std::endl;
-	for (std::vector<Word*>::size_type i = 0; i < w->size(); i++) {
-		std::string *ret_id = (std::string*)(*w)[i]->visit(this);
-		out << *h_id << "->" << *ret_id << ";" << std::endl;
-		delete ret_id;
-	}
+	std::string *ret_id = (std::string*)w->visit(this);
+	out << *h_id << "->" << *ret_id << ";" << std::endl;
+	delete ret_id;
 	return h_id;
 }
 
 void* dot_gen::visit_List(List *l) {
 	std::string *l_id = new_node();
-	std::vector<Word*> *w = l->get_words();
-	out << *l_id << " [label=\"List(l: " << l->get_level() << ", n:" << l->get_number() << "\"];" << std::endl;
-	for (std::vector<Word*>::size_type i = 0; i < w->size(); i++) {
-		std::string *ret_id = (std::string*)(*w)[i]->visit(this);
-		out << *l_id << "->" << *ret_id << ";" << std::endl;
-		delete ret_id;
-	}
+	Line_Word *w = l->get_words();
+	out << *l_id << " [label=\"List(l: " << l->get_level() << ", n:" << l->get_number() << ")\"];" << std::endl;
+	std::string *ret_id = (std::string*)w->visit(this);
+	out << *l_id << "->" << *ret_id << ";" << std::endl;
+	delete ret_id;
 	return l_id;
 }
 
 void* dot_gen::visit_MathDisp(MathDisp *md) {
 	std::string *md_id = new_node();
-	out << *md_id << " [label=\"MathDisp(" << *(md->get_expr()) << ")\"];" << std::endl;
+	out << *md_id << " [label=\"MathDisp(" << md->get_expr() << ")\"];" << std::endl;
 	return md_id;
 }
 
@@ -102,7 +99,7 @@
 
 void* dot_gen::visit_MathInline(MathInline *mi) {
 	std::string *mi_id = new_node();
-	out << *mi_id << " [label=\"Math Inline(" << *(mi->get_expr()) << ")];" << std::endl;
+	out << *mi_id << " [label=\"Math Inline(" << mi->get_expr() << ")\"];" << std::endl;
 	return mi_id;
 }
 
@@ -114,7 +111,7 @@
 
 void* dot_gen::visit_Text(Text *t) {
 	std::string *t_id = new_node();
-	out << *t_id << " [label=\"Text(" << *(t->get_text()) << ")\"];" << std::endl;
+	out << *t_id << " [label=\"Text(" << t->get_text() << ")\"];" << std::endl;
 	return t_id;
 }
 
diff --git a/gens/dot.h b/gens/dot.h
index 748215e..7c01fd5 100644
--- a/gens/dot.h
+++ b/gens/dot.h
@@ -2,13 +2,14 @@
 #define DOT_H
 #include <fstream>
 #include "../ast.h"
+#include "../gens.h"
 
-class dot_gen: public ast_visitor {
+class dot_gen: public gen {
 	std::ofstream out;
 	int node_cnt;
 public:
-	dot_gen(std::string fname);
 	~dot_gen();
+	void set_file(std::string file_name);
 	std::string* new_node();
 	void* visit_Document(Document *d);
 	void* visit_Block_Table(Block_Table *bt);
diff --git a/parsers/Makefile b/parsers/Makefile
index b7186a3..b266792 100644
--- a/parsers/Makefile
+++ b/parsers/Makefile
@@ -1,8 +1,8 @@
-_OBJS-par=
+_OBJS-par=tester.o
 
 export OBJS-par=$(patsubst %,$(BUILD_DIR)/%,$(_OBJS-par))
 
 default: $(OBJS-par)
 
 $(BUILD_DIR)/%.o: %.cpp
-	$(CXX) -c $(CXXFLAGS) -o $@ $<
+	$(CXX) -c $(CXXFLAGS) -o $@ $^

--
Gitblit v1.10.0