-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathPrinter.cc
More file actions
95 lines (84 loc) · 1.77 KB
/
Printer.cc
File metadata and controls
95 lines (84 loc) · 1.77 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
86
87
88
89
90
91
92
93
94
95
#include <iostream>
#include <iomanip>
#include "Printer.h"
using namespace std;
namespace Printer {
class PrintVisitor: public Visitor {
public:
PrintVisitor(ostream &o) : out(o) { }
virtual void Visit(const IntegerLiteral *node);
virtual void Visit(const RealLiteral *node);
virtual void Visit(const InputExpr *node);
virtual void Visit(const CastExpr *node);
virtual void Visit(const BinExpr *node);
virtual void Visit(const IfExpr *node);
private:
ostream &out;
};
void Print(const Expr *node, ostream &out) {
PrintVisitor v(out);
node->Accept(&v);
}
void PrintVisitor::Visit(const IntegerLiteral *node) {
out << node->Value();
}
void PrintVisitor::Visit(const RealLiteral *node) {
out << fixed << node->Value();
}
void PrintVisitor::Visit(const InputExpr *node) {
out << "input()";
}
void PrintVisitor::Visit(const CastExpr *node) {
out << node->Type() << "(";
node->ExprToCast()->Accept(this);
out << ")";
}
void PrintVisitor::Visit(const BinExpr *node) {
out << '(';
node->Lhs()->Accept(this);
out << ' ';
switch (node->Op()) {
case ADD:
out << '+';
break;
case SUB:
out << '-';
break;
case MUL:
out << '*';
break;
case DIV:
out << '/';
break;
case LT:
out << '<';
break;
case LTE:
out << "<=";
break;
case GT:
out << '>';
break;
case GTE:
out << ">=";
break;
case EQ:
out << "==";
break;
case NEQ:
out << "!=";
break;
}
out << ' ';
node->Rhs()->Accept(this);
out << ')';
}
void PrintVisitor::Visit(const IfExpr *node) {
out << "if ";
node->CondExpr()->Accept(this);
out << " then ";
node->ThenExpr()->Accept(this);
out << " else ";
node->ElseExpr()->Accept(this);
}
}