1 // Generated by CoffeeScript 1.10.0
3 var Parser, alt, alternatives, grammar, name, o, operators, token, tokens, unwrap;
5 Parser = require('jison').Parser;
7 unwrap = /^function\s*\(\)\s*\{\s*return\s*([\s\S]*);\s*\}/;
9 o = function(patternString, action, options) {
10 var addLocationDataFn, match, patternCount;
11 patternString = patternString.replace(/\s{2,}/g, ' ');
12 patternCount = patternString.split(' ').length;
14 return [patternString, '$$ = $1;', options];
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) {
21 return "yy.addLocationDataFn(@" + first + ")";
23 return "yy.addLocationDataFn(@" + first + ", @" + last + ")";
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];
38 o('Line', function() {
39 return Block.wrap([$1]);
40 }), o('Body TERMINATOR Line', function() {
42 }), o('Body TERMINATOR')
44 Line: [o('Expression'), o('Statement')],
46 o('Return'), o('Comment'), o('STATEMENT', function() {
47 return new Literal($1);
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')],
52 o('INDENT OUTDENT', function() {
54 }), o('INDENT Body OUTDENT', function() {
59 o('IDENTIFIER', function() {
60 return new Literal($1);
64 o('NUMBER', function() {
65 return new Literal($1);
69 o('STRING', function() {
70 return new Literal($1);
71 }), o('STRING_START Body STRING_END', function() {
72 return new Parens($2);
76 o('REGEX', function() {
77 return new Literal($1);
78 }), o('REGEX_START Invocation REGEX_END', function() {
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() {
89 }), o('NULL', function() {
91 }), o('BOOL', function() {
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);
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 operatorToken: LOC(2)(new Literal($2))
111 }), o('ObjAssignable : INDENT Expression OUTDENT', function() {
112 return new Assign(LOC(1)(new Value($1)), $4, 'object', {
113 operatorToken: LOC(2)(new Literal($2))
115 }), o('SimpleObjAssignable = Expression', function() {
116 return new Assign(LOC(1)(new Value($1)), $3, null, {
117 operatorToken: LOC(2)(new Literal($2))
119 }), o('SimpleObjAssignable = INDENT Expression OUTDENT', function() {
120 return new Assign(LOC(1)(new Value($1)), $4, null, {
121 operatorToken: LOC(2)(new Literal($2))
125 SimpleObjAssignable: [o('Identifier'), o('ThisProperty')],
126 ObjAssignable: [o('SimpleObjAssignable'), o('AlphaNumeric')],
128 o('RETURN Expression', function() {
129 return new Return($2);
130 }), o('RETURN', function() {
135 o('HERECOMMENT', function() {
136 return new Comment($1);
140 o('PARAM_START ParamList PARAM_END FuncGlyph Block', function() {
141 return new Code($2, $5, $4);
142 }), o('FuncGlyph Block', function() {
143 return new Code([], $2, $1);
149 }), o('=>', function() {
153 OptComma: [o(''), o(',')],
157 }), o('Param', function() {
159 }), o('ParamList , Param', function() {
160 return $1.concat($3);
161 }), o('ParamList OptComma TERMINATOR Param', function() {
162 return $1.concat($4);
163 }), o('ParamList OptComma INDENT ParamList OptComma OUTDENT', function() {
164 return $1.concat($4);
168 o('ParamVar', function() {
169 return new Param($1);
170 }), o('ParamVar ...', function() {
171 return new Param($1, null, true);
172 }), o('ParamVar = Expression', function() {
173 return new Param($1, $3);
174 }), o('...', function() {
175 return new Expansion;
178 ParamVar: [o('Identifier'), o('ThisProperty'), o('Array'), o('Object')],
180 o('Expression ...', function() {
181 return new Splat($1);
185 o('Identifier', function() {
186 return new Value($1);
187 }), o('Value Accessor', function() {
189 }), o('Invocation Accessor', function() {
190 return new Value($1, [].concat($2));
191 }), o('ThisProperty')
194 o('SimpleAssignable'), o('Array', function() {
195 return new Value($1);
196 }), o('Object', function() {
197 return new Value($1);
201 o('Assignable'), o('Literal', function() {
202 return new Value($1);
203 }), o('Parenthetical', function() {
204 return new Value($1);
205 }), o('Range', function() {
206 return new Value($1);
210 o('. Identifier', function() {
211 return new Access($2);
212 }), o('?. Identifier', function() {
213 return new Access($2, 'soak');
214 }), o(':: Identifier', function() {
215 return [LOC(1)(new Access(new Literal('prototype'))), LOC(2)(new Access($2))];
216 }), o('?:: Identifier', function() {
217 return [LOC(1)(new Access(new Literal('prototype'), 'soak')), LOC(2)(new Access($2))];
218 }), o('::', function() {
219 return new Access(new Literal('prototype'));
223 o('INDEX_START IndexValue INDEX_END', function() {
225 }), o('INDEX_SOAK Index', function() {
232 o('Expression', function() {
233 return new Index($1);
234 }), o('Slice', function() {
235 return new Slice($1);
239 o('{ AssignList OptComma }', function() {
240 return new Obj($2, $1.generated);
246 }), o('AssignObj', function() {
248 }), o('AssignList , AssignObj', function() {
249 return $1.concat($3);
250 }), o('AssignList OptComma TERMINATOR AssignObj', function() {
251 return $1.concat($4);
252 }), o('AssignList OptComma INDENT AssignList OptComma OUTDENT', function() {
253 return $1.concat($4);
257 o('CLASS', function() {
259 }), o('CLASS Block', function() {
260 return new Class(null, null, $2);
261 }), o('CLASS EXTENDS Expression', function() {
262 return new Class(null, $3);
263 }), o('CLASS EXTENDS Expression Block', function() {
264 return new Class(null, $3, $4);
265 }), o('CLASS SimpleAssignable', function() {
266 return new Class($2);
267 }), o('CLASS SimpleAssignable Block', function() {
268 return new Class($2, null, $3);
269 }), o('CLASS SimpleAssignable EXTENDS Expression', function() {
270 return new Class($2, $4);
271 }), o('CLASS SimpleAssignable EXTENDS Expression Block', function() {
272 return new Class($2, $4, $5);
276 o('Value OptFuncExist Arguments', function() {
277 return new Call($1, $3, $2);
278 }), o('Invocation OptFuncExist Arguments', function() {
279 return new Call($1, $3, $2);
280 }), o('SUPER', function() {
281 return new Call('super', [new Splat(new Literal('arguments'))]);
282 }), o('SUPER Arguments', function() {
283 return new Call('super', $2);
289 }), o('FUNC_EXIST', function() {
294 o('CALL_START CALL_END', function() {
296 }), o('CALL_START ArgList OptComma CALL_END', function() {
301 o('THIS', function() {
302 return new Value(new Literal('this'));
303 }), o('@', function() {
304 return new Value(new Literal('this'));
308 o('@ Identifier', function() {
309 return new Value(LOC(1)(new Literal('this')), [LOC(2)(new Access($2))], 'this');
313 o('[ ]', function() {
315 }), o('[ ArgList OptComma ]', function() {
322 }), o('...', function() {
327 o('[ Expression RangeDots Expression ]', function() {
328 return new Range($2, $4, $3);
332 o('Expression RangeDots Expression', function() {
333 return new Range($1, $3, $2);
334 }), o('Expression RangeDots', function() {
335 return new Range($1, null, $2);
336 }), o('RangeDots Expression', function() {
337 return new Range(null, $2, $1);
338 }), o('RangeDots', function() {
339 return new Range(null, null, $1);
343 o('Arg', function() {
345 }), o('ArgList , Arg', function() {
346 return $1.concat($3);
347 }), o('ArgList OptComma TERMINATOR Arg', function() {
348 return $1.concat($4);
349 }), o('INDENT ArgList OptComma OUTDENT', function() {
351 }), o('ArgList OptComma INDENT ArgList OptComma OUTDENT', function() {
352 return $1.concat($4);
356 o('Expression'), o('Splat'), o('...', function() {
357 return new Expansion;
361 o('Expression'), o('SimpleArgs , Expression', function() {
362 return [].concat($1, $3);
366 o('TRY Block', function() {
368 }), o('TRY Block Catch', function() {
369 return new Try($2, $3[0], $3[1]);
370 }), o('TRY Block FINALLY Block', function() {
371 return new Try($2, null, null, $4);
372 }), o('TRY Block Catch FINALLY Block', function() {
373 return new Try($2, $3[0], $3[1], $5);
377 o('CATCH Identifier Block', function() {
379 }), o('CATCH Object Block', function() {
380 return [LOC(2)(new Value($2)), $3];
381 }), o('CATCH Block', function() {
386 o('THROW Expression', function() {
387 return new Throw($2);
391 o('( Body )', function() {
392 return new Parens($2);
393 }), o('( INDENT Body OUTDENT )', function() {
394 return new Parens($3);
398 o('WHILE Expression', function() {
399 return new While($2);
400 }), o('WHILE Expression WHEN Expression', function() {
401 return new While($2, {
404 }), o('UNTIL Expression', function() {
405 return new While($2, {
408 }), o('UNTIL Expression WHEN Expression', function() {
409 return new While($2, {
416 o('WhileSource Block', function() {
417 return $1.addBody($2);
418 }), o('Statement WhileSource', function() {
419 return $2.addBody(LOC(1)(Block.wrap([$1])));
420 }), o('Expression WhileSource', function() {
421 return $2.addBody(LOC(1)(Block.wrap([$1])));
422 }), o('Loop', function() {
427 o('LOOP Block', function() {
428 return new While(LOC(1)(new Literal('true'))).addBody($2);
429 }), o('LOOP Expression', function() {
430 return new While(LOC(1)(new Literal('true'))).addBody(LOC(2)(Block.wrap([$2])));
434 o('Statement ForBody', function() {
435 return new For($1, $2);
436 }), o('Expression ForBody', function() {
437 return new For($1, $2);
438 }), o('ForBody Block', function() {
439 return new For($2, $1);
443 o('FOR Range', function() {
445 source: LOC(2)(new Value($2))
447 }), o('FOR Range BY Expression', function() {
449 source: LOC(2)(new Value($2)),
452 }), o('ForStart ForSource', function() {
460 o('FOR ForVariables', function() {
462 }), o('FOR OWN ForVariables', function() {
468 o('Identifier'), o('ThisProperty'), o('Array', function() {
469 return new Value($1);
470 }), o('Object', function() {
471 return new Value($1);
475 o('ForValue', function() {
477 }), o('ForValue , ForValue', function() {
482 o('FORIN Expression', function() {
486 }), o('FOROF Expression', function() {
491 }), o('FORIN Expression WHEN Expression', function() {
496 }), o('FOROF Expression WHEN Expression', function() {
502 }), o('FORIN Expression BY Expression', function() {
507 }), o('FORIN Expression WHEN Expression BY Expression', function() {
513 }), o('FORIN Expression BY Expression WHEN Expression', function() {
522 o('SWITCH Expression INDENT Whens OUTDENT', function() {
523 return new Switch($2, $4);
524 }), o('SWITCH Expression INDENT Whens ELSE Block OUTDENT', function() {
525 return new Switch($2, $4, $6);
526 }), o('SWITCH INDENT Whens OUTDENT', function() {
527 return new Switch(null, $3);
528 }), o('SWITCH INDENT Whens ELSE Block OUTDENT', function() {
529 return new Switch(null, $3, $5);
533 o('When'), o('Whens When', function() {
534 return $1.concat($2);
538 o('LEADING_WHEN SimpleArgs Block', function() {
540 }), o('LEADING_WHEN SimpleArgs Block TERMINATOR', function() {
545 o('IF Expression Block', function() {
546 return new If($2, $3, {
549 }), o('IfBlock ELSE IF Expression Block', function() {
550 return $1.addElse(LOC(3, 5)(new If($4, $5, {
556 o('IfBlock'), o('IfBlock ELSE Block', function() {
557 return $1.addElse($3);
558 }), o('Statement POST_IF Expression', function() {
559 return new If($3, LOC(1)(Block.wrap([$1])), {
563 }), o('Expression POST_IF Expression', function() {
564 return new If($3, LOC(1)(Block.wrap([$1])), {
571 o('UNARY Expression', function() {
572 return new Op($1, $2);
573 }), o('UNARY_MATH Expression', function() {
574 return new Op($1, $2);
575 }), o('- Expression', (function() {
576 return new Op('-', $2);
579 }), o('+ Expression', (function() {
580 return new Op('+', $2);
583 }), o('YIELD Statement', function() {
584 return new Op($1, $2);
585 }), o('YIELD Expression', function() {
586 return new Op($1, $2);
587 }), o('YIELD FROM Expression', function() {
588 return new Op($1.concat($2), $3);
589 }), o('-- SimpleAssignable', function() {
590 return new Op('--', $2);
591 }), o('++ SimpleAssignable', function() {
592 return new Op('++', $2);
593 }), o('SimpleAssignable --', function() {
594 return new Op('--', $1, null, true);
595 }), o('SimpleAssignable ++', function() {
596 return new Op('++', $1, null, true);
597 }), o('Expression ?', function() {
598 return new Existence($1);
599 }), o('Expression + Expression', function() {
600 return new Op('+', $1, $3);
601 }), o('Expression - Expression', function() {
602 return new Op('-', $1, $3);
603 }), o('Expression MATH Expression', function() {
604 return new Op($2, $1, $3);
605 }), o('Expression ** Expression', function() {
606 return new Op($2, $1, $3);
607 }), o('Expression SHIFT Expression', function() {
608 return new Op($2, $1, $3);
609 }), o('Expression COMPARE Expression', function() {
610 return new Op($2, $1, $3);
611 }), o('Expression LOGIC Expression', function() {
612 return new Op($2, $1, $3);
613 }), o('Expression RELATION Expression', function() {
614 if ($2.charAt(0) === '!') {
615 return new Op($2.slice(1), $1, $3).invert();
617 return new Op($2, $1, $3);
619 }), o('SimpleAssignable COMPOUND_ASSIGN Expression', function() {
620 return new Assign($1, $3, $2);
621 }), o('SimpleAssignable COMPOUND_ASSIGN INDENT Expression OUTDENT', function() {
622 return new Assign($1, $4, $2);
623 }), o('SimpleAssignable COMPOUND_ASSIGN TERMINATOR Expression', function() {
624 return new Assign($1, $4, $2);
625 }), o('SimpleAssignable EXTENDS Expression', function() {
626 return new Extends($1, $3);
631 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']];
635 for (name in grammar) {
636 alternatives = grammar[name];
637 grammar[name] = (function() {
638 var i, j, len, len1, ref, results;
640 for (i = 0, len = alternatives.length; i < len; i++) {
641 alt = alternatives[i];
642 ref = alt[0].split(' ');
643 for (j = 0, len1 = ref.length; j < len1; j++) {
645 if (!grammar[token]) {
649 if (name === 'Root') {
650 alt[1] = "return " + alt[1];
658 exports.parser = new Parser({
659 tokens: tokens.join(' '),
661 operators: operators.reverse(),