From ca483d438742be9650a5045e846b974f57c67e4f Mon Sep 17 00:00:00 2001
From: Joel Grunbaum <joelgrun@gmail.com>
Date: Thu, 12 Aug 2021 10:05:25 +0000
Subject: [PATCH] Format code, add format for strikethrough and underline, replace line with word

---
 ast.h              |  244 ++++++++++------
 main.cpp           |    8 
 gens/dot.h         |   40 +-
 ast.cpp            |  305 +++++++-------------
 spec.org           |   10 
 gens.h             |   37 +-
 gens/dot.cpp       |  149 ++++++---
 parsers/tester.cpp |   60 ++--
 8 files changed, 434 insertions(+), 419 deletions(-)

diff --git a/ast.cpp b/ast.cpp
index 2c349da..4f7d694 100644
--- a/ast.cpp
+++ b/ast.cpp
@@ -1,177 +1,114 @@
-#include <vector>
-#include <string>
 #include "ast.h"
+#include <string>
+#include <vector>
 
-MathInline::MathInline(std::string e) {
-	expr = e;
-}
-std::string MathInline::get_expr() {
-	return expr;
-}
-void* MathInline::visit(ast_visitor *v) {
-	return v->visit_MathInline(this);
-}
+MathInline::MathInline(std::string e) { expr = e; }
+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;
 }
 
-std::string Link::get_link() {
-	return link;
-}
+std::string Link::get_link() { return link; }
+std::string Link::get_text() { return text; }
+void *Link::visit(ast_visitor *v) { return v->visit_Link(this); }
+Text::Text(std::string tt) { t = tt; }
+std::string Text::get_text() { return t; }
+void *Text::visit(ast_visitor *v) { return v->visit_Text(this); }
+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); }
+Format_Italic::Format_Italic(Format *ff) { f = ff; }
+Format_Italic::~Format_Italic() { delete f; }
+Format *Format_Italic::get_f() { return f; }
 
