-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtransform.h
More file actions
95 lines (81 loc) · 3.31 KB
/
transform.h
File metadata and controls
95 lines (81 loc) · 3.31 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
#pragma once
#include "lang.h"
class Transform {
public:
virtual Program *transformProgram(Program *node) {
std::vector<FunctionDeclaration *> body;
for (auto decl : node->body) {
body.push_back(transformFunctionDeclaration(decl));
}
return new Program(body);
}
virtual FunctionDeclaration *transformFunctionDeclaration(FunctionDeclaration *node) {
std::vector<Variable *> params;
for (auto param : node->params) {
params.push_back(transformVariable(param));
}
return new FunctionDeclaration(node->name, params, transformStatement(node->body));
}
virtual Statement *transformStatement(Statement *node) {
if (node->is<ExpressionStatement>()) {
return transformExpressionStatement(node->as<ExpressionStatement>());
} else if (node->is<SetStatement>()) {
return transformSetStatement(node->as<SetStatement>());
} else if (node->is<IfStatement>()) {
return transformIfStatement(node->as<IfStatement>());
} else if (node->is<ForStatement>()) {
return transformForStatement(node->as<ForStatement>());
} else if (node->is<BlockStatement>()) {
return transformBlockStatement(node->as<BlockStatement>());
} else if (node->is<ReturnStatement>()) {
return transformReturnStatement(node->as<ReturnStatement>());
}
throw SyntaxError(node, "Unknown type");
}
virtual Statement *transformExpressionStatement(ExpressionStatement *node) {
return new ExpressionStatement(transformExpression(node->expr));
}
virtual Statement *transformSetStatement(SetStatement *node) {
return new SetStatement(transformVariable(node->name), transformExpression(node->value));
}
virtual Statement *transformIfStatement(IfStatement *node) {
return new IfStatement(transformExpression(node->condition), transformStatement(node->body));
}
virtual Statement *transformForStatement(ForStatement *node) {
return new ForStatement(transformStatement(node->init), transformExpression(node->test),
transformStatement(node->update), transformStatement(node->body));
}
virtual Statement *transformBlockStatement(BlockStatement *node) {
std::vector<Statement *> body;
for (auto stmt : node->body) {
body.push_back(transformStatement(stmt));
}
return new BlockStatement(body);
}
virtual Statement *transformReturnStatement(ReturnStatement *node) {
return new ReturnStatement(transformExpression(node->value));
}
virtual Expression *transformExpression(Expression *node) {
if (node->is<IntegerLiteral>()) {
return transformIntegerLiteral(node->as<IntegerLiteral>());
} else if (node->is<Variable>()) {
return transformVariable(node->as<Variable>());
} else if (node->is<CallExpression>()) {
return transformCallExpression(node->as<CallExpression>());
}
throw SyntaxError(node, "Unknown type");
}
virtual Expression *transformIntegerLiteral(IntegerLiteral *node) {
return new IntegerLiteral(node->value);
}
virtual Variable *transformVariable(Variable *node) {
return new Variable(node->name);
}
virtual Expression *transformCallExpression(CallExpression *node) {
std::vector<Expression *> args;
for (auto arg : node->args) {
args.push_back(transformExpression(arg));
}
return new CallExpression(node->func, args);
}
};