-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathexpr.js
287 lines (275 loc) · 10.3 KB
/
expr.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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
var gg=require("no/gg").gg
var lx=require("./lexer")
var _expr={
parse:function(){
return expr.parse.apply(expr,arguments)}}
var _expr_no_top_comma={
parse:function(){
return expr_no_comma.parse.apply(expr_no_comma,arguments)}}
module.exports={
expr:_expr,
expr_no_top_comma:_expr_no_top_comma}
var js_object=require("./object")
var js_array=require("./array")
var _=require("./meta")
var splice=_.splice
var quote=_.quote
var stat=require("./stat").stat
var id=require("./id")
var expr=gg.expr([],{
primary:gg.choice([
gg.mseq([
[["(",_expr,")"],{builder:function(ee){
return ["Paren",ee[0]]}}],
[["function",gg.opt(id),"(",
gg.list([id,","]),")","{",
gg.list([stat]),"}"],
{builder:function(ee){
return ["Function",ee[0],ee[1],ee[2]]
return ["Function",{
"name":ee[0],
"args":ee[1],
"body":ee[2]}]}}]]),
id,
js_array,
js_object,
splice,
quote,
//gg.regexp,
gg.string,
gg.number]),
prefix:[
[["new"],{prec:10,assoc:"right",builder:function(op,e){
return ["Op","New",e]}}],
[["++"],{prec:30,builder:function(op,e){
return ["Op","++X",e]}}],
[["--"],{prec:30,builder:function(op,e){
return ["Op","--X",e]}}],
[["!"],{prec:40,builder:function(op,e){
return ["Op","!",e]}}],
[["~"],{prec:40,builder:function(op,e){
return ["Op","~",e]}}],
[["+"],{prec:40,builder:function(op,e){
return ["Op","+X",e]}}],
[["-"],{prec:40,builder:function(op,e){
return ["Op","-X",e]}}],
[["typeof"],{prec:40,builder:function(op,e){
return ["Op","typeof",e]}}],
[["void"],{prec:40,builder:function(op,e){
return ["Op","void",e]}}],
[["delete"],{prec:40,builder:function(op,e){
return ["Op","delete",e]}}]],
infix:[
[["*"],{prec:50,builder:function(e1,op,e2){
return ["Op","*",e1,e2]}}],
[["/"],{prec:50,builder:function(e1,op,e2){
return ["Op","/",e1,e2]}}],
[["%"],{prec:50,builder:function(e1,op,e2){
return ["Op","%",e1,e2]}}],
[["+"],{prec:60,builder:function(e1,op,e2){
return ["Op","+",e1,e2]}}],
[["-"],{prec:60,builder:function(e1,op,e2){
return ["Op","-",e1,e2]}}],
[[">>"],{prec:70,builder:function(e1,op,e2){
return ["Op",">>",e1,e2]}}],
[["<<"],{prec:70,builder:function(e1,op,e2){
return ["Op","<<",e1,e2]}}],
[[">>>"],{prec:70,builder:function(e1,op,e2){
return ["Op",">>>",e1,e2]}}],
[[">"],{prec:80,builder:function(e1,op,e2){
return ["Op",">",e1,e2]}}],
[["<"],{prec:80,builder:function(e1,op,e2){
return ["Op","<",e1,e2]}}],
[["<="],{prec:80,builder:function(e1,op,e2){
return ["Op","<=",e1,e2]}}],
[[">="],{prec:80,builder:function(e1,op,e2){
return ["Op",">=",e1,e2]}}],
[["in"],{prec:80,builder:function(e1,op,e2){
return ["Op","in",e1,e2]}}],
[["instanceof"],{prec:80,builder:function(e1,op,e2){
return ["Op","instanceof",e1,e2]}}],
[["=="],{prec:90,builder:function(e1,op,e2){
return ["Op","==",e1,e2]}}],
[["!="],{prec:90,builder:function(e1,op,e2){
return ["Op","!=",e1,e2]}}],
[["==="],{prec:90,builder:function(e1,op,e2){
return ["Op","===",e1,e2]}}],
[["!=="],{prec:90,builder:function(e1,op,e2){
return ["Op","!==",e1,e2]}}],
[["&"],{prec:100,builder:function(e1,op,e2){
return ["Op","&",e1,e2]}}],
[["^"],{prec:110,builder:function(e1,op,e2){
return ["Op","^",e1,e2]}}],
[["|"],{prec:120,builder:function(e1,op,e2){
return ["Op","|",e1,e2]}}],
[["&&"],{prec:130,builder:function(e1,op,e2){
return ["Op","&&",e1,e2]}}],
[["||"],{prec:140,builder:function(e1,op,e2){
return ["Op","||",e1,e2]}}],
[["="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","=",e1,e2]}}],
[["+="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","+=",e1,e2]}}],
[["-="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","-=",e1,e2]}}],
[["*="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","*=",e1,e2]}}],
[["/="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","/=",e1,e2]}}],
[["%="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","%=",e1,e2]}}],
[["<<="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","<<=",e1,e2]}}],
[[">>="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op",">>=",e1,e2]}}],
[[">>>="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op",">>>=",e1,e2]}}],
[["&="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","&=",e1,e2]}}],
[["^="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","^=",e1,e2]}}],
[["|="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","|=",e1,e2]}}],
[[","],{prec:170,builder:function(e1,op,e2){
return ["Op",",",e1,e2]}}]],
suffix:[
[[".",id],{prec:10,builder:function(e,op){
return ["Dot",e,op[0]]}}],
[["[",_expr,"]"],{prec:10,builder:function(e,op){
return ["Idx",e,op[0]]}}],
[["(",gg.list([_expr_no_top_comma,","]),")"],
{prec:20,builder:function(e,op){
return ["Call",e,op[0]]}}],
[["++"],{prec:30,builder:function(e,op){
return ["Op","X++",e]}}],
[["--"],{prec:30,builder:function(e,op){
return ["Op","X--",e]}}],
[["?",_expr,":",_expr],{prec:150,builder:function(e,op){
return ["Cond",e,op[0],op[1]]}}]],
})
var expr_no_comma=gg.expr([],{
primary:gg.choice([
gg.mseq([
[["(",_expr,")"],{builder:function(ee){
return ["Paren",ee[0]]}}],
[["function",gg.opt(id),"(",
gg.list([id,","]),")","{",
gg.list([stat]),"}"],
{builder:function(ee){
return ["Function",ee[0],ee[1],
ee[2]]}}]]),
id,
js_array,
js_object,
//gg.regexp,
quote,
splice,
gg.string,
gg.number]),
prefix:[
[["new"],{prec:10,assoc:"right",builder:function(op,e){
return ["Op","New",e]}}],
[["++"],{prec:30,builder:function(op,e){
return ["Op","++X",e]}}],
[["--"],{prec:30,builder:function(op,e){
return ["Op","--X",e]}}],
[["!"],{prec:40,builder:function(op,e){
return ["Op","!",e]}}],
[["~"],{prec:40,builder:function(op,e){
return ["Op","~",e]}}],
[["+"],{prec:40,builder:function(op,e){
return ["Op","+X",e]}}],
[["-"],{prec:40,builder:function(op,e){
return ["Op","-X",e]}}],
[["typeof"],{prec:40,builder:function(op,e){
return ["Op","typeof",e]}}],
[["void"],{prec:40,builder:function(op,e){
return ["Op","void",e]}}],
[["delete"],{prec:40,builder:function(op,e){
return ["Op","delete",e]}}]],
infix:[
[["*"],{prec:50,builder:function(e1,op,e2){
return ["Op","*",e1,e2]}}],
[["/"],{prec:50,builder:function(e1,op,e2){
return ["Op","/",e1,e2]}}],
[["%"],{prec:50,builder:function(e1,op,e2){
return ["Op","%",e1,e2]}}],
[["+"],{prec:60,builder:function(e1,op,e2){
return ["Op","+",e1,e2]}}],
[["-"],{prec:60,builder:function(e1,op,e2){
return ["Op","-",e1,e2]}}],
[[">>"],{prec:70,builder:function(e1,op,e2){
return ["Op",">>",e1,e2]}}],
[["<<"],{prec:70,builder:function(e1,op,e2){
return ["Op","<<",e1,e2]}}],
[[">>>"],{prec:70,builder:function(e1,op,e2){
return ["Op",">>>",e1,e2]}}],
[[">"],{prec:80,builder:function(e1,op,e2){
return ["Op",">",e1,e2]}}],
[["<"],{prec:80,builder:function(e1,op,e2){
return ["Op","<",e1,e2]}}],
[["<="],{prec:80,builder:function(e1,op,e2){
return ["Op","<=",e1,e2]}}],
[[">="],{prec:80,builder:function(e1,op,e2){
return ["Op",">=",e1,e2]}}],
[["in"],{prec:80,builder:function(e1,op,e2){
return ["Op","in",e1,e2]}}],
[["instanceof"],{prec:80,builder:function(e1,op,e2){
return ["Op","instanceof",e1,e2]}}],
[["=="],{prec:90,builder:function(e1,op,e2){
return ["Op","==",e1,e2]}}],
[["!="],{prec:90,builder:function(e1,op,e2){
return ["Op","!=",e1,e2]}}],
[["==="],{prec:90,builder:function(e1,op,e2){
return ["Op","===",e1,e2]}}],
[["!=="],{prec:90,builder:function(e1,op,e2){
return ["Op","!==",e1,e2]}}],
[["&"],{prec:100,builder:function(e1,op,e2){
return ["Op","&",e1,e2]}}],
[["^"],{prec:110,builder:function(e1,op,e2){
return ["Op","^",e1,e2]}}],
[["|"],{prec:120,builder:function(e1,op,e2){
return ["Op","|",e1,e2]}}],
[["&&"],{prec:130,builder:function(e1,op,e2){
return ["Op","&&",e1,e2]}}],
[["||"],{prec:140,builder:function(e1,op,e2){
return ["Op","||",e1,e2]}}],
[["="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","=",e1,e2]}}],
[["+="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","+=",e1,e2]}}],
[["-="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","-=",e1,e2]}}],
[["*="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","*=",e1,e2]}}],
[["/="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","/=",e1,e2]}}],
[["%="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","%=",e1,e2]}}],
[["<<="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","<<=",e1,e2]}}],
[[">>="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op",">>=",e1,e2]}}],
[[">>>="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op",">>>=",e1,e2]}}],
[["&="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","&=",e1,e2]}}],
[["^="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","^=",e1,e2]}}],
[["|="],{prec:160,assoc:"right",builder:function(e1,op,e2){
return ["Op","|=",e1,e2]}}]],
suffix:[
[[".",id],{prec:10,builder:function(e,op){
return ["Dot",e,op[0]]}}],
[["[",_expr,"]"],{prec:10,builder:function(e,op){
return ["Idx",e,op[0]]}}],
[["(",gg.list([_expr_no_top_comma,","]),")"],
{prec:20,builder:function(e,op){
return ["Call",e,op[0]]}}],
[["++"],{prec:30,builder:function(e,op){
return ["Op","X++",e]}}],
[["--"],{prec:30,builder:function(e,op){
return ["Op","X--",e]}}],
[["?",_expr,":",_expr],{prec:150,builder:function(e,op){
return ["Cond",e,op[0],op[1]]}}]],
})