-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathExpr.hpp
131 lines (93 loc) · 2.53 KB
/
Expr.hpp
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
#ifndef ALPHA_EXPR_HPP
#define ALPHA_EXPR_HPP
#include <ostream>
#include <string>
#include <memory>
#include "types.hpp"
struct Expr {
virtual ~Expr() { }
// Compile Time Evaluation
virtual bool cte(i32_t*) const {
return false;
}
// Compile Time Evaluation
virtual bool cte(std::string*) const {
return false;
}
// Normal Evaluation
virtual void eval(std::ostream&) const = 0;
};
class NumExpr : public Expr {
private:
i32_t _value;
public:
explicit NumExpr(i32_t val);
// Compile Time Evaluation
virtual bool cte(i32_t* num) const override {
*num = _value;
return true;
}
virtual void eval(std::ostream&) const override;
};
class NegExpr : public Expr {
private:
std::unique_ptr<const Expr> _expr;
public:
explicit NegExpr(const Expr*);
virtual void eval(std::ostream&) const override;
};
class StringExpr : public Expr {
private:
std::string _label;
public:
explicit StringExpr(const std::string&);
// Compile Time Evaluation
virtual bool cte(std::string* str) const override {
*str = _label;
return true;
}
virtual void eval(std::ostream&) const override;
};
class VarDecl;
class VarExpr : public Expr {
protected:
const VarDecl* _var;
public:
explicit VarExpr(const VarDecl*);
virtual void eval(std::ostream&) const override;
};
struct PtrExpr : public VarExpr {
explicit PtrExpr(const VarDecl*);
virtual void eval(std::ostream&) const override;
};
struct DerefExpr : public VarExpr {
explicit DerefExpr(const VarDecl*);
virtual void eval(std::ostream&) const override;
};
struct BinaryExpr : public Expr {
std::unique_ptr<const Expr> lhs;
std::unique_ptr<const Expr> rhs;
explicit BinaryExpr(const Expr*, const Expr*);
virtual ~BinaryExpr() { }
};
struct AddExpr : public BinaryExpr {
explicit AddExpr(const Expr*, const Expr*);
virtual void eval(std::ostream&) const override;
};
struct SubExpr : public BinaryExpr {
explicit SubExpr(const Expr*, const Expr*);
virtual void eval(std::ostream&) const override;
};
struct MulExpr : public BinaryExpr {
explicit MulExpr(const Expr*, const Expr*);
virtual void eval(std::ostream&) const override;
};
struct DivExpr : public BinaryExpr {
explicit DivExpr(const Expr*, const Expr*);
virtual void eval(std::ostream&) const override;
};
struct ModExpr : public DivExpr {
explicit ModExpr(const Expr*, const Expr*);
virtual void eval(std::ostream&) const override;
};
#endif