-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathIntermediateCode.hh
123 lines (101 loc) · 2.01 KB
/
IntermediateCode.hh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#ifndef INTERMEDIATE_CODE_HH
#define INTERMEDIATE_CODE_HH
namespace ic
{
typedef enum{
ASSIGN,
PLUS,
MINUS,
MULTIPLY,
DIVIDE,
MOD,
UNARYPLUS,
UNARYMINUS,
LESSTHAN,
LESSTHANOREQUALTO,
GREATERTHAN,
GREATERTHANOREQUALTO,
EQUALTO,
NOTEQUALTO,
AND,
OR,
NOT,
IF,
ELSE,
GOTO,
PRINT
}OpCode;
}
class Operand
{
public:
virtual void print(ostream & file_buffer) = 0;
};
class Variable:public Operand
{
SymbolTableEntry *symbolEntry;
public:
Variable(SymbolTableEntry * );
~Variable();
void print(ostream &);
Variable & operator= (const Variable);
};
template <class T>
class Constant: public Operand
{
T num;
public:
Constant (T);
~Constant();
void print(ostream & fileBuffer);
Constant & operator=(const Constant);
};
template <class T> Constant<T> :: Constant(T n){
num=n;
}
template <class T> Constant<T> :: ~Constant(){}
template <class T> void Constant<T> :: print(ostream &o){
o<<num;
}
class Quadruple;
class Quadruple
{
Operand *opd1;
Operand *opd2;
Variable *result;
//used in case conditinal or unconditional goto
Quadruple *nextInstAddr;
public:
ic::OpCode opCode;
Quadruple();
Quadruple(Operand*,Operand*,Variable*,ic::OpCode);
~Quadruple();
InstructionDescriptor & getInstDesc();
Operand * getOpd1();
Operand * getOpd2();
Variable * getResult();
//ic::OpCode getOpCode();
void setOpd1(Operand *);
void setOpd2(Operand *);
void setResult(Variable *);
void setNextInstAddr(Quadruple*);
Quadruple* getNextInstAddr();
void print(ostream & );
};
class IntermediateCodeForAst
{
list<Quadruple *> iCode;
// symbol entry of result variable
SymbolTableEntry *symbolEntry;
public:
IntermediateCodeForAst();
IntermediateCodeForAst(list<Quadruple *> &);
~IntermediateCodeForAst();
void appendToICode(Quadruple*);
list<Quadruple *> & getICode();
void setICode(list<Quadruple *>);
void setSTE(SymbolTableEntry *);
SymbolTableEntry* getSTE();
IntermediateCodeForAst & operator=(const IntermediateCodeForAst &);
};
#endif