-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathprinter.cpp
More file actions
69 lines (54 loc) · 1.63 KB
/
printer.cpp
File metadata and controls
69 lines (54 loc) · 1.63 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
#include "test.h"
struct TypePrinter {
std::string s;
void visitPrimitiveType(PrimitiveType x) {
s = printPrimitiveType(x);
}
void visitPointerTo(const PointerTo& x) {
s = printType(*x.type) + "*";
}
void visitInRange(const InRange& x) {
s = printType(*x.type);
}
};
std::string printType(const Type &type) {
TypePrinter typePrinter;
type.accept(typePrinter);
return typePrinter.s;
}
struct ValuePrinter {
std::string value, s;
void visitPrimitiveType(PrimitiveType x) {
s = "static_cast<" + printPrimitiveType(x) + ">(" + value + ")";
}
void visitPointerTo(const PointerTo& x) {
s = "new " + printType(*x.type) + "{" + printValue(*x.type, value) + "}";
}
void visitInRange(const InRange& x) {
s = printValue(*x.type, value);
}
};
std::string printValue(const Type &type, const std::string &value) {
ValuePrinter valuePrinter;
valuePrinter.value = value;
type.accept(valuePrinter);
return valuePrinter.s;
}
struct ValueSerializer {
std::string value, s;
void visitPrimitiveType(PrimitiveType x) {
s = "std::cout << static_cast<" + printPrimitiveType(x) + ">(" + value + ");\n";
}
void visitPointerTo(const PointerTo& x) {
s = printValueSerializer(*x.type, value);
}
void visitInRange(const InRange& x) {
s = printValueSerializer(*x.type, value);
}
};
std::string printValueSerializer(const Type &type, const std::string &value) {
ValueSerializer valueSerializer;
valueSerializer.value = value;
type.accept(valueSerializer);
return valueSerializer.s;
}