1 |
|
2 | (function() {
|
3 | var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
|
4 |
|
5 | Parser = require('jison').Parser;
|
6 |
|
7 | unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
|
8 |
|
9 | o = function(patternString, action, options) {
|
10 | var addLocationDataFn, match, patternCount;
|
11 | patternString = patternString.replace(/\s{2,}/g, ' ');
|
12 | patternCount = patternString.split(' ').length;
|
13 | if (!action) {
|
14 | return [patternString, '$$ = $1;', options];
|
15 | }
|
16 | action = (match = unwrap.exec(action)) ? match[1] : "(" + action + "())";
|
17 | action = action.replace(/\bnew /g, '$&yy.');
|
18 | action = action.replace(/\b(?:Block\.wrap|extend)\b/g, 'yy.$&');
|
19 | addLocationDataFn = function(first, last) {
|
20 | if (!last) {
|
21 | return "yy.addLocationDataFn(@" + first + ")";
|
22 | } else {
|
23 | return "yy.addLocationDataFn(@" + first + ", @" + last + ")";
|
24 | }
|
25 | };
|
26 | action = action.replace(/LOC\(([0-9]*)\)/g, addLocationDataFn('$1'));
|
27 | action = action.replace(/LOC\(([0-9]*),\s*([0-9]*)\)/g, addLocationDataFn('$1', '$2'));
|
28 | return [patternString, "$$ = " + (addLocationDataFn(1, patternCount)) + "(" + action + ");", options];
|
29 | };
|
30 |
|
31 | grammar = {
|
32 | Root: [
|
33 | o('', function() {
|
34 | return new Block;
|
35 | }), o('Body')
|
36 | ],
|
37 | Body: [
|
38 | o('Line', function() {
|
39 | return Block.wrap([$1]);
|
40 | }), o('Body TERMINATOR Line', function() {
|
41 | return $1.push($3);
|
42 | }), o('Body TERMINATOR')
|
43 | ],
|
44 | Line: [o('Expression'), o('Statement')],
|
45 | Statement: [
|
46 | o('Return'), o('Comment'), o('STATEMENT', function() {
|
47 | return new Literal($1);
|
48 | })
|
49 | ],
|
50 | Expression: [o('Value'), o('Invocation'), o('Code'), o('Operation'), o('Assign'), o('If'), o('Try'), o('While'), o('For'), o('Switch'), o('Class'), o('Throw')],
|
51 | Block: [
|
52 | o('INDENT OUTDENT', function() {
|
53 | return new Block;
|
54 | }), o('INDENT Body OUTDENT', function() {
|
55 | return $2;
|
56 | })
|
57 | ],
|
58 | Identifier: [
|
59 | o('IDENTIFIER', function() {
|
60 | return new Literal($1);
|
61 | })
|
62 | ],
|
63 | AlphaNumeric: [
|
64 | o('NUMBER', function() {
|
65 | return new Literal($1);
|
66 | }), o('String')
|
67 | ],
|
68 | String: [
|
69 | o('STRING', function() {
|
70 | return new Literal($1);
|
71 | }), o('STRING_START Body STRING_END', function() {
|
72 | return new Parens($2);
|
73 | })
|
74 | ],
|
75 | Regex: [
|
76 | o('REGEX', function() {
|
77 | return new Literal($1);
|
78 | }), o('REGEX_START Invocation REGEX_END', function() {
|
79 | return $2;
|
80 | })
|
81 | ],
|
82 | Literal: [
|
83 | o('AlphaNumeric'), o('JS', function() {
|
84 | return new Literal($1);
|
85 | }), o('Regex'), o('DEBUGGER', function() {
|
86 | return new Literal($1);
|
87 | }), o('UNDEFINED', function() {
|
88 | return new Undefined;
|
89 | }), o('NULL', function() {
|
90 | return new Null;
|
91 | }), o('BOOL', function() {
|
92 | return new Bool($1);
|
93 | })
|
94 | ],
|
95 | Assign: [
|
96 | o('Assignable = Expression', function() {
|
97 | return new Assign($1, $3);
|
98 | }), o('Assignable = TERMINATOR Expression', function() {
|
99 | return new Assign($1, $4);
|
100 | }), o('Assignable = INDENT Expression OUTDENT', function() {
|
101 | return new Assign($1, $4);
|
102 | })
|
103 | ],
|
104 | AssignObj: [
|
105 | o('ObjAssignable', function() {
|
106 | return new Value($1);
|
107 | }), o('ObjAssignable : Expression', function() {
|
108 | return new Assign(LOC(1)(new Value($1)), $3, 'object');
|
109 | }), o('ObjAssignable : INDENT Expression OUTDENT', function() {
|
110 | return new Assign(LOC(1)(new Value($1)), $4, 'object');
|
111 | }), o('Comment')
|
112 | ],
|
113 | ObjAssignable: [o('Identifier'), o('AlphaNumeric'), o('ThisProperty')],
|
114 | Return: [
|
115 | o('RETURN Expression', function() {
|
116 | return new Return($2);
|
117 | }), o('RETURN', function() {
|
118 | return new Return;
|
119 | })
|
120 | ],
|
121 | Comment: [
|
122 | o('HERECOMMENT', function() {
|
123 | return new Comment($1);
|
124 | })
|
125 | ],
|
126 | Code: [
|
127 | o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() {
|
128 | return new Code($2, $5, $4);
|
129 | }), o('FuncGlyph Block', function() {
|
130 | return new Code([], $2, $1);
|
131 | })
|
132 | ],
|
133 | FuncGlyph: [
|
134 | o('->', function() {
|
135 | return 'func';
|
136 | }), o('=>', function() {
|
137 | return 'boundfunc';
|
138 | })
|
139 | ],
|
140 | OptComma: [o(''), o(',')],
|
141 | ParamList: [
|
142 | o('', function() {
|
143 | return [];
|
144 | }), o('Param', function() {
|
145 | return [$1];
|
146 | }), o('ParamList , Param', function() {
|
147 | return $1.concat($3);
|
148 | }), o('ParamList OptComma TERMINATOR Param', function() {
|
149 | return $1.concat($4);
|
150 | }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() {
|
151 | return $1.concat($4);
|
152 | })
|
153 | ],
|
154 | Param: [
|
155 | o('ParamVar', function() {
|
156 | return new Param($1);
|
157 | }), o('ParamVar ...', function() {
|
158 | return new Param($1, null, true);
|
159 | }), o('ParamVar = Expression', function() {
|
160 | return new Param($1, $3);
|
161 | }), o('...', function() {
|
162 | return new Expansion;
|
163 | })
|
164 | ],
|
165 | ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')],
|
166 | Splat: [
|
167 | o('Expression ...', function() {
|
168 | return new Splat($1);
|
169 | })
|
170 | ],
|
171 | SimpleAssignable: [
|
172 | o('Identifier', function() {
|
173 | return new Value($1);
|
174 | }), o('Value Accessor', function() {
|
175 | return $1.add($2);
|
176 | }), o('Invocation Accessor', function() {
|
177 | return new Value($1, [].concat($2));
|
178 | }), o('ThisProperty')
|
179 | ],
|
180 | Assignable: [
|
181 | o('SimpleAssignable'), o('Array', function() {
|
182 | return new Value($1);
|
183 | }), o('Object', function() {
|
184 | return new Value($1);
|
185 | })
|
186 | ],
|
187 | Value: [
|
188 | o('Assignable'), o('Literal', function() {
|
189 | return new Value($1);
|
190 | }), o('Parenthetical', function() {
|
191 | return new Value($1);
|
192 | }), o('Range', function() {
|
193 | return new Value($1);
|
194 | }), o('This')
|
195 | ],
|
196 | Accessor: [
|
197 | o('. Identifier', function() {
|
198 | return new Access($2);
|
199 | }), o('?. Identifier', function() {
|
200 | return new Access($2, 'soak');
|
201 | }), o(':: Identifier', function() {
|
202 | return [LOC(1)(new Access(new Literal('prototype'))), LOC(2)(new Access($2))];
|
203 | }), o('?:: Identifier', function() {
|
204 | return [LOC(1)(new Access(new Literal('prototype'), 'soak')), LOC(2)(new Access($2))];
|
205 | }), o('::', function() {
|
206 | return new Access(new Literal('prototype'));
|
207 | }), o('Index')
|
208 | ],
|
209 | Index: [
|
210 | o('INDEX_START IndexValue INDEX_END', function() {
|
211 | return $2;
|
212 | }), o('INDEX_SOAK Index', function() {
|
213 | return extend($2, {
|
214 | soak: true
|
215 | });
|
216 | })
|
217 | ],
|
218 | IndexValue: [
|
219 | o('Expression', function() {
|
220 | return new Index($1);
|
221 | }), o('Slice', function() {
|
222 | return new Slice($1);
|
223 | })
|
224 | ],
|
225 | Object: [
|
226 | o('{ AssignList OptComma }', function() {
|
227 | return new Obj($2, $1.generated);
|
228 | })
|
229 | ],
|
230 | AssignList: [
|
231 | o('', function() {
|
232 | return [];
|
233 | }), o('AssignObj', function() {
|
234 | return [$1];
|
235 | }), o('AssignList , AssignObj', function() {
|
236 | return $1.concat($3);
|
237 | }), o('AssignList OptComma TERMINATOR AssignObj', function() {
|
238 | return $1.concat($4);
|
239 | }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() {
|
240 | return $1.concat($4);
|
241 | })
|
242 | ],
|
243 | Class: [
|
244 | o('CLASS', function() {
|
245 | return new Class;
|
246 | }), o('CLASS Block', function() {
|
247 | return new Class(null, null, $2);
|
248 | }), o('CLASS EXTENDS Expression', function() {
|
249 | return new Class(null, $3);
|
250 | }), o('CLASS EXTENDS Expression Block', function() {
|
251 | return new Class(null, $3, $4);
|
252 | }), o('CLASS SimpleAssignable', function() {
|
253 | return new Class($2);
|
254 | }), o('CLASS SimpleAssignable Block', function() {
|
255 | return new Class($2, null, $3);
|
256 | }), o('CLASS SimpleAssignable EXTENDS Expression', function() {
|
257 | return new Class($2, $4);
|
258 | }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() {
|
259 | return new Class($2, $4, $5);
|
260 | })
|
261 | ],
|
262 | Invocation: [
|
263 | o('Value OptFuncExist Arguments', function() {
|
264 | return new Call($1, $3, $2);
|
265 | }), o('Invocation OptFuncExist Arguments', function() {
|
266 | return new Call($1, $3, $2);
|
267 | }), o('SUPER', function() {
|
268 | return new Call('super', [new Splat(new Literal('arguments'))]);
|
269 | }), o('SUPER Arguments', function() {
|
270 | return new Call('super', $2);
|
271 | })
|
272 | ],
|
273 | OptFuncExist: [
|
274 | o('', function() {
|
275 | return false;
|
276 | }), o('FUNC_EXIST', function() {
|
277 | return true;
|
278 | })
|
279 | ],
|
280 | Arguments: [
|
281 | o('CALL_START CALL_END', function() {
|
282 | return [];
|
283 | }), o('CALL_START ArgList OptComma CALL_END', function() {
|
284 | return $2;
|
285 | })
|
286 | ],
|
287 | This: [
|
288 | o('THIS', function() {
|
289 | return new Value(new Literal('this'));
|
290 | }), o('@', function() {
|
291 | return new Value(new Literal('this'));
|
292 | })
|
293 | ],
|
294 | ThisProperty: [
|
295 | o('@ Identifier', function() {
|
296 | return new Value(LOC(1)(new Literal('this')), [LOC(2)(new Access($2))], 'this');
|
297 | })
|
298 | ],
|
299 | Array: [
|
300 | o('[ ]', function() {
|
301 | return new Arr([]);
|
302 | }), o('[ ArgList OptComma ]', function() {
|
303 | return new Arr($2);
|
304 | })
|
305 | ],
|
306 | RangeDots: [
|
307 | o('..', function() {
|
308 | return 'inclusive';
|
309 | }), o('...', function() {
|
310 | return 'exclusive';
|
311 | })
|
312 | ],
|
313 | Range: [
|
314 | o('[ Expression RangeDots Expression ]', function() {
|
315 | return new Range($2, $4, $3);
|
316 | })
|
317 | ],
|
318 | Slice: [
|
319 | o('Expression RangeDots Expression', function() {
|
320 | return new Range($1, $3, $2);
|
321 | }), o('Expression RangeDots', function() {
|
322 | return new Range($1, null, $2);
|
323 | }), o('RangeDots Expression', function() {
|
324 | return new Range(null, $2, $1);
|
325 | }), o('RangeDots', function() {
|
326 | return new Range(null, null, $1);
|
327 | })
|
328 | ],
|
329 | ArgList: [
|
330 | o('Arg', function() {
|
331 | return [$1];
|
332 | }), o('ArgList , Arg', function() {
|
333 | return $1.concat($3);
|
334 | }), o('ArgList OptComma TERMINATOR Arg', function() {
|
335 | return $1.concat($4);
|
336 | }), o('INDENT ArgList OptComma OUTDENT', function() {
|
337 | return $2;
|
338 | }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() {
|
339 | return $1.concat($4);
|
340 | })
|
341 | ],
|
342 | Arg: [
|
343 | o('Expression'), o('Splat'), o('...', function() {
|
344 | return new Expansion;
|
345 | })
|
346 | ],
|
347 | SimpleArgs: [
|
348 | o('Expression'), o('SimpleArgs , Expression', function() {
|
349 | return [].concat($1, $3);
|
350 | })
|
351 | ],
|
352 | Try: [
|
353 | o('TRY Block', function() {
|
354 | return new Try($2);
|
355 | }), o('TRY Block Catch', function() {
|
356 | return new Try($2, $3[0], $3[1]);
|
357 | }), o('TRY Block FINALLY Block', function() {
|
358 | return new Try($2, null, null, $4);
|
359 | }), o('TRY Block Catch FINALLY Block', function() {
|
360 | return new Try($2, $3[0], $3[1], $5);
|
361 | })
|
362 | ],
|
363 | Catch: [
|
364 | o('CATCH Identifier Block', function() {
|
365 | return [$2, $3];
|
366 | }), o('CATCH Object Block', function() {
|
367 | return [LOC(2)(new Value($2)), $3];
|
368 | }), o('CATCH Block', function() {
|
369 | return [null, $2];
|
370 | })
|
371 | ],
|
372 | Throw: [
|
373 | o('THROW Expression', function() {
|
374 | return new Throw($2);
|
375 | })
|
376 | ],
|
377 | Parenthetical: [
|
378 | o('( Body )', function() {
|
379 | return new Parens($2);
|
380 | }), o('( INDENT Body OUTDENT )', function() {
|
381 | return new Parens($3);
|
382 | })
|
383 | ],
|
384 | WhileSource: [
|
385 | o('WHILE Expression', function() {
|
386 | return new While($2);
|
387 | }), o('WHILE Expression WHEN Expression', function() {
|
388 | return new While($2, {
|
389 | guard: $4
|
390 | });
|
391 | }), o('UNTIL Expression', function() {
|
392 | return new While($2, {
|
393 | invert: true
|
394 | });
|
395 | }), o('UNTIL Expression WHEN Expression', function() {
|
396 | return new While($2, {
|
397 | invert: true,
|
398 | guard: $4
|
399 | });
|
400 | })
|
401 | ],
|
402 | While: [
|
403 | o('WhileSource Block', function() {
|
404 | return $1.addBody($2);
|
405 | }), o('Statement WhileSource', function() {
|
406 | return $2.addBody(LOC(1)(Block.wrap([$1])));
|
407 | }), o('Expression WhileSource', function() {
|
408 | return $2.addBody(LOC(1)(Block.wrap([$1])));
|
409 | }), o('Loop', function() {
|
410 | return $1;
|
411 | })
|
412 | ],
|
413 | Loop: [
|
414 | o('LOOP Block', function() {
|
415 | return new While(LOC(1)(new Literal('true'))).addBody($2);
|
416 | }), o('LOOP Expression', function() {
|
417 | return new While(LOC(1)(new Literal('true'))).addBody(LOC(2)(Block.wrap([$2])));
|
418 | })
|
419 | ],
|
420 | For: [
|
421 | o('Statement ForBody', function() {
|
422 | return new For($1, $2);
|
423 | }), o('Expression ForBody', function() {
|
424 | return new For($1, $2);
|
425 | }), o('ForBody Block', function() {
|
426 | return new For($2, $1);
|
427 | })
|
428 | ],
|
429 | ForBody: [
|
430 | o('FOR Range', function() {
|
431 | return {
|
432 | source: LOC(2)(new Value($2))
|
433 | };
|
434 | }), o('FOR Range BY Expression', function() {
|
435 | return {
|
436 | source: LOC(2)(new Value($2)),
|
437 | step: $4
|
438 | };
|
439 | }), o('ForStart ForSource', function() {
|
440 | $2.own = $1.own;
|
441 | $2.name = $1[0];
|
442 | $2.index = $1[1];
|
443 | return $2;
|
444 | })
|
445 | ],
|
446 | ForStart: [
|
447 | o('FOR ForVariables', function() {
|
448 | return $2;
|
449 | }), o('FOR OWN ForVariables', function() {
|
450 | $3.own = true;
|
451 | return $3;
|
452 | })
|
453 | ],
|
454 | ForValue: [
|
455 | o('Identifier'), o('ThisProperty'), o('Array', function() {
|
456 | return new Value($1);
|
457 | }), o('Object', function() {
|
458 | return new Value($1);
|
459 | })
|
460 | ],
|
461 | ForVariables: [
|
462 | o('ForValue', function() {
|
463 | return [$1];
|
464 | }), o('ForValue , ForValue', function() {
|
465 | return [$1, $3];
|
466 | })
|
467 | ],
|
468 | ForSource: [
|
469 | o('FORIN Expression', function() {
|
470 | return {
|
471 | source: $2
|
472 | };
|
473 | }), o('FOROF Expression', function() {
|
474 | return {
|
475 | source: $2,
|
476 | object: true
|
477 | };
|
478 | }), o('FORIN Expression WHEN Expression', function() {
|
479 | return {
|
480 | source: $2,
|
481 | guard: $4
|
482 | };
|
483 | }), o('FOROF Expression WHEN Expression', function() {
|
484 | return {
|
485 | source: $2,
|
486 | guard: $4,
|
487 | object: true
|
488 | };
|
489 | }), o('FORIN Expression BY Expression', function() {
|
490 | return {
|
491 | source: $2,
|
492 | step: $4
|
493 | };
|
494 | }), o('FORIN Expression WHEN Expression BY Expression', function() {
|
495 | return {
|
496 | source: $2,
|
497 | guard: $4,
|
498 | step: $6
|
499 | };
|
500 | }), o('FORIN Expression BY Expression WHEN Expression', function() {
|
501 | return {
|
502 | source: $2,
|
503 | step: $4,
|
504 | guard: $6
|
505 | };
|
506 | })
|
507 | ],
|
508 | Switch: [
|
509 | o('SWITCH Expression INDENT Whens OUTDENT', function() {
|
510 | return new Switch($2, $4);
|
511 | }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() {
|
512 | return new Switch($2, $4, $6);
|
513 | }), o('SWITCH INDENT Whens OUTDENT', function() {
|
514 | return new Switch(null, $3);
|
515 | }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() {
|
516 | return new Switch(null, $3, $5);
|
517 | })
|
518 | ],
|
519 | Whens: [
|
520 | o('When'), o('Whens When', function() {
|
521 | return $1.concat($2);
|
522 | })
|
523 | ],
|
524 | When: [
|
525 | o('LEADING_WHEN SimpleArgs Block', function() {
|
526 | return [[$2, $3]];
|
527 | }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() {
|
528 | return [[$2, $3]];
|
529 | })
|
530 | ],
|
531 | IfBlock: [
|
532 | o('IF Expression Block', function() {
|
533 | return new If($2, $3, {
|
534 | type: $1
|
535 | });
|
536 | }), o('IfBlock ELSE IF Expression Block', function() {
|
537 | return $1.addElse(LOC(3, 5)(new If($4, $5, {
|
538 | type: $3
|
539 | })));
|
540 | })
|
541 | ],
|
542 | If: [
|
543 | o('IfBlock'), o('IfBlock ELSE Block', function() {
|
544 | return $1.addElse($3);
|
545 | }), o('Statement POST_IF Expression', function() {
|
546 | return new If($3, LOC(1)(Block.wrap([$1])), {
|
547 | type: $2,
|
548 | statement: true
|
549 | });
|
550 | }), o('Expression POST_IF Expression', function() {
|
551 | return new If($3, LOC(1)(Block.wrap([$1])), {
|
552 | type: $2,
|
553 | statement: true
|
554 | });
|
555 | })
|
556 | ],
|
557 | Operation: [
|
558 | o('UNARY Expression', function() {
|
559 | return new Op($1, $2);
|
560 | }), o('UNARY_MATH Expression', function() {
|
561 | return new Op($1, $2);
|
562 | }), o('- Expression', (function() {
|
563 | return new Op('-', $2);
|
564 | }), {
|
565 | prec: 'UNARY_MATH'
|
566 | }), o('+ Expression', (function() {
|
567 | return new Op('+', $2);
|
568 | }), {
|
569 | prec: 'UNARY_MATH'
|
570 | }), o('YIELD Statement', function() {
|
571 | return new Op($1, $2);
|
572 | }), o('YIELD Expression', function() {
|
573 | return new Op($1, $2);
|
574 | }), o('YIELD FROM Expression', function() {
|
575 | return new Op($1.concat($2), $3);
|
576 | }), o('-- SimpleAssignable', function() {
|
577 | return new Op('--', $2);
|
578 | }), o('++ SimpleAssignable', function() {
|
579 | return new Op('++', $2);
|
580 | }), o('SimpleAssignable --', function() {
|
581 | return new Op('--', $1, null, true);
|
582 | }), o('SimpleAssignable ++', function() {
|
583 | return new Op('++', $1, null, true);
|
584 | }), o('Expression ?', function() {
|
585 | return new Existence($1);
|
586 | }), o('Expression + Expression', function() {
|
587 | return new Op('+', $1, $3);
|
588 | }), o('Expression - Expression', function() {
|
589 | return new Op('-', $1, $3);
|
590 | }), o('Expression MATH Expression', function() {
|
591 | return new Op($2, $1, $3);
|
592 | }), o('Expression ** Expression', function() {
|
593 | return new Op($2, $1, $3);
|
594 | }), o('Expression SHIFT Expression', function() {
|
595 | return new Op($2, $1, $3);
|
596 | }), o('Expression COMPARE Expression', function() {
|
597 | return new Op($2, $1, $3);
|
598 | }), o('Expression LOGIC Expression', function() {
|
599 | return new Op($2, $1, $3);
|
600 | }), o('Expression RELATION Expression', function() {
|
601 | if ($2.charAt(0) === '!') {
|
602 | return new Op($2.slice(1), $1, $3).invert();
|
603 | } else {
|
604 | return new Op($2, $1, $3);
|
605 | }
|
606 | }), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() {
|
607 | return new Assign($1, $3, $2);
|
608 | }), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() {
|
609 | return new Assign($1, $4, $2);
|
610 | }), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() {
|
611 | return new Assign($1, $4, $2);
|
612 | }), o('SimpleAssignable EXTENDS Expression', function() {
|
613 | return new Extends($1, $3);
|
614 | })
|
615 | ]
|
616 | };
|
617 |
|
618 | operators = [['left', '.', '?.', '::', '?::'], ['left', 'CALL_START', 'CALL_END'], ['nonassoc', '++', '--'], ['left', '?'], ['right', 'UNARY'], ['right', '**'], ['right', 'UNARY_MATH'], ['left', 'MATH'], ['left', '+', '-'], ['left', 'SHIFT'], ['left', 'RELATION'], ['left', 'COMPARE'], ['left', 'LOGIC'], ['nonassoc', 'INDENT', 'OUTDENT'], ['right', 'YIELD'], ['right', '=', ':', 'COMPOUND_ASSIGN', 'RETURN', 'THROW', 'EXTENDS'], ['right', 'FORIN', 'FOROF', 'BY', 'WHEN'], ['right', 'IF', 'ELSE', 'FOR', 'WHILE', 'UNTIL', 'LOOP', 'SUPER', 'CLASS'], ['left', 'POST_IF']];
|
619 |
|
620 | tokens = [];
|
621 |
|
622 | for (name in grammar) {
|
623 | alternatives = grammar[name];
|
624 | grammar[name] = (function() {
|
625 | var i, j, len, len1, ref, results;
|
626 | results = [];
|
627 | for (i = 0, len = alternatives.length; i < len; i++) {
|
628 | alt = alternatives[i];
|
629 | ref = alt[0].split(' ');
|
630 | for (j = 0, len1 = ref.length; j < len1; j++) {
|
631 | token = ref[j];
|
632 | if (!grammar[token]) {
|
633 | tokens.push(token);
|
634 | }
|
635 | }
|
636 | if (name === 'Root') {
|
637 | alt[1] = "return " + alt[1];
|
638 | }
|
639 | results.push(alt);
|
640 | }
|
641 | return results;
|
642 | })();
|
643 | }
|
644 |
|
645 | exports.parser = new Parser({
|
646 | tokens: tokens.join(' '),
|
647 | bnf: grammar,
|
648 | operators: operators.reverse(),
|
649 | startSymbol: 'Root'
|
650 | });
|
651 |
|
652 | }).call(this);
|