Joel Grunbaum
2021-08-12 ca483d438742be9650a5045e846b974f57c67e4f
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