-
Notifications
You must be signed in to change notification settings - Fork 0
/
ast to text.js
88 lines (75 loc) · 2.41 KB
/
ast to text.js
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
function evaluateNode(node){
if (node==undefined) return
if (node.type=='num' || node.type=='var') return node.val
else return typeToExpression[node.type](node)
}
//only take expressions
function returnValNode(node){
return 'return '+ evaluateNode(node.children[0])
}
function equalsNode(node){
return evaluateNode(node.children[0]) + ' == ' + evaluateNode(node.children[1])
}
function greaterNode(node){
return evaluateNode(node.children[0]) +' > '+ evaluateNode(node.children[1])
}
function lesserNode(node){
return evaluateNode(node.children[0]) +' < '+ evaluateNode(node.children[1])
}
function addNode(node){
return evaluateNode(node.children[0]) +' + '+ evaluateNode(node.children[1])
}
function subtractNode(node){
return evaluateNode(node.children[0]) +' - '+ evaluateNode(node.children[1])
}
//take arg other than expression
function declareNode(node){
return 'let ' + evaluateNode(node.children[0]) +' = '+ evaluateNode(node.children[1])
}
function assignNode(node){
return evaluateNode(node.children[0]) +' = '+ evaluateNode(node.children[1])
}
function ternaryNode(node){
let condition = typeToCondition[node.children[0].type](node.children[0])
return condition + " ? " + evaluateNode(node.children[1]) + " : " + evaluateNode(node.children[2])
}
function callFunctionNode(node){
return "fun("+ evaluateNode(node.children[0]) + ", "
+ evaluateNode(node.children[1]) + ", "
+ evaluateNode(node.children[2]) + ")"
}
function pushToArrayNode(node){
return "output.push(" + evaluateNode(node.children[0]) + ")"
}
let typeToAction = {
'ternaryNode':ternaryNode,
'declareNode':declareNode,
'assignNode':assignNode,
'callFunctionNode':callFunctionNode,
'pushToArrayNode':pushToArrayNode,
'returnValNode':returnValNode
}
let typeToExpression = {
'pushToArrayNode':pushToArrayNode,
'ternaryNode':ternaryNode,
'addNode':addNode,
'subtractNode':subtractNode,
'callFunctionNode':callFunctionNode
}
//let typeToVarOrNum = {'num':evaluateNode,'val':evaluateNode}
let typeToCondition = {'lesserNode':lesserNode,'greaterNode':greaterNode,'equalsNode':equalsNode}
function astToText(ast){
try{
let text = ""
ast.children.forEach(child=>{
// let mapper = {...typeToAction, ...typeToExpression, ...typeToVarOrNum}
// if (!(child.type in mapper)) debugger
// text += mapper[child.type](child) + '\n'
text += typeToAction[child.type](child) + '\n'
})
return text
}
catch(error){
console.log(error)
}
}