Spaces:
Sleeping
Sleeping
| /* parser generated by jison 0.4.18 */ | |
| /* | |
| Returns a Parser object of the following structure: | |
| Parser: { | |
| yy: {} | |
| } | |
| Parser.prototype: { | |
| yy: {}, | |
| trace: function(), | |
| symbols_: {associative list: name ==> number}, | |
| terminals_: {associative list: number ==> name}, | |
| productions_: [...], | |
| performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$), | |
| table: [...], | |
| defaultActions: {...}, | |
| parseError: function(str, hash), | |
| parse: function(input), | |
| lexer: { | |
| EOF: 1, | |
| parseError: function(str, hash), | |
| setInput: function(input), | |
| input: function(), | |
| unput: function(str), | |
| more: function(), | |
| less: function(n), | |
| pastInput: function(), | |
| upcomingInput: function(), | |
| showPosition: function(), | |
| test_match: function(regex_match_array, rule_index), | |
| next: function(), | |
| lex: function(), | |
| begin: function(condition), | |
| popState: function(), | |
| _currentRules: function(), | |
| topState: function(), | |
| pushState: function(condition), | |
| options: { | |
| ranges: boolean (optional: true ==> token location info will include a .range[] member) | |
| flex: boolean (optional: true ==> flex-like lexing behaviour where the rules are tested exhaustively to find the longest match) | |
| backtrack_lexer: boolean (optional: true ==> lexer regexes are tested in order and for each matching regex the action code is invoked; the lexer terminates the scan when a token is returned by the action code) | |
| }, | |
| performAction: function(yy, yy_, $avoiding_name_collisions, YY_START), | |
| rules: [...], | |
| conditions: {associative list: name ==> set}, | |
| } | |
| } | |
| token location info (@$, _$, etc.): { | |
| first_line: n, | |
| last_line: n, | |
| first_column: n, | |
| last_column: n, | |
| range: [start_number, end_number] (where the numbers are indexes into the input string, regular zero-based) | |
| } | |
| the parseError function receives a 'hash' object with these members for lexer and parser errors: { | |
| text: (matched text) | |
| token: (the produced terminal token, if any) | |
| line: (yylineno) | |
| } | |
| while parser (grammar) errors will also provide these members, i.e. parser errors deliver a superset of attributes: { | |
| loc: (yylloc) | |
| expected: (string describing the set of expected tokens) | |
| recoverable: (boolean: TRUE when the parser has a error recovery rule available for this particular error) | |
| } | |
| */ | |
| var parser = (function(){ | |
| var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,13],$V1=[1,16],$V2=[1,15],$V3=[1,26],$V4=[1,29],$V5=[1,28],$V6=[1,30],$V7=[5,13,22,27,29],$V8=[2,15],$V9=[1,32],$Va=[5,14,21,22,27,28,29]; | |
| var parser = {trace: function trace () { }, | |
| yy: {}, | |
| symbols_: {"error":2,"start_symbol":3,"measure_layout":4,"EOF":5,"index_wise_measure_layout":6,"i:":7,"s:":8,"segment_wise_measure_layout":9,"iw_sequence":10,"iw_item":11,"range":12,",":13,"UNSIGNED":14,"..":15,"single":16,"iw_block_item":17,"iw_volta":18,"iw_aba":19,"iw_block":20,"[":21,"]":22,"*":23,"iw_optional_alternates":24,"iw_alternates":25,"{":26,"}":27,"<":28,">":29,"sw_sequence":30,"sw_item":31,"segment":32,"sw_block_item":33,"sw_volta":34,"sw_aba":35,"sw_block":36,"sw_optional_alternates":37,"sw_alternates":38,"$accept":0,"$end":1}, | |
| terminals_: {2:"error",5:"EOF",7:"i:",8:"s:",13:",",14:"UNSIGNED",15:"..",21:"[",22:"]",23:"*",26:"{",27:"}",28:"<",29:">"}, | |
| productions_: [0,[3,2],[4,1],[4,2],[4,2],[6,1],[10,1],[10,1],[10,3],[10,3],[12,3],[11,1],[11,1],[11,1],[11,1],[16,1],[17,1],[20,3],[18,4],[24,0],[24,1],[25,3],[19,5],[9,1],[30,1],[30,2],[31,1],[31,1],[31,1],[31,1],[32,1],[33,1],[36,3],[34,4],[37,0],[37,1],[38,3],[35,4]], | |
| performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { | |
| /* this == yyval */ | |
| var $0 = $$.length - 1; | |
| switch (yystate) { | |
| case 1: | |
| return $$[$0-1]; | |
| break; | |
| case 2: | |
| this.$ = root(null, $$[$0]); | |
| break; | |
| case 3: | |
| this.$ = root("index-wise", $$[$0]); | |
| break; | |
| case 4: | |
| this.$ = root("segment-wise", serialize($$[$0])); | |
| break; | |
| case 5: case 23: | |
| if ($$[$0].length === 1 && $$[$0][0].__prototype === "BlockMLayout") | |
| this.$ = $$[$0][0]; | |
| else | |
| this.$ = blockLayout($$[$0]); | |
| break; | |
| case 6: case 24: | |
| this.$ = [$$[$0]]; | |
| break; | |
| case 7: case 11: case 12: case 13: case 14: case 20: case 27: case 28: case 29: case 35: | |
| this.$ = $$[$0]; | |
| break; | |
| case 8: | |
| this.$ = [...$$[$0-2], $$[$0]]; | |
| break; | |
| case 9: | |
| this.$ = [...$$[$0-2], ...$$[$0]]; | |
| break; | |
| case 10: | |
| this.$ = range($$[$0-2], $$[$0]); | |
| break; | |
| case 15: | |
| this.$ = singleLayout($$[$0]); | |
| break; | |
| case 16: case 31: | |
| this.$ = blockLayout($$[$0]); | |
| break; | |
| case 17: case 32: | |
| this.$ = $$[$0-1]; | |
| break; | |
| case 18: case 33: | |
| this.$ = voltaBlock($$[$0-3], $$[$0-1], $$[$0]); | |
| break; | |
| case 19: case 34: | |
| this.$ = null; | |
| break; | |
| case 21: case 36: | |
| this.$ = alternates($$[$0-1]); | |
| break; | |
| case 22: | |
| this.$ = abaBlock($$[$0-3], $$[$0-1]); | |
| break; | |
| case 25: | |
| this.$ = [...$$[$0-1], $$[$0]]; | |
| break; | |
| case 26: | |
| this.$ = blockLayout([$$[$0]]); | |
| break; | |
| case 30: | |
| this.$ = segment($$[$0]); | |
| break; | |
| case 37: | |
| this.$ = abaBlock($$[$0-2], $$[$0-1]); | |
| break; | |
| } | |
| }, | |
| table: [{3:1,4:2,6:3,7:[1,4],8:[1,5],10:6,11:7,12:8,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{1:[3]},{5:[1,17]},{5:[2,2]},{6:18,10:6,11:7,12:8,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{9:19,14:$V3,21:$V4,28:$V5,30:20,31:21,32:22,33:23,34:24,35:25,36:27},{5:[2,5],13:$V6},o($V7,[2,6]),o($V7,[2,7]),o($V7,[2,11]),o($V7,[2,12]),o($V7,[2,13]),o($V7,[2,14]),o($V7,$V8,{15:[1,31],23:$V9}),o($V7,[2,16]),{11:33,14:[1,34],16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{10:35,11:7,12:8,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{1:[2,1]},{5:[2,3]},{5:[2,4]},{5:[2,23],14:$V3,21:$V4,28:$V5,31:36,32:22,33:23,34:24,35:25,36:27},o($Va,[2,24]),o($Va,[2,26]),o($Va,[2,27]),o($Va,[2,28]),o($Va,[2,29]),o($Va,[2,30],{23:[1,37]}),o($Va,[2,31]),{14:$V3,21:$V4,28:$V5,31:38,32:22,33:23,34:24,35:25,36:27},{14:$V3,21:$V4,28:$V5,30:39,31:21,32:22,33:23,34:24,35:25,36:27},{11:40,12:41,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{14:[1,42]},{20:43,21:$V1},{13:[1,44]},{13:$V8,23:$V9},{13:$V6,22:[1,45]},o($Va,[2,25]),{21:$V4,36:46},{14:$V3,21:$V4,28:$V5,30:47,31:21,32:22,33:23,34:24,35:25,36:27},{14:$V3,21:$V4,22:[1,48],28:$V5,31:36,32:22,33:23,34:24,35:25,36:27},o($V7,[2,8]),o($V7,[2,9]),o($V7,[2,10]),o($V7,[2,19],{24:49,25:50,26:[1,51]}),{10:52,11:7,12:8,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},o([5,13,22,26,27,29],[2,17]),o($Va,[2,34],{37:53,38:54,26:[1,55]}),{14:$V3,21:$V4,28:$V5,29:[1,56],31:36,32:22,33:23,34:24,35:25,36:27},o([5,14,21,22,26,27,28,29],[2,32]),o($V7,[2,18]),o($V7,[2,20]),{10:57,11:7,12:8,14:$V0,16:9,17:10,18:11,19:12,20:14,21:$V1,28:$V2},{13:$V6,29:[1,58]},o($Va,[2,33]),o($Va,[2,35]),{14:$V3,21:$V4,28:$V5,30:59,31:21,32:22,33:23,34:24,35:25,36:27},o($Va,[2,37]),{13:$V6,27:[1,60]},o($V7,[2,22]),{14:$V3,21:$V4,27:[1,61],28:$V5,31:36,32:22,33:23,34:24,35:25,36:27},o($V7,[2,21]),o($Va,[2,36])], | |
| defaultActions: {3:[2,2],17:[2,1],18:[2,3],19:[2,4]}, | |
| parseError: function parseError (str, hash) { | |
| if (hash.recoverable) { | |
| this.trace(str); | |
| } else { | |
| var error = new Error(str); | |
| error.hash = hash; | |
| throw error; | |
| } | |
| }, | |
| parse: function parse(input) { | |
| var self = this, stack = [0], tstack = [], vstack = [null], lstack = [], table = this.table, yytext = '', yylineno = 0, yyleng = 0, recovering = 0, TERROR = 2, EOF = 1; | |
| var args = lstack.slice.call(arguments, 1); | |
| var lexer = Object.create(this.lexer); | |
| var sharedState = { yy: {} }; | |
| for (var k in this.yy) { | |
| if (Object.prototype.hasOwnProperty.call(this.yy, k)) { | |
| sharedState.yy[k] = this.yy[k]; | |
| } | |
| } | |
| lexer.setInput(input, sharedState.yy); | |
| sharedState.yy.lexer = lexer; | |
| sharedState.yy.parser = this; | |
| if (typeof lexer.yylloc == 'undefined') { | |
| lexer.yylloc = {}; | |
| } | |
| var yyloc = lexer.yylloc; | |
| lstack.push(yyloc); | |
| var ranges = lexer.options && lexer.options.ranges; | |
| if (typeof sharedState.yy.parseError === 'function') { | |
| this.parseError = sharedState.yy.parseError; | |
| } else { | |
| this.parseError = Object.getPrototypeOf(this).parseError; | |
| } | |
| function popStack(n) { | |
| stack.length = stack.length - 2 * n; | |
| vstack.length = vstack.length - n; | |
| lstack.length = lstack.length - n; | |
| } | |
| _token_stack: | |
| var lex = function () { | |
| var token; | |
| token = lexer.lex() || EOF; | |
| if (typeof token !== 'number') { | |
| token = self.symbols_[token] || token; | |
| } | |
| return token; | |
| }; | |
| var symbol, preErrorSymbol, state, action, a, r, yyval = {}, p, len, newState, expected; | |
| while (true) { | |
| state = stack[stack.length - 1]; | |
| if (this.defaultActions[state]) { | |
| action = this.defaultActions[state]; | |
| } else { | |
| if (symbol === null || typeof symbol == 'undefined') { | |
| symbol = lex(); | |
| } | |
| action = table[state] && table[state][symbol]; | |
| } | |
| if (typeof action === 'undefined' || !action.length || !action[0]) { | |
| var errStr = ''; | |
| expected = []; | |
| for (p in table[state]) { | |
| if (this.terminals_[p] && p > TERROR) { | |
| expected.push('\'' + this.terminals_[p] + '\''); | |
| } | |
| } | |
| if (lexer.showPosition) { | |
| errStr = 'Parse error on line ' + (yylineno + 1) + ':\n' + lexer.showPosition() + '\nExpecting ' + expected.join(', ') + ', got \'' + (this.terminals_[symbol] || symbol) + '\''; | |
| } else { | |
| errStr = 'Parse error on line ' + (yylineno + 1) + ': Unexpected ' + (symbol == EOF ? 'end of input' : '\'' + (this.terminals_[symbol] || symbol) + '\''); | |
| } | |
| this.parseError(errStr, { | |
| text: lexer.match, | |
| token: this.terminals_[symbol] || symbol, | |
| line: lexer.yylineno, | |
| loc: yyloc, | |
| expected: expected | |
| }); | |
| } | |
| if (action[0] instanceof Array && action.length > 1) { | |
| throw new Error('Parse Error: multiple actions possible at state: ' + state + ', token: ' + symbol); | |
| } | |
| switch (action[0]) { | |
| case 1: | |
| stack.push(symbol); | |
| vstack.push(lexer.yytext); | |
| lstack.push(lexer.yylloc); | |
| stack.push(action[1]); | |
| symbol = null; | |
| if (!preErrorSymbol) { | |
| yyleng = lexer.yyleng; | |
| yytext = lexer.yytext; | |
| yylineno = lexer.yylineno; | |
| yyloc = lexer.yylloc; | |
| if (recovering > 0) { | |
| recovering--; | |
| } | |
| } else { | |
| symbol = preErrorSymbol; | |
| preErrorSymbol = null; | |
| } | |
| break; | |
| case 2: | |
| len = this.productions_[action[1]][1]; | |
| yyval.$ = vstack[vstack.length - len]; | |
| yyval._$ = { | |
| first_line: lstack[lstack.length - (len || 1)].first_line, | |
| last_line: lstack[lstack.length - 1].last_line, | |
| first_column: lstack[lstack.length - (len || 1)].first_column, | |
| last_column: lstack[lstack.length - 1].last_column | |
| }; | |
| if (ranges) { | |
| yyval._$.range = [ | |
| lstack[lstack.length - (len || 1)].range[0], | |
| lstack[lstack.length - 1].range[1] | |
| ]; | |
| } | |
| r = this.performAction.apply(yyval, [ | |
| yytext, | |
| yyleng, | |
| yylineno, | |
| sharedState.yy, | |
| action[1], | |
| vstack, | |
| lstack | |
| ].concat(args)); | |
| if (typeof r !== 'undefined') { | |
| return r; | |
| } | |
| if (len) { | |
| stack = stack.slice(0, -1 * len * 2); | |
| vstack = vstack.slice(0, -1 * len); | |
| lstack = lstack.slice(0, -1 * len); | |
| } | |
| stack.push(this.productions_[action[1]][0]); | |
| vstack.push(yyval.$); | |
| lstack.push(yyval._$); | |
| newState = table[stack[stack.length - 2]][stack[stack.length - 1]]; | |
| stack.push(newState); | |
| break; | |
| case 3: | |
| return true; | |
| } | |
| } | |
| return true; | |
| }}; | |
| const root = (type, data) => ({__prototype: "MesaureLayout", type, data}); | |
| const singleLayout = n => ({__prototype: "SingleMLayout", measure: Number(n)}); | |
| const blockLayout = seq => ({__prototype: "BlockMLayout", seq}); | |
| const voltaBlock = (times, body, alternates) => ({__prototype: "VoltaMLayout", times: Number(times), body, alternates}); | |
| const abaBlock = (main, rest) => ({__prototype: "ABAMLayout", main, rest}); | |
| const segment = n => ({segment: true, length: Number(n)}); | |
| const alternates = items => items.map(item => { | |
| if (item.__prototype === "BlockMLayout") | |
| return item.seq; | |
| return [item]; | |
| }); | |
| const range = (start, end) => { | |
| start = Number(start); | |
| end = Number(end); | |
| if (!(end >= start)) | |
| throw new Error(`invalid measure range: ${start}..${end}`); | |
| return Array(end + 1 - start).fill(0).map((_, i) => singleLayout(start + i)); | |
| }; | |
| const serializeSeq = (item, options) => { | |
| if (item.segment) { | |
| const index = options.index; | |
| options.index += item.length; | |
| return Array(item.length).fill(0).map((_, i) => singleLayout(index + i)); | |
| } | |
| return [serialize(item, options)]; | |
| }; | |
| const serialize = (item, options = {index: 1}) => { | |
| const speard = seq => [].concat(...seq.map(it => serializeSeq(it, options))); | |
| switch (item.__prototype) { | |
| case "BlockMLayout": | |
| item.seq = speard(item.seq); | |
| break; | |
| case "VoltaMLayout": | |
| item.body = speard(item.body); | |
| item.alternates = item.alternates && item.alternates.map(speard); | |
| break; | |
| case "ABAMLayout": | |
| item.main = serialize(item.main, options); | |
| item.rest = speard(item.rest); | |
| break; | |
| } | |
| return item; | |
| }; | |
| /* generated by jison-lex 0.3.4 */ | |
| var lexer = (function(){ | |
| var lexer = ({ | |
| EOF:1, | |
| parseError:function parseError(str, hash) { | |
| if (this.yy.parser) { | |
| this.yy.parser.parseError(str, hash); | |
| } else { | |
| throw new Error(str); | |
| } | |
| }, | |
| // resets the lexer, sets new input | |
| setInput:function (input, yy) { | |
| this.yy = yy || this.yy || {}; | |
| this._input = input; | |
| this._more = this._backtrack = this.done = false; | |
| this.yylineno = this.yyleng = 0; | |
| this.yytext = this.matched = this.match = ''; | |
| this.conditionStack = ['INITIAL']; | |
| this.yylloc = { | |
| first_line: 1, | |
| first_column: 0, | |
| last_line: 1, | |
| last_column: 0 | |
| }; | |
| if (this.options.ranges) { | |
| this.yylloc.range = [0,0]; | |
| } | |
| this.offset = 0; | |
| return this; | |
| }, | |
| // consumes and returns one char from the input | |
| input:function () { | |
| var ch = this._input[0]; | |
| this.yytext += ch; | |
| this.yyleng++; | |
| this.offset++; | |
| this.match += ch; | |
| this.matched += ch; | |
| var lines = ch.match(/(?:\r\n?|\n).*/g); | |
| if (lines) { | |
| this.yylineno++; | |
| this.yylloc.last_line++; | |
| } else { | |
| this.yylloc.last_column++; | |
| } | |
| if (this.options.ranges) { | |
| this.yylloc.range[1]++; | |
| } | |
| this._input = this._input.slice(1); | |
| return ch; | |
| }, | |
| // unshifts one char (or a string) into the input | |
| unput:function (ch) { | |
| var len = ch.length; | |
| var lines = ch.split(/(?:\r\n?|\n)/g); | |
| this._input = ch + this._input; | |
| this.yytext = this.yytext.substr(0, this.yytext.length - len); | |
| //this.yyleng -= len; | |
| this.offset -= len; | |
| var oldLines = this.match.split(/(?:\r\n?|\n)/g); | |
| this.match = this.match.substr(0, this.match.length - 1); | |
| this.matched = this.matched.substr(0, this.matched.length - 1); | |
| if (lines.length - 1) { | |
| this.yylineno -= lines.length - 1; | |
| } | |
| var r = this.yylloc.range; | |
| this.yylloc = { | |
| first_line: this.yylloc.first_line, | |
| last_line: this.yylineno + 1, | |
| first_column: this.yylloc.first_column, | |
| last_column: lines ? | |
| (lines.length === oldLines.length ? this.yylloc.first_column : 0) | |
| + oldLines[oldLines.length - lines.length].length - lines[0].length : | |
| this.yylloc.first_column - len | |
| }; | |
| if (this.options.ranges) { | |
| this.yylloc.range = [r[0], r[0] + this.yyleng - len]; | |
| } | |
| this.yyleng = this.yytext.length; | |
| return this; | |
| }, | |
| // When called from action, caches matched text and appends it on next action | |
| more:function () { | |
| this._more = true; | |
| return this; | |
| }, | |
| // When called from action, signals the lexer that this rule fails to match the input, so the next matching rule (regex) should be tested instead. | |
| reject:function () { | |
| if (this.options.backtrack_lexer) { | |
| this._backtrack = true; | |
| } else { | |
| return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. You can only invoke reject() in the lexer when the lexer is of the backtracking persuasion (options.backtrack_lexer = true).\n' + this.showPosition(), { | |
| text: "", | |
| token: null, | |
| line: this.yylineno | |
| }); | |
| } | |
| return this; | |
| }, | |
| // retain first n characters of the match | |
| less:function (n) { | |
| this.unput(this.match.slice(n)); | |
| }, | |
| // displays already matched input, i.e. for error messages | |
| pastInput:function () { | |
| var past = this.matched.substr(0, this.matched.length - this.match.length); | |
| return (past.length > 20 ? '...':'') + past.substr(-20).replace(/\n/g, ""); | |
| }, | |
| // displays upcoming input, i.e. for error messages | |
| upcomingInput:function () { | |
| var next = this.match; | |
| if (next.length < 20) { | |
| next += this._input.substr(0, 20-next.length); | |
| } | |
| return (next.substr(0,20) + (next.length > 20 ? '...' : '')).replace(/\n/g, ""); | |
| }, | |
| // displays the character position where the lexing error occurred, i.e. for error messages | |
| showPosition:function () { | |
| var pre = this.pastInput(); | |
| var c = new Array(pre.length + 1).join("-"); | |
| return pre + this.upcomingInput() + "\n" + c + "^"; | |
| }, | |
| // test the lexed token: return FALSE when not a match, otherwise return token | |
| test_match:function(match, indexed_rule) { | |
| var token, | |
| lines, | |
| backup; | |
| if (this.options.backtrack_lexer) { | |
| // save context | |
| backup = { | |
| yylineno: this.yylineno, | |
| yylloc: { | |
| first_line: this.yylloc.first_line, | |
| last_line: this.last_line, | |
| first_column: this.yylloc.first_column, | |
| last_column: this.yylloc.last_column | |
| }, | |
| yytext: this.yytext, | |
| match: this.match, | |
| matches: this.matches, | |
| matched: this.matched, | |
| yyleng: this.yyleng, | |
| offset: this.offset, | |
| _more: this._more, | |
| _input: this._input, | |
| yy: this.yy, | |
| conditionStack: this.conditionStack.slice(0), | |
| done: this.done | |
| }; | |
| if (this.options.ranges) { | |
| backup.yylloc.range = this.yylloc.range.slice(0); | |
| } | |
| } | |
| lines = match[0].match(/(?:\r\n?|\n).*/g); | |
| if (lines) { | |
| this.yylineno += lines.length; | |
| } | |
| this.yylloc = { | |
| first_line: this.yylloc.last_line, | |
| last_line: this.yylineno + 1, | |
| first_column: this.yylloc.last_column, | |
| last_column: lines ? | |
| lines[lines.length - 1].length - lines[lines.length - 1].match(/\r?\n?/)[0].length : | |
| this.yylloc.last_column + match[0].length | |
| }; | |
| this.yytext += match[0]; | |
| this.match += match[0]; | |
| this.matches = match; | |
| this.yyleng = this.yytext.length; | |
| if (this.options.ranges) { | |
| this.yylloc.range = [this.offset, this.offset += this.yyleng]; | |
| } | |
| this._more = false; | |
| this._backtrack = false; | |
| this._input = this._input.slice(match[0].length); | |
| this.matched += match[0]; | |
| token = this.performAction.call(this, this.yy, this, indexed_rule, this.conditionStack[this.conditionStack.length - 1]); | |
| if (this.done && this._input) { | |
| this.done = false; | |
| } | |
| if (token) { | |
| return token; | |
| } else if (this._backtrack) { | |
| // recover context | |
| for (var k in backup) { | |
| this[k] = backup[k]; | |
| } | |
| return false; // rule action called reject() implying the next rule should be tested instead. | |
| } | |
| return false; | |
| }, | |
| // return next match in input | |
| next:function () { | |
| if (this.done) { | |
| return this.EOF; | |
| } | |
| if (!this._input) { | |
| this.done = true; | |
| } | |
| var token, | |
| match, | |
| tempMatch, | |
| index; | |
| if (!this._more) { | |
| this.yytext = ''; | |
| this.match = ''; | |
| } | |
| var rules = this._currentRules(); | |
| for (var i = 0; i < rules.length; i++) { | |
| tempMatch = this._input.match(this.rules[rules[i]]); | |
| if (tempMatch && (!match || tempMatch[0].length > match[0].length)) { | |
| match = tempMatch; | |
| index = i; | |
| if (this.options.backtrack_lexer) { | |
| token = this.test_match(tempMatch, rules[i]); | |
| if (token !== false) { | |
| return token; | |
| } else if (this._backtrack) { | |
| match = false; | |
| continue; // rule action called reject() implying a rule MISmatch. | |
| } else { | |
| // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) | |
| return false; | |
| } | |
| } else if (!this.options.flex) { | |
| break; | |
| } | |
| } | |
| } | |
| if (match) { | |
| token = this.test_match(match, rules[index]); | |
| if (token !== false) { | |
| return token; | |
| } | |
| // else: this is a lexer rule which consumes input without producing a token (e.g. whitespace) | |
| return false; | |
| } | |
| if (this._input === "") { | |
| return this.EOF; | |
| } else { | |
| return this.parseError('Lexical error on line ' + (this.yylineno + 1) + '. Unrecognized text.\n' + this.showPosition(), { | |
| text: "", | |
| token: null, | |
| line: this.yylineno | |
| }); | |
| } | |
| }, | |
| // return next match that has a token | |
| lex:function lex () { | |
| var r = this.next(); | |
| if (r) { | |
| return r; | |
| } else { | |
| return this.lex(); | |
| } | |
| }, | |
| // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack) | |
| begin:function begin (condition) { | |
| this.conditionStack.push(condition); | |
| }, | |
| // pop the previously active lexer condition state off the condition stack | |
| popState:function popState () { | |
| var n = this.conditionStack.length - 1; | |
| if (n > 0) { | |
| return this.conditionStack.pop(); | |
| } else { | |
| return this.conditionStack[0]; | |
| } | |
| }, | |
| // produce the lexer rule set which is active for the currently active lexer condition state | |
| _currentRules:function _currentRules () { | |
| if (this.conditionStack.length && this.conditionStack[this.conditionStack.length - 1]) { | |
| return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules; | |
| } else { | |
| return this.conditions["INITIAL"].rules; | |
| } | |
| }, | |
| // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available | |
| topState:function topState (n) { | |
| n = this.conditionStack.length - 1 - Math.abs(n || 0); | |
| if (n >= 0) { | |
| return this.conditionStack[n]; | |
| } else { | |
| return "INITIAL"; | |
| } | |
| }, | |
| // alias for begin(condition) | |
| pushState:function pushState (condition) { | |
| this.begin(condition); | |
| }, | |
| // return the number of states currently on the stack | |
| stateStackSize:function stateStackSize() { | |
| return this.conditionStack.length; | |
| }, | |
| options: {}, | |
| performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { | |
| var YYSTATE=YY_START; | |
| switch($avoiding_name_collisions) { | |
| case 0: | |
| break; | |
| case 1:return yy_.yytext; | |
| break; | |
| case 2:return 14 | |
| break; | |
| case 3:return yy_.yytext | |
| break; | |
| case 4:return yy_.yytext | |
| break; | |
| case 5:return 5; | |
| break; | |
| } | |
| }, | |
| rules: [/^(?:\s+)/,/^(?:([*,\[\]<>{}]))/,/^(?:(([1-9])([0-9])*))/,/^(?:(([a-z])+):)/,/^(?:\.\.)/,/^(?:$)/], | |
| conditions: {"INITIAL":{"rules":[0,1,2,3,4,5],"inclusive":true}} | |
| }); | |
| return lexer; | |
| })(); | |
| parser.lexer = lexer; | |
| function Parser () { | |
| this.yy = {}; | |
| } | |
| Parser.prototype = parser;parser.Parser = Parser; | |
| return new Parser; | |
| })(); | |
| if (typeof require !== 'undefined' && typeof exports !== 'undefined') { | |
| exports.parser = parser; | |
| exports.Parser = parser.Parser; | |
| exports.parse = function () { return parser.parse.apply(parser, arguments); }; | |
| exports.main = function commonjsMain (args) { | |
| if (!args[1]) { | |
| console.log('Usage: '+args[0]+' FILE'); | |
| process.exit(1); | |
| } | |
| var source = require('fs').readFileSync(require('path').normalize(args[1]), "utf8"); | |
| return exports.parser.parse(source); | |
| }; | |
| if (typeof module !== 'undefined' && require.main === module) { | |
| exports.main(process.argv.slice(1)); | |
| } | |
| } |