-
Notifications
You must be signed in to change notification settings - Fork 0
/
Expression_visitor.cpp
156 lines (117 loc) · 5.03 KB
/
Expression_visitor.cpp
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
#include <algorithm>
#include "Expression_Internal.h"
#pragma mark - accept
/*
void Expression::accept(Visitor &v) {
v.visit(*this);
}
*/
void VectorExpression::accept(Visitor &v) {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
void UnaryExpression::accept(Visitor &v) {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
void BinaryExpression::accept(Visitor &v) {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
#undef CREATE_VISITOR
#define CREATE_VISITOR(klass) void klass::accept(Visitor &v) { v.visit(*this); }
CREATE_VISITOR(IdentifierExpression);
CREATE_VISITOR(IntegerExpression);
CREATE_VISITOR(PCExpression);
CREATE_VISITOR(RegisterExpression);
CREATE_VISITOR(RelExpression);
CREATE_VISITOR(StringExpression);
void VectorExpression::accept(ConstVisitor &v) const {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
void UnaryExpression::accept(ConstVisitor &v) const {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
void BinaryExpression::accept(ConstVisitor &v) const {
v.visit(*this);
for (auto e : _children) e->accept(v);
}
#undef CREATE_VISITOR
#define CREATE_VISITOR(klass) void klass::accept(ConstVisitor &v) const { v.visit(*this); }
CREATE_VISITOR(IdentifierExpression);
CREATE_VISITOR(IntegerExpression);
CREATE_VISITOR(PCExpression);
CREATE_VISITOR(RegisterExpression);
CREATE_VISITOR(RelExpression);
CREATE_VISITOR(StringExpression);
ExpressionPtr UnaryExpression::accept(MapVisitor &v) const {
children_type tmp(_children);
std::transform(tmp.begin(), tmp.end(), tmp.begin(),
[&v](ExpressionPtr e) { return e->accept(v); }
);
if (tmp == _children) return v.visit(*this);
//auto self = static_pointer_cast<UnaryExpression>(Unary(_op, tmp[0]));
auto self = std::make_shared<UnaryExpression>(_op, tmp[0]);
return v.visit(*self);
}
ExpressionPtr BinaryExpression::accept(MapVisitor &v) const {
children_type tmp(_children);
std::transform(tmp.begin(), tmp.end(), tmp.begin(),
[&v](ExpressionPtr e) { return e->accept(v); }
);
if (tmp == _children) return v.visit(*this);
//auto self = static_pointer_cast<BinaryExpression>(Binary(_op, tmp[0], tmp[1]));
auto self = std::make_shared<BinaryExpression>(_op, tmp[0], tmp[1]);
return v.visit(*self);
}
ExpressionPtr VectorExpression::accept(MapVisitor &v) const {
children_type tmp(_children);
std::transform(tmp.begin(), tmp.end(), tmp.begin(),
[&v](ExpressionPtr e) { return e->accept(v); }
);
if (tmp == _children) return v.visit(*this);
auto self = Vector(std::move(tmp));
return v.visit(*self);
}
#undef CREATE_VISITOR
#define CREATE_VISITOR(klass) ExpressionPtr klass::accept(MapVisitor &v) const { return v.visit(*this); }
CREATE_VISITOR(IdentifierExpression);
CREATE_VISITOR(IntegerExpression);
CREATE_VISITOR(PCExpression);
CREATE_VISITOR(RegisterExpression);
CREATE_VISITOR(RelExpression);
CREATE_VISITOR(StringExpression);
#pragma mark - visitors
Expression::Visitor::~Visitor() {}
void Expression::Visitor::visit(BinaryExpression &) {}
void Expression::Visitor::visit(IdentifierExpression &) {}
void Expression::Visitor::visit(IntegerExpression &) {}
void Expression::Visitor::visit(PCExpression &) {}
void Expression::Visitor::visit(RegisterExpression &) {}
void Expression::Visitor::visit(RelExpression &) {}
void Expression::Visitor::visit(StringExpression &) {}
void Expression::Visitor::visit(UnaryExpression &) {}
void Expression::Visitor::visit(VectorExpression &) {}
Expression::ConstVisitor::~ConstVisitor() {}
void Expression::ConstVisitor::visit(const BinaryExpression &) {}
void Expression::ConstVisitor::visit(const IdentifierExpression &) {}
void Expression::ConstVisitor::visit(const IntegerExpression &) {}
void Expression::ConstVisitor::visit(const PCExpression &) {}
void Expression::ConstVisitor::visit(const RegisterExpression &) {}
void Expression::ConstVisitor::visit(const RelExpression &) {}
void Expression::ConstVisitor::visit(const StringExpression &) {}
void Expression::ConstVisitor::visit(const UnaryExpression &) {}
void Expression::ConstVisitor::visit(const VectorExpression &) {}
Expression::MapVisitor::~MapVisitor() {}
// these should all be const, but that screws up the return type.
ExpressionPtr Expression::MapVisitor::visit(const BinaryExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const IdentifierExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const IntegerExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const PCExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const RegisterExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const RelExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const StringExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const UnaryExpression &e) { return to_expression_ptr(e); }
ExpressionPtr Expression::MapVisitor::visit(const VectorExpression &e) { return to_expression_ptr(e); }