-std::string Link::get_text() {
-	return text;
-}
-
-void* Link::visit(ast_visitor *v) {
-	return v->visit_Link(this);
-}
-
-Text::Text(std::string tt) {
-	t=tt;
-}
-
-std::string Text::get_text() {
-	return t;
-}
-
-void* Text::visit(ast_visitor *v) {
-	return v->visit_Text(this);
-}
-
-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);
-}
-
-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) {
+void *Format_Italic::visit(ast_visitor *v)
+{
 	return v->visit_Format_Italic(this);
 }
 
-Format_Verbatim::Format_Verbatim(Format* ff) {
-	f=ff;
-}
+Format_Verbatim::Format_Verbatim(Format *ff) { f = ff; }
+Format_Verbatim::~Format_Verbatim() { delete f; }
+Format *Format_Verbatim::get_f() { return f; }
 
-Format_Verbatim::~Format_Verbatim() {
-	delete f;
-}
-
-Format* Format_Verbatim::get_f() {
-	return f;
-}
-
-void* Format_Verbatim::visit(ast_visitor *v) {
+void *Format_Verbatim::visit(ast_visitor *v)
+{
 	return v->visit_Format_Verbatim(this);
 }
 
-Heading::Heading(int l, Line_Word *w) {
+Format_Underline::Format_Underline(Format *ff) { f = ff; }
+Format_Underline::~Format_Underline() { delete f; }
+Format *Format_Underline::get_f() { return f; }
+
+void *Format_Underline::visit(ast_visitor *v)
+{
+	return v->visit_Format_Underline(this);
+}
+
+Format_Strikethrough::Format_Strikethrough(Format *ff) { f = ff; }
+Format_Strikethrough::~Format_Strikethrough() { delete f; }
+Format *Format_Strikethrough::get_f() { return f; }
+
+void *Format_Strikethrough::visit(ast_visitor *v)
+{
+	return v->visit_Format_Strikethrough(this);
+}
+
+Heading::Heading(int l, Line_Word *w)
+{
 	level = l;
 	words = w;
 }
 
-Heading::~Heading() {
-	delete words;
-}
+Heading::~Heading() { delete words; }
+int Heading::get_level() { return level; }
+Line_Word *Heading::get_words() { return words; }
+void *Heading::visit(ast_visitor *v) { return v->visit_Heading(this); }
 
-int Heading::get_level() {
-	return level;
-}
-
-Line_Word* Heading::get_words() {
-	return words;
-}
-
-void* Heading::visit(ast_visitor *v) {
-	return v->visit_Heading(this);
-}
-
-List::List(int l, int n, Line_Word *w) {
+List::List(int l, int n, Line_Word *w)
+{
 	level = l;
 	number = n;
 	words = w;
 }
 
-List::~List() {
-	delete words;
-}
+List::~List() { delete words; }
+int List::get_level() { return level; }
+int List::get_number() { return number; }
+Line_Word *List::get_words() { return words; }
+void *List::visit(ast_visitor *v) { return v->visit_List(this); }
+MathDisp::MathDisp(std::string e) { expr = e; }
+std::string MathDisp::get_expr() { return expr; }
+void *MathDisp::visit(ast_visitor *v) { return v->visit_MathDisp(this); }
 
-int List::get_level() {
-	return level;
-}
-
-int List::get_number() {
-	return number;
-}
-
-Line_Word* List::get_words() {
-	return words;
-}
-
-void* List::visit(ast_visitor *v) {
-	return v->visit_List(this);
-}
-
-MathDisp::MathDisp(std::string e) {
-	expr = e;
-}
-
-std::string MathDisp::get_expr() {
-	return expr;
-}
-
-void* MathDisp::visit(ast_visitor *v) {
-	return v->visit_MathDisp(this);
-}
-
-Line_Word::~Line_Word() {
-	for (std::vector<Word*>::size_type i = 0; i < words.size(); i++) {
+Line_Word::~Line_Word()
+{
+	for (std::vector<Word *>::size_type i = 0; i < words.size(); i++) {
 		delete words[i];
 	}
 	words.clear();
 }
 
-int Line_Word::add_word(Word *w) {
+int Line_Word::add_word(Word *w)
+{
 	words.push_back(w);
 	return 0;
 }
 
-std::vector<Word*>* Line_Word::get_words() {
-	return &words;
-}
+std::vector<Word *> *Line_Word::get_words() { return &words; }
+void *Line_Word::visit(ast_visitor *v) { return v->visit_Line_Word(this); }
 
-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++) {
-		std::vector<Line_Word*> *t = table[i];
-		for (std::vector<Line_Word*>::size_type j = 0; j < t->size(); j++) {
+Block_Table::~Block_Table()
+{
+	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];
 		}
 		t->clear();
@@ -180,16 +117,20 @@
 	table.clear();
 }
 
-std::vector<std::vector<Line_Word*>*>* Block_Table::get_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) {
+std::vector<Line_Word *> *
+Block_Table::get_row(std::vector<Line_Word *>::size_type i)
+{
 	if (i < table.size()) {
 		return table[i];
 	} else {
@@ -197,86 +138,54 @@
 	}
 }
 
-void* Block_Table::visit(ast_visitor *v) {
-	return v->visit_Block_Table(this);
-}
+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 = "";
 }
 
-int Block_Code::add_line(std::string add) {
+int Block_Code::add_line(std::string add)
+{
 	c = c + add + "\n";
 	return 0;
 }
 
-std::string Block_Code::get_lang() {
-	return lang;
-}
+std::string Block_Code::get_lang() { return lang; }
+std::string Block_Code::get_code() { return c; }
+void *Block_Code::visit(ast_visitor *v) { return v->visit_Block_Code(this); }
 
-std::string Block_Code::get_code() {
-	return c;
-}
+Block_Word::Block_Word(Line_Word *lw) { words = lw; }
+Block_Word::~Block_Word() { delete words; }
+int Block_Word::add_word(Word *w) { return words->add_word(w); }
+Line_Word *Block_Word::get_words() { return words; }
+void *Block_Word::visit(ast_visitor *v) { return v->visit_Block_Word(this); }
 
-void* Block_Code::visit(ast_visitor *v) {
-	return v->visit_Block_Code(this);
-}
-
-Block_Line::~Block_Line() {
-	for (std::vector<Line*>::size_type i = 0; i < lines.size(); i++) {
-		delete lines[i];
-	}
-	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++) {
+Document::~Document()
+{
+	for (std::vector<Block *>::size_type i = 0; i < blocks.size(); i++) {
 		delete blocks[i];
 	}
 	blocks.clear();
 }
 
-std::string Document::get_title() {
-	return title;
-}
+std::string Document::get_title() { return title; }
+std::string Document::get_author() { return author; }
+std::string Document::get_date() { return date; }
+std::vector<Block *> *Document::get_blocks() { return &blocks; }
 
-std::string Document::get_author() {
-	return author;
-}
-
-std::string Document::get_date() {
-	return date;
-}
-
-std::vector<Block*>* Document::get_blocks() {
-	return &blocks;
-}
-
-int Document::add_block(Block *b) {
+int Document::add_block(Block *b)
+{
 	blocks.push_back(b);
 	return 0;
 }
 
-void* Document::visit(ast_visitor *v) {
-	return v->visit_Document(this);
-}
+void *Document::visit(ast_visitor *v) { return v->visit_Document(this); }
diff --git a/ast.h b/ast.h
index 41ef05e..91b93f7 100644
--- a/ast.h
+++ b/ast.h
@@ -1,11 +1,11 @@
 #ifndef AST_H
 #define AST_H
-#include <vector>
 #include <string>
+#include <vector>
 
-//class ast_node;
+// class ast_node;
 class ast_visitor;
-//class Document;
+// class Document;
 // class Block;
 // class Block_Table;
 // class Block_Code;
@@ -24,171 +24,233 @@
 // class Format_Verbatim;
 // class Text;
 
-class ast_node {
-public:
-	virtual ~ast_node()=default;
-	virtual void* visit(ast_visitor *v)=0;
+class ast_node
+{
+      public:
+	virtual ~ast_node() = default;
+	virtual void *visit(ast_visitor *v) = 0;
 };
 
-class Word: public ast_node {};
+class Word : public ast_node
+{
+};
 
-class MathInline: public Word {
+class MathInline : public Word
+{
 	std::string expr;
-public:
+
+      public:
 	MathInline(std::string e);
 	std::string get_expr();
-	void* visit(ast_visitor *v);
+	void *visit(ast_visitor *v);
 };
 
-class Link: public Word {
+class Link : public Word
+{
 	std::string link, text;
-public:
+
+      public:
 	Link(std::string l, std::string t);
 	std::string get_link();
 	std::string get_text();
-	void* visit(ast_visitor *v);
+	void *visit(ast_visitor *v);
 };
 
-class Format: public Word {};
+class Format : public Word
+{
+};
 
-class Text: public Format {
+class Text : public Format
+{
 	std::string t;
-public:
+
+      public:
 	Text(std::string tt);
 	std::string get_text();
-	void* visit(ast_visitor *v);
+	void *visit(ast_visitor *v);
 };
 
-class Format_Bold: public Format {
+class Format_Bold : public Format
+{
 	Format *f;
-public:
-	Format_Bold(Format* ff);
+
+      public:
+	Format_Bold(Format *ff);
 	~Format_Bold();
-	Format* get_f();
-	void* visit(ast_visitor *v);
+	Format *get_f();
+	void *visit(ast_visitor *v);
 };
 
-class Format_Italic: public Format {
+class Format_Italic : public Format
+{
 	Format *f;
-public:
-	Format_Italic(Format* ff);
+
+      public:
+	Format_Italic(Format *ff);
 	~Format_Italic();
-	Format* get_f();
-	void* visit(ast_visitor *v);
+	Format *get_f();
+	void *visit(ast_visitor *v);
 };
 
-class Format_Verbatim: public Format {
+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:
+      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);
+	std::vector<Word *> *get_words();
+	void *visit(ast_visitor *v);
 };
 
-class Heading: public Line {
+class Heading : public Word
+{
 	int level;
 	Line_Word *words;
-public:
+
+      public:
 	Heading(int l, Line_Word *w);
 	~Heading();
 	int get_level();
-	Line_Word* get_words();
-	void* visit(ast_visitor *v);
+	Line_Word *get_words();
+	void *visit(ast_visitor *v);
 };
 
-class List: public Line {
+class List : public Word
+{
 	int level, number;
 	Line_Word *words;
-public:
+
+      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);
+	Line_Word *get_words();
+	void *visit(ast_visitor *v);
 };
 
-class MathDisp: public Line {
+class MathDisp : public Word
+{
 	std::string expr;
-public:
+
+      public:
 	MathDisp(std::string e);
 	std::string get_expr();
-	void* visit(ast_visitor *v);
+	void *visit(ast_visitor *v);
 };
 
+class Block : public ast_node
+{
+};
 
-class Block: public ast_node {};
+class Block_Table : public Block
+{
+	std::vector<std::vector<Line_Word *> *> table;
 
-class Block_Table: public Block {
-	std::vector<std::vector<Line_Word*>*> table;
-public:
+      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);
+	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 {
+class Block_Code : public Block
+{
 	std::string c;
 	std::string lang;
-public:
+
+      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);
+	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 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 {
+class Document : public ast_node
+{
 	std::string title, author, date;
-	std::vector<Block*> blocks;
-public:
+	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();
+	std::vector<Block *> *get_blocks();
 	int add_block(Block *b);
-	void* visit(ast_visitor *v);
+	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;
+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
diff --git a/gens.h b/gens.h
index 6ffed04..8a14ba3 100644
--- a/gens.h
+++ b/gens.h
@@ -2,24 +2,25 @@
 #define GENS_H
 #include "ast.h"
 
-class gen: public ast_visitor {
-public:
-	virtual ~gen()=default;
-	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;
+class gen : public ast_visitor
+{
+      public:
+	virtual ~gen() = default;
+	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_Word(Block_Word *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"
diff --git a/gens/dot.cpp b/gens/dot.cpp
index be955d9..542b6a1 100644
--- a/gens/dot.cpp
+++ b/gens/dot.cpp
@@ -1,32 +1,30 @@
+#include "dot.h"
+#include "../ast.h"
+#include "../gens.h"
 #include <fstream>
 #include <iostream>
 #include <string>
-#include "../ast.h"
-#include "../gens.h"
-#include "dot.h"
 
-dot_gen::~dot_gen() {
-	out.close();
-}
+dot_gen::~dot_gen() { out.close(); }
 
-void dot_gen::set_file(std::string file_name) {
-	out.open(file_name);
-}
+void dot_gen::set_file(std::string file_name) { out.open(file_name); }
 
-std::string* dot_gen::new_node() {
+std::string *dot_gen::new_node()
+{
 	std::string *o = new std::string();
-	*o = "Node"+std::to_string(node_cnt++);
+	*o = "Node" + std::to_string(node_cnt++);
 	return o;
 }
 
-void* dot_gen::visit_Document(Document *d) {
+void *dot_gen::visit_Document(Document *d)
+{
 	out << "digraph ast {" << std::endl;
 	node_cnt = 0;
 	std::string *doc_id = new_node();
 	out << *doc_id << " [label=\"Document\"];" << std::endl;
-	std::vector<Block*> *b = d->get_blocks();
-	for (std::vector<Block*>::size_type i = 0; i < b->size(); i++) {
-		std::string* ret_id = (std::string *)(*b)[i]->visit(this);
+	std::vector<Block *> *b = d->get_blocks();
+	for (std::vector<Block *>::size_type i = 0; i < b->size(); i++) {
+		std::string *ret_id = (std::string *)(*b)[i]->visit(this);
 		out << *doc_id << "->" << *ret_id << ";" << std::endl;
 		delete ret_id;
 	}
@@ -35,17 +33,21 @@
 	return NULL;
 }
 
-void* dot_gen::visit_Block_Table(Block_Table *bt) {
+void *dot_gen::visit_Block_Table(Block_Table *bt)
+{
 	std::string *b_id = new_node();
-	std::vector<std::vector<Line_Word*>*> *t = bt->get_table();
+	std::vector<std::vector<Line_Word *> *> *t = bt->get_table();
 	out << *b_id << " [label=\"Block Table\"];" << std::endl;
-	for (std::vector<std::vector<Line_Word*>*>::size_type i = 0; i < t->size(); i++) {
+	for (std::vector<std::vector<Line_Word *> *>::size_type i = 0;
+	     i < t->size(); i++) {
 		std::string *row_id = new_node();
 		out << *row_id << " [label=\"Row(" << i << ")\"];" << std::endl;
 		out << *b_id << "->" << *row_id << ";" << std::endl;
-		std::vector<Line_Word*> *r = (*t)[i];
-		for (std::vector<Line_Word*>::size_type j = 0; j < r->size(); j++) {
-			std::string *ret_id = (std::string*)(*r)[j]->visit(this);
+		std::vector<Line_Word *> *r = (*t)[i];
+		for (std::vector<Line_Word *>::size_type j = 0; j < r->size();
+		     j++) {
+			std::string *ret_id =
+			    (std::string *)(*r)[j]->visit(this);
 			out << *row_id << "->" << *ret_id << ";" << std::endl;
 			delete ret_id;
 		}
@@ -54,103 +56,138 @@
 	return b_id;
 }
 
-void* dot_gen::visit_Block_Code(Block_Code *bc) {
+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;
 }
 
-void* dot_gen::visit_Block_Line(Block_Line *bl) {
-	std::string *bl_id = new_node();
-	std::vector<Line*> *l = bl->get_lines();
-	out << *bl_id << " [label=\"Block Line\"];" << std::endl;
-	for (std::vector<Line*>::size_type i = 0; i < l->size(); i++) {
-		std::string *ret_id = (std::string*)(*l)[i]->visit(this);
-		out << *bl_id << "->" << *ret_id << ";" << std::endl;
-		delete ret_id;
-	}
-	return bl_id;
+void *dot_gen::visit_Block_Word(Block_Word *bl)
+{
+	std::string *bw_id = new_node();
+	out << *bw_id << " [label=\"Block Word\"];" << std::endl;
+	std::string *ret_id = (std::string *)bl->get_words()->visit(this);
+	out << *bw_id << "->" << *ret_id << ";" << std::endl;
+	delete ret_id;
+	return bw_id;
 }
 
-void* dot_gen::visit_Heading(Heading *h) {
+void *dot_gen::visit_Heading(Heading *h)
+{
 	std::string *h_id = new_node();
 	Line_Word *w = h->get_words();
 	out << *h_id << " [label=\"Heading\"];" << std::endl;
-	std::string *ret_id = (std::string*)w->visit(this);
+	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) {
+void *dot_gen::visit_List(List *l)
+{
 	std::string *l_id = new_node();
 	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 << " [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) {
+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;
 }
 
-void* dot_gen::visit_Line_Word(Line_Word *lw) {
+void *dot_gen::visit_Line_Word(Line_Word *lw)
+{
 	std::string *lw_id = new_node();
-	std::vector<Word*> *w = lw->get_words();
+	std::vector<Word *> *w = lw->get_words();
 	out << *lw_id << " [label=\"Line Word\"];" << std::endl;
-	for (std::vector<Word*>::size_type i = 0; i < w->size(); i++) {
-		std::string *ret_id = (std::string*)(*w)[i]->visit(this);
+	for (std::vector<Word *>::size_type i = 0; i < w->size(); i++) {
+		std::string *ret_id = (std::string *)(*w)[i]->visit(this);
 		out << *lw_id << "->" << *ret_id << ";" << std::endl;
 		delete ret_id;
 	}
 	return lw_id;
 }
 
-void* dot_gen::visit_MathInline(MathInline *mi) {
+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;
 }
 
-void* dot_gen::visit_Link(Link *l) {
+void *dot_gen::visit_Link(Link *l)
+{
 	std::string *l_id = new_node();
-	out << *l_id << " [label=\"Link(" << l->get_link() << "," << l->get_text() << ")\"];" << std::endl;
+	out << *l_id << " [label=\"Link(" << l->get_link() << ","
+	    << l->get_text() << ")\"];" << std::endl;
 	return l_id;
 }
 
-void* dot_gen::visit_Text(Text *t) {
+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;
 }
 
-void* dot_gen::visit_Format_Bold(Format_Bold *fb) {
+void *dot_gen::visit_Format_Bold(Format_Bold *fb)
+{
 	std::string *fb_id = new_node();
 	out << *fb_id << " [label=\"Format Bold\"];" << std::endl;
-	std::string *ret_id = (std::string*)fb->get_f()->visit(this);
+	std::string *ret_id = (std::string *)fb->get_f()->visit(this);
 	out << *fb_id << "->" << *ret_id << ";" << std::endl;
 	delete ret_id;
 	return fb_id;
 }
 
-void* dot_gen::visit_Format_Italic(Format_Italic *fi) {
+void *dot_gen::visit_Format_Italic(Format_Italic *fi)
+{
 	std::string *fi_id = new_node();
 	out << *fi_id << " [label=\"Format Italic\"];" << std::endl;
-	std::string *ret_id = (std::string*)fi->get_f()->visit(this);
+	std::string *ret_id = (std::string *)fi->get_f()->visit(this);
 	out << *fi_id << "->" << *ret_id << ";" << std::endl;
 	delete ret_id;
 	return fi_id;
 }
 
-void* dot_gen::visit_Format_Verbatim(Format_Verbatim *fv) {
+void *dot_gen::visit_Format_Verbatim(Format_Verbatim *fv)
+{
 	std::string *fv_id = new_node();
 	out << *fv_id << " [label=\"Format Verbatim\"];" << std::endl;
-	std::string *ret_id = (std::string*)fv->get_f()->visit(this);
+	std::string *ret_id = (std::string *)fv->get_f()->visit(this);
 	out << *fv_id << "->" << *ret_id << ";" << std::endl;
 	delete ret_id;
 	return fv_id;
 }
+
+void *dot_gen::visit_Format_Strikethrough(Format_Strikethrough *fs)
+{
+	std::string *fs_id = new_node();
+	out << *fs_id << " [label=\"Format Strikethrough\"];" << std::endl;
+	std::string *ret_id = (std::string *)fs->get_f()->visit(this);
+	out << *fs_id << "->" << *ret_id << ";" << std::endl;
+	delete ret_id;
+	return fs_id;
+}
+
+void *dot_gen::visit_Format_Underline(Format_Underline *fu)
+{
+	std::string *fu_id = new_node();
+	out << *fu_id << " [label=\"Format Underline\"];" << std::endl;
+	std::string *ret_id = (std::string *)fu->get_f()->visit(this);
+	out << *fu_id << "->" << *ret_id << ";" << std::endl;
+	delete ret_id;
+	return fu_id;
+}
diff --git a/gens/dot.h b/gens/dot.h
index 7c01fd5..d3975ff 100644
--- a/gens/dot.h
+++ b/gens/dot.h
@@ -1,29 +1,33 @@
 #ifndef DOT_H
 #define DOT_H
-#include <fstream>
 #include "../ast.h"
 #include "../gens.h"
+#include <fstream>
 
-class dot_gen: public gen {
+class dot_gen : public gen
+{
 	std::ofstream out;
 	int node_cnt;
-public:
+
+      public:
 	~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);
-	void* visit_Block_Code(Block_Code *bc);
-	void* visit_Block_Line(Block_Line *bl);
-	void* visit_Heading(Heading *h);
-	void* visit_List(List *l);
-	void* visit_MathDisp(MathDisp *md);
-	void* visit_Line_Word(Line_Word *lw);
-	void* visit_MathInline(MathInline *mi);
-	void* visit_Link(Link *l);
-	void* visit_Text(Text *t);
-	void* visit_Format_Bold(Format_Bold *fb);
-	void* visit_Format_Italic(Format_Italic *fi);
-	void* visit_Format_Verbatim(Format_Verbatim *fv);
+	std::string *new_node();
+	void *visit_Document(Document *d);
+	void *visit_Block_Table(Block_Table *bt);
+	void *visit_Block_Code(Block_Code *bc);
+	void *visit_Block_Word(Block_Word *bl);
+	void *visit_Heading(Heading *h);
+	void *visit_List(List *l);
+	void *visit_MathDisp(MathDisp *md);
+	void *visit_Line_Word(Line_Word *lw);
+	void *visit_MathInline(MathInline *mi);
+	void *visit_Link(Link *l);
+	void *visit_Text(Text *t);
+	void *visit_Format_Bold(Format_Bold *fb);
+	void *visit_Format_Italic(Format_Italic *fi);
+	void *visit_Format_Verbatim(Format_Verbatim *fv);
+	void *visit_Format_Strikethrough(Format_Strikethrough *fs);
+	void *visit_Format_Underline(Format_Underline *fu);
 };
 #endif
diff --git a/main.cpp b/main.cpp
index 9105006..7b9abdd 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,14 +1,14 @@
-#include <iostream>
-#include <string>
 #include "ast.h"
 #include "gens.h"
 #include "parsers.h"
+#include <iostream>
+#include <string>
 
-int main(int argc, char** argv)
+int main(int argc, char **argv)
 {
 	Document *d;
 	parser *p = new tester();
-	gen *g = new dot_gen();
+	dot_gen *g = new dot_gen();
 	g->set_file("temp.dot");
 	d = p->parse();
 	d->visit(g);
diff --git a/parsers/tester.cpp b/parsers/tester.cpp
index bfbdbda..74b2195 100644
--- a/parsers/tester.cpp
+++ b/parsers/tester.cpp
@@ -1,51 +1,51 @@
-#include <string>
-#include "../ast.h"
 #include "tester.h"
+#include "../ast.h"
+#include <string>
 
-void tester::set_file(std::string file_name)
+void tester::set_file(std::string file_name) { return; }
+
+Document *tester::parse()
 {
-	return;
-}
+	Document *d = new Document("a", "b", "c");
 
-Document* tester::parse()
-{
-	Document *d = new Document("a","b","c");
-
-	//block line test
-	Block_Line *bl = new Block_Line();
 	Line_Word *lw = new Line_Word();
-	d->add_block(bl);
-	bl->add_line(lw);
+	Block_Word *bw = new Block_Word(lw);
+	d->add_block(bw);
+
+	// Formats
 	lw->add_word(new Format_Bold(new Text("Bold")));
 	lw->add_word(new Format_Italic(new Text("Italic")));
 	lw->add_word(new Format_Verbatim(new Text("Verbatim")));
 	lw->add_word(new Text("Text"));
-	lw->add_word(new Format_Bold(new Format_Italic(new Text("BoldItalic"))));
-	lw->add_word(new MathInline("1+1=2"));
-	lw->add_word(new Link("link","text"));
+	lw->add_word(
+	    new Format_Bold(new Format_Italic(new Text("BoldItalic"))));
+	lw->add_word(new Format_Strikethrough(new Text("Strikethrough")));
+	lw->add_word(new Format_Underline(new Text("Underline")));
 
-	//heading test
+	// Other words
+	lw->add_word(new MathInline("1+1=2"));
+	lw->add_word(new Link("link", "text"));
+	bw->add_word(new MathDisp("1+1=2"));
+
+	// heading test
 	lw = new Line_Word();
 	lw->add_word(new Text("heading"));
 	Heading *h = new Heading(1, lw);
-	bl->add_line(h);
+	bw->add_word(h);
 
-	//list test
+	// list test
 	lw = new Line_Word();
 	lw->add_word(new Text("ordered"));
-	List *l = new List(1,1,lw);
-	bl->add_line(l);
+	List *l = new List(1, 1, lw);
+	bw->add_word(l);
 	lw = new Line_Word();
 	lw->add_word(new Text("unordered"));
-	l = new List(1,0,lw);
-	bl->add_line(l);
+	l = new List(1, 0, lw);
+	bw->add_word(l);
 
-	//mathdisp test
-	bl->add_line(new MathDisp("1+1=2"));
-
-	//table test
+	// table test
 	Block_Table *bt = new Block_Table();
-	std::vector<Line_Word*>* row = new std::vector<Line_Word*>();
+	std::vector<Line_Word *> *row = new std::vector<Line_Word *>();
 	lw = new Line_Word();
 	lw->add_word(new Text("Table1"));
 	row->push_back(lw);
@@ -53,7 +53,7 @@
 	lw->add_word(new Text("Table2"));
 	row->push_back(lw);
 	bt->add_row(row);
-	row = new std::vector<Line_Word*>();
+	row = new std::vector<Line_Word *>();
 	lw = new Line_Word();
 	lw->add_word(new Text("Table3"));
 	row->push_back(lw);
@@ -63,7 +63,7 @@
 	bt->add_row(row);
 	d->add_block(bt);
 
-	//code test
+	// code test
 	Block_Code *bc = new Block_Code("C");
 	bc->add_line("#include <stdio.h>");
 	bc->add_line("int main(void)\n{\nprintf(\"Hello World!\\n\");\n}");
diff --git a/spec.org b/spec.org
index 32ca5da..ddff731 100644
--- a/spec.org
+++ b/spec.org
@@ -18,12 +18,12 @@
 - Link :: Link to other place, containing link text and link destination
 
 Document: Block*
-Block: Table | Line* | Code
+Block: Table | Word* | Code
 Table: Word* (2d array)
 Code: Straight strings
-Line: Heading | List | Word* | MathDisp
-Word: MathInline | Link | Format
-Format: Bold | Italic | Verbatim | Text
+# Line: Heading | List | Word* | MathDisp
+Word: MathInline | Link | Format | Heading | List | MathDisp
+Format: Bold | Italic | Verbatim | Text | Underline | Strikethrough
 Italic: Format
 Bold: Format
 Verbatim: Format
@@ -61,6 +61,8 @@
 Italic is between ~/ /~.
 Bold is between ~* *~.
 Verbatim is between ~\~ \~~.
+Strikethrough is ~+ +~.
+Underline is ~_ _~.
 *** Link
 Links are ~[[destination][text]]~.
 *** Comments

--
Gitblit v1.10.0