-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathvisitor_coding_exercise_21.cpp
More file actions
85 lines (68 loc) · 1.46 KB
/
Copy pathvisitor_coding_exercise_21.cpp
File metadata and controls
85 lines (68 loc) · 1.46 KB
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
#include <string>
#include <sstream>
using namespace std;
struct Value;
struct AdditionExpression;
struct MultiplicationExpression;
struct ExpressionVisitor
{
virtual void accept(Value& value) = 0;
virtual void accept(AdditionExpression& ae) = 0;
virtual void accept(MultiplicationExpression& me) = 0;
};
struct Expression
{
virtual void visit(ExpressionVisitor& ev) = 0;
};
struct Value : Expression
{
int value;
Value(int value) : value(value) {}
void visit(ExpressionVisitor &ev) override
{
ev.accept(*this);
}
};
struct AdditionExpression : Expression
{
Expression &lhs, &rhs;
AdditionExpression(Expression &lhs, Expression &rhs) : lhs(lhs), rhs(rhs) {}
void visit(ExpressionVisitor &ev) override
{
ev.accept(*this);
}
};
struct MultiplicationExpression : Expression
{
Expression &lhs, &rhs;
MultiplicationExpression(Expression &lhs, Expression &rhs)
: lhs(lhs), rhs(rhs) {}
void visit(ExpressionVisitor &ev) override
{
ev.accept(*this);
}
};
struct ExpressionPrinter : ExpressionVisitor
{
void accept(Value &value) override
{
oss << value.value;
}
void accept(AdditionExpression &ae) override
{
oss << "(";
ae.lhs.visit(*this);
oss << "+";
ae.rhs.visit(*this);
oss << ")";
}
void accept(MultiplicationExpression &me) override
{
me.lhs.visit(*this);
oss << "*";
me.rhs.visit(*this);
}
string str() const { return oss.str(); }
private:
ostringstream oss;
};