aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/type.hpp
blob: 7da21004285ee204329aedd1ba7d7369e2f6ea74 (plain)
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
#ifndef TYPE_HPP
#define TYPE_HPP

#include "bindings.hpp"
#include "node.hpp"

#include <memory>
#include <string>

class Type;
typedef std::shared_ptr<Type> TypePtr;

class Type : public Node
{
public:
    virtual void print() const = 0;
    virtual void printXml() const = 0;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;
    
    virtual TypePtr type() = 0;
    virtual TypePtr type(Type *type_ptr) = 0;
    virtual TypePtr type(TypePtr type_ptr) = 0;

    virtual void increaseStackPosition(Bindings &bindings) const = 0;
    virtual void load() const = 0;
    virtual void load(const int &reg, const int &position) const = 0;
    virtual void store() const = 0;    
    virtual void store(const int &position) const = 0;
    virtual void store(const int &reg, const int &position) const = 0;
    virtual int getSize() const = 0;
    
    virtual void setSigned(bool _signed);
    virtual void setExtern(bool _extern);
    virtual void setStatic(bool _static);
    virtual void setConst(bool _const);
    virtual void setSize(int size);
};

class Array : public Type
{
private:
    int size_;
    TypePtr type_;
public:
    Array(const int &size, TypePtr type_ = nullptr);

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    
    virtual TypePtr type();
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);

    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;    
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

class Pointer : public Type
{
private:
    TypePtr type_;
public:
    Pointer();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    
    virtual TypePtr type();
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);

    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;

    void pointerLoad() const;
    void pointerLoad(const int &reg, const int &position) const;
    void pointerStore() const;
    void pointerStore(const int &position) const;
    void pointerStore(const int &reg, const int &position) const;
};

class TypeContainer : public Type
{
protected:
    TypePtr type_;
    int size_;
    bool extern_;
    bool static_;
    bool const_;
    bool signed_;

public:
    TypeContainer();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    
    virtual TypePtr type();    
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);

    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;    
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
    
    virtual void setSigned(bool _signed);
    virtual void setExtern(bool _extern);
    virtual void setStatic(bool _static);
    virtual void setConst(bool _const);
    virtual void setSize(int size);
};

class Specifier : public Type
{
public:
    virtual void print() const = 0;
    virtual void printXml() const = 0;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const = 0;

    virtual void increaseStackPosition(Bindings &bindings) const = 0;
    virtual void load() const = 0;
    virtual void load(const int &reg, const int &position) const = 0;
    virtual void store() const = 0;    
    virtual void store(const int &position) const = 0;
    virtual void store(const int &reg, const int &position) const = 0;
    virtual int getSize() const = 0;
    
    virtual TypePtr type();
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);
};

class Int : public Specifier
{
public:
    Int();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

class Short : public Specifier
{
public:
    Short();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;    
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

class Void : public Specifier
{
public:
    Void();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;    
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

class Char : public Specifier
{
public:
    Char();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;    
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

class Float : public Specifier
{
public:
    Float();

    virtual void print() const;
    virtual void printXml() const;
    virtual Bindings printAsm(Bindings bindings, int &label_count) const;
    virtual void increaseStackPosition(Bindings &bindings) const;
    virtual void load() const;    
    virtual void load(const int &reg, const int &position) const;
    virtual void store() const;
    virtual void store(const int &position) const;
    virtual void store(const int &reg, const int &position) const;
    virtual int getSize() const;
};

#endif