-
Notifications
You must be signed in to change notification settings - Fork 0
/
example.js
119 lines (115 loc) · 3.06 KB
/
example.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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
function Expression(source){
if(source[0].type === "AdditiveExpression" && source[1] && source[1].type === "EOF" ) {
let node = {
type:"Expression",
children:[source.shift(), source.shift()]
}
source.unshift(node);
return node;
}
AdditiveExpression(source);
return Expression(source);
}
function AdditiveExpression(source){
if(source[0].type === "MultiplicativeExpression") {
let node = {
type:"AdditiveExpression",
children:[source[0]]
}
source[0] = node;
return AdditiveExpression(source);
}
if(source[0].type === "AdditiveExpression" && source[1] && source[1].type === "+") {
let node = {
type:"AdditiveExpression",
operator:"+",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
MultiplicativeExpression(source);
node.children.push(source.shift());
source.unshift(node);
return AdditiveExpression(source);
}
if(source[0].type === "AdditiveExpression" && source[1] && source[1].type === "-") {
let node = {
type:"AdditiveExpression",
operator:"-",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
MultiplicativeExpression(source);
node.children.push(source.shift());
source.unshift(node);
return AdditiveExpression(source);
}
if(source[0].type === "AdditiveExpression")
return source[0];
MultiplicativeExpression(source);
return AdditiveExpression(source);
}
function MultiplicativeExpression(source){
if(source[0].type === "Number") {
let node = {
type:"MultiplicativeExpression",
children:[source[0]]
}
source[0] = node;
return MultiplicativeExpression(source);
}
if(source[0].type === "MultiplicativeExpression" && source[1] && source[1].type === "*") {
let node = {
type:"MultiplicativeExpression",
operator:"*",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
node.children.push(source.shift());
source.unshift(node);
return MultiplicativeExpression(source);
}
if(source[0].type === "MultiplicativeExpression"&& source[1] && source[1].type === "/") {
let node = {
type:"MultiplicativeExpression",
operator:"/",
children:[]
}
node.children.push(source.shift());
node.children.push(source.shift());
node.children.push(source.shift());
source.unshift(node);
return MultiplicativeExpression(source);
}
if(source[0].type === "MultiplicativeExpression")
return source[0];
return MultiplicativeExpression(source);
};
var source = [{
type:"Number",
value: "3"
}, {
type:"*",
value: "*"
}, {
type:"Number",
value: "300"
}, {
type:"+",
value: "+"
}, {
type:"Number",
value: "2"
}, {
type:"*",
value: "*"
}, {
type:"Number",
value: "256"
}, {
type:"EOF"
}];
var ast = Expression(source);
console.log(ast);