aboutsummaryrefslogtreecommitdiffstats
path: root/c_compiler/include/type.hpp
blob: 8c881c1e6181d5dd43597d5f57a958b40d67ed40 (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
#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 VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const = 0;
    
    virtual TypePtr type() = 0;
    virtual TypePtr type(Type *type_ptr) = 0;
    virtual TypePtr type(TypePtr type_ptr) = 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_);

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
    
    virtual TypePtr type();
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);
};

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

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
    
    virtual TypePtr type();
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);
};

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 VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
    
    virtual TypePtr type();    
    virtual TypePtr type(Type *type_ptr);
    virtual TypePtr type(TypePtr type_ptr);
    
    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 VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) 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 VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
};

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

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
};

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

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
};

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

    virtual void print() const;
    virtual void printXml() const;
    virtual VariableStackBindings printAsm(VariableStackBindings bindings, unsigned &label_count) const;
};

#endif