Joel Grunbaum
2021-08-12 ca483d438742be9650a5045e846b974f57c67e4f
ast.h
@@ -1,7 +1,7 @@
#ifndef AST_H
#define AST_H
#include <vector>
#include <string>
#include <vector>
//class ast_node;
class ast_visitor;
@@ -24,24 +24,31 @@
// class Format_Verbatim;
// class Text;
class ast_node {
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:
   MathInline(std::string e);
   std::string get_expr();
   void* visit(ast_visitor *v);
};
class Link: public Word {
class Link : public Word
{
   std::string link, text;
public:
   Link(std::string l, std::string t);
   std::string get_link();
@@ -49,18 +56,24 @@
   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:
   Text(std::string tt);
   std::string get_text();
   void* visit(ast_visitor *v);
};
class Format_Bold: public Format {
class Format_Bold : public Format
{
   Format *f;
public:
   Format_Bold(Format* ff);
   ~Format_Bold();
@@ -68,8 +81,10 @@
   void* visit(ast_visitor *v);
};
class Format_Italic: public Format {
class Format_Italic : public Format
{
   Format *f;
public:
   Format_Italic(Format* ff);
   ~Format_Italic();
@@ -77,18 +92,45 @@
   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 {
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);
@@ -96,9 +138,11 @@
   void* visit(ast_visitor *v);
};
class Heading: public Line {
class Heading : public Word
{
   int level;
   Line_Word *words;
public:
   Heading(int l, Line_Word *w);
   ~Heading();
@@ -107,9 +151,11 @@
   void* visit(ast_visitor *v);
};
class List: public Line {
class List : public Word
{
   int level, number;
   Line_Word *words;
public:
   List(int l, int n, Line_Word *w);
   ~List();
@@ -119,30 +165,38 @@
   void* visit(ast_visitor *v);
};
class MathDisp: public Line {
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: public ast_node {};
class Block_Table: public Block {
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);
   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:
   Block_Code(std::string l);
   int add_line(std::string add);
@@ -151,18 +205,23 @@
   void* visit(ast_visitor *v);
};
class Block_Line: public Block {
   std::vector<Line*> lines;
class Block_Word : public Block
{
   Line_Word *words;
public:
   ~Block_Line();
   std::vector<Line*>* get_lines();
   int add_line(Line* l);
   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:
   Document(std::string t, std::string a, std::string d);
   ~Document();
@@ -174,12 +233,13 @@
   void* visit(ast_visitor *v);
};
class ast_visitor {
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_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;
@@ -189,6 +249,8 @@
   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