CS143-Lab/assignments/PA5/cgen.h
2023-03-29 13:33:25 +08:00

88 lines
2.1 KiB
C++

#include "cool-tree.h"
#include "emit.h"
#include "symtab.h"
#include <assert.h>
#include <iostream>
#include <stdio.h>
enum Basicness { Basic, NotBasic };
#define TRUE 1
#define FALSE 0
class CgenClassTable;
typedef CgenClassTable *CgenClassTableP;
class CgenNode;
typedef CgenNode *CgenNodeP;
class CgenClassTable : public SymbolTable<Symbol, CgenNode> {
private:
List<CgenNode> *nds;
ostream &str;
int stringclasstag;
int intclasstag;
int boolclasstag;
// The following methods emit code for
// constants and global declarations.
void code_global_data();
void code_global_text();
void code_bools(int);
void code_select_gc();
void code_constants();
// The following creates an inheritance graph from
// a list of classes. The graph is implemented as
// a tree of `CgenNode', and class names are placed
// in the base class symbol table.
void install_basic_classes();
void install_class(CgenNodeP nd);
void install_classes(Classes cs);
void build_inheritance_tree();
void set_relations(CgenNodeP nd);
//* New Methods
void dump_inheritance_tree();
public:
CgenClassTable(Classes, ostream &str);
void code();
CgenNodeP root();
};
class CgenNode : public class__class {
private:
CgenNodeP parentnd; // Parent of class
List<CgenNode> *children; // Children of class
Basicness basic_status; // `Basic' if class is basic
// `NotBasic' otherwise
public:
CgenNode(Class_ c, Basicness bstatus, CgenClassTableP class_table);
void add_child(CgenNodeP child);
List<CgenNode> *get_children() { return children; }
void set_parentnd(CgenNodeP p);
CgenNodeP get_parentnd() { return parentnd; }
int basic() { return (basic_status == Basic); }
void traverse_dump(int pad) {
for (int i = 0; i < pad; ++i)
std::cerr << " ";
std::cerr << this->name << "\n";
for (auto l = children; l; l = l->tl()) {
l->hd()->traverse_dump(pad + 2);
}
}
};
class BoolConst {
private:
int val;
public:
BoolConst(int);
void code_def(ostream &, int boolclasstag);
void code_ref(ostream &) const;
};