Spaces:
Running
Running
| /* 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 tgnParser = (function(){ | |
| var o=function(k,v,o,l){for(o=o||{},l=k.length;l--;o[k[l]]=v);return o},$V0=[1,7],$V1=[2,25],$V2=[6,8,49],$V3=[1,32],$V4=[6,49],$V5=[11,49],$V6=[11,48],$V7=[1,51],$V8=[1,52],$V9=[1,53],$Va=[6,36,37,38,49]; | |
| var parser = {trace: function trace () { }, | |
| yy: {}, | |
| symbols_: {"error":2,"game":3,"tag_section":4,"move_section":5,"EOF":6,"tag_pair":7,"[":8,"tag_name":9,"STRING":10,"]":11,"TAG_RESULT":12,"game_result":13,"TAG_BOARD":14,"board_shape":15,"TAG_EVENT":16,"TAG_SITE":17,"TAG_DATE":18,"TAG_ROUND":19,"TAG_BLACK":20,"TAG_WHITE":21,"TAG_HANDICAP":22,"TAG_RULES":23,"TAG_TIMECONTROL":24,"TAG_ANNOTATOR":25,"TAG_APPLICATION":26,"TAG_NAME":27,"move_sequence":28,"move_sequence_intact":29,"move_sequence_truncated":30,"move_round":31,"move_round_half":32,"number":33,"DOT":34,"move_action":35,"PASS":36,"RESIGN":37,"COORDINATE":38,"win":39,"conquer":40,"=":41,"*":42,"RESULT_BLACK":43,"RESULT_WHITE":44,"conquer_unit":45,"POINTS":46,"STONES":47,"TIMES":48,"NUMBER":49,"$accept":0,"$end":1}, | |
| terminals_: {2:"error",6:"EOF",8:"[",10:"STRING",11:"]",12:"TAG_RESULT",14:"TAG_BOARD",16:"TAG_EVENT",17:"TAG_SITE",18:"TAG_DATE",19:"TAG_ROUND",20:"TAG_BLACK",21:"TAG_WHITE",22:"TAG_HANDICAP",23:"TAG_RULES",24:"TAG_TIMECONTROL",25:"TAG_ANNOTATOR",26:"TAG_APPLICATION",27:"TAG_NAME",34:"DOT",36:"PASS",37:"RESIGN",38:"COORDINATE",41:"=",42:"*",43:"RESULT_BLACK",44:"RESULT_WHITE",46:"POINTS",47:"STONES",48:"TIMES",49:"NUMBER"}, | |
| productions_: [0,[3,3],[3,2],[3,2],[3,1],[4,1],[4,2],[7,4],[7,4],[7,4],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[5,1],[28,1],[28,1],[29,0],[29,2],[30,2],[31,4],[32,3],[35,1],[35,1],[35,1],[13,1],[13,2],[13,1],[13,1],[39,1],[39,1],[40,2],[45,1],[45,1],[15,1],[15,3],[33,1]], | |
| performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { | |
| /* this == yyval */ | |
| var $0 = $$.length - 1; | |
| switch (yystate) { | |
| case 1: | |
| return { | |
| tags: $$[$0-2], | |
| moves: $$[$0-1], | |
| success: true | |
| }; | |
| break; | |
| case 2: | |
| return { | |
| tags: $$[$0-1], | |
| moves: null, | |
| success: true | |
| }; | |
| break; | |
| case 3: | |
| return { | |
| tags: {}, | |
| moves: $$[$0-1], | |
| success: true | |
| }; | |
| break; | |
| case 4: | |
| return { | |
| tags: {}, | |
| moves: null, | |
| success: true | |
| }; | |
| break; | |
| case 5: case 23: case 24: | |
| this.$ = $$[$0]; | |
| break; | |
| case 6: | |
| this.$ = Object.assign({}, $$[$0-1], $$[$0]); | |
| break; | |
| case 7: | |
| const tagName = $$[$0-2]; | |
| const tagValue = $$[$0-1].slice(1, -1); // Remove quotes | |
| this.$ = { [tagName]: tagValue }; | |
| break; | |
| case 8: | |
| this.$ = $$[$0-1]; | |
| break; | |
| case 9: | |
| this.$ = ({[$$[$0-2]]: $$[$0-1]}); | |
| break; | |
| case 21: | |
| this.$ = yytext; | |
| break; | |
| case 25: | |
| this.$ = []; | |
| break; | |
| case 26: case 27: | |
| this.$ = $$[$0-1].concat([$$[$0]]); | |
| break; | |
| case 28: | |
| this.$ = ({ round: $$[$0-3], action_black: $$[$0-1], action_white: $$[$0] }); | |
| break; | |
| case 29: | |
| this.$ = ({ round: $$[$0-2], action_black: $$[$0] }); | |
| break; | |
| case 30: | |
| this.$ = ({ type: 'pass' }); | |
| break; | |
| case 31: | |
| this.$ = ({ type: 'resign' }); | |
| break; | |
| case 32: | |
| // Placeholder: Parse coordinate notation | |
| this.$ = { | |
| type: 'move', | |
| position: yytext | |
| }; | |
| break; | |
| case 33: | |
| this.$ = ({Result: $$[$0]}); | |
| break; | |
| case 34: | |
| this.$ = ({Result: $$[$0-1], Conquer: $$[$0]}); | |
| break; | |
| case 35: | |
| this.$ = ({Result: "draw"}); | |
| break; | |
| case 36: | |
| this.$ = ({Result: "unknown"}); | |
| break; | |
| case 37: | |
| this.$ = "black win"; | |
| break; | |
| case 38: | |
| this.$ = "white win"; | |
| break; | |
| case 39: | |
| this.$ = ({n: $$[$0-1], unit: $$[$0]}); | |
| break; | |
| case 42: | |
| this.$ = [$$[$0]]; | |
| break; | |
| case 43: | |
| this.$ = $$[$0-2].concat($$[$0]); | |
| break; | |
| case 44: | |
| this.$ = parseInt($$[$0]); | |
| break; | |
| } | |
| }, | |
| table: [{3:1,4:2,5:3,6:[1,4],7:5,8:$V0,28:6,29:8,30:9,49:$V1},{1:[3]},{5:10,6:[1,11],7:12,8:$V0,28:6,29:8,30:9,49:$V1},{6:[1,13]},{1:[2,4]},o($V2,[2,5]),{6:[2,22]},{9:14,12:[1,15],14:[1,16],16:[1,17],17:[1,18],18:[1,19],19:[1,20],20:[1,21],21:[1,22],22:[1,23],23:[1,24],24:[1,25],25:[1,26],26:[1,27],27:[1,28]},{6:[2,23],31:29,32:30,33:31,49:$V3},{6:[2,24]},{6:[1,33]},{1:[2,2]},o($V2,[2,6]),{1:[2,3]},{10:[1,34]},{13:35,39:36,41:[1,37],42:[1,38],43:[1,39],44:[1,40]},{15:41,33:42,49:$V3},{10:[2,10]},{10:[2,11]},{10:[2,12]},{10:[2,13]},{10:[2,14]},{10:[2,15]},{10:[2,16]},{10:[2,17]},{10:[2,18]},{10:[2,19]},{10:[2,20]},{10:[2,21]},o($V4,[2,26]),{6:[2,27]},{34:[1,43]},o([11,34,46,47,48],[2,44]),{1:[2,1]},{11:[1,44]},{11:[1,45]},{11:[2,33],33:47,40:46,49:$V3},{11:[2,35]},{11:[2,36]},o($V5,[2,37]),o($V5,[2,38]),{11:[1,48],48:[1,49]},o($V6,[2,42]),{35:50,36:$V7,37:$V8,38:$V9},o($V2,[2,7]),o($V2,[2,8]),{11:[2,34]},{45:54,46:[1,55],47:[1,56]},o($V2,[2,9]),{33:57,49:$V3},{6:[2,29],35:58,36:$V7,37:$V8,38:$V9},o($Va,[2,30]),o($Va,[2,31]),o($Va,[2,32]),{11:[2,39]},{11:[2,40]},{11:[2,41]},o($V6,[2,43]),o($V4,[2,28])], | |
| defaultActions: {4:[2,4],6:[2,22],9:[2,24],11:[2,2],13:[2,3],17:[2,10],18:[2,11],19:[2,12],20:[2,13],21:[2,14],22:[2,15],23:[2,16],24:[2,17],25:[2,18],26:[2,19],27:[2,20],28:[2,21],30:[2,27],33:[2,1],37:[2,35],38:[2,36],46:[2,34],54:[2,39],55:[2,40],56:[2,41]}, | |
| 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; | |
| }}; | |
| /* ========== Additional JavaScript Code ========== */ | |
| // Parser configuration | |
| parser.yy = { | |
| // Helper functions can be added here | |
| parseError: function(str, hash) { | |
| throw new Error('Parse error: ' + str); | |
| } | |
| }; | |
| /* 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:/* skip whitespace */ | |
| break; | |
| case 1:/* skip newlines */ | |
| break; | |
| case 2:/* skip line comments */ | |
| break; | |
| case 3:/* skip block comments */ | |
| break; | |
| case 4:return 8 | |
| break; | |
| case 5:return 11 | |
| break; | |
| case 6:return 10 | |
| break; | |
| case 7:return 16 | |
| break; | |
| case 8:return 17 | |
| break; | |
| case 9:return 18 | |
| break; | |
| case 10:return 19 | |
| break; | |
| case 11:return 20 | |
| break; | |
| case 12:return 21 | |
| break; | |
| case 13:return 12 | |
| break; | |
| case 14:return 14 | |
| break; | |
| case 15:return 22 | |
| break; | |
| case 16:return 23 | |
| break; | |
| case 17:return 24 | |
| break; | |
| case 18:return 25 | |
| break; | |
| case 19:return 26 | |
| break; | |
| case 20:return 43 | |
| break; | |
| case 21:return 44 | |
| break; | |
| case 22:return 41 /* draw */ | |
| break; | |
| case 23:return 42 /* unknown */ | |
| break; | |
| case 24:return 49 | |
| break; | |
| case 25:return 34 | |
| break; | |
| case 26:return 36 | |
| break; | |
| case 27:return 37 | |
| break; | |
| case 28:return 46 | |
| break; | |
| case 29:return 47 | |
| break; | |
| case 30:return 48 | |
| break; | |
| case 31:return 38 | |
| break; | |
| case 32:return 27 | |
| break; | |
| case 33:return 6 | |
| break; | |
| case 34:return 'INVALID' | |
| break; | |
| } | |
| }, | |
| rules: [/^(?:\s+)/,/^(?:\n)/,/^(?:;[^\n]*)/,/^(?:\{[^}]*\})/,/^(?:\[)/,/^(?:\])/,/^(?:"([^\\\"]|\\.)*")/,/^(?:Event\b)/,/^(?:Site\b)/,/^(?:Date\b)/,/^(?:Round\b)/,/^(?:Black\b)/,/^(?:White\b)/,/^(?:Result\b)/,/^(?:Board\b)/,/^(?:Handicap\b)/,/^(?:Rules\b)/,/^(?:TimeControl\b)/,/^(?:Annotator\b)/,/^(?:Application\b)/,/^(?:B\+)/,/^(?:W\+)/,/^(?:=)/,/^(?:\*)/,/^(?:[1-9][0-9]*)/,/^(?:\.)/,/^(?:Pass\b)/,/^(?:Resign\b)/,/^(?:points\b)/,/^(?:stones\b)/,/^(?:[x](?=[1-9]))/,/^(?:[a-z0]+)/,/^(?:[A-Z][A-Za-z0-9_]*)/,/^(?:$)/,/^(?:.)/], | |
| conditions: {"INITIAL":{"rules":[0,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],"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 = tgnParser; | |
| exports.Parser = tgnParser.Parser; | |
| exports.parse = function () { return tgnParser.parse.apply(tgnParser, 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)); | |
| } | |
| } |