Skip to main content
Glama
stateDiagram.js•37.5 kB
// Generated from state/stateDiagram.jison // Do not edit manually module.exports = /* 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,2],$V1=[1,3],$V2=[1,4],$V3=[2,4],$V4=[1,9],$V5=[1,11],$V6=[1,16],$V7=[1,17],$V8=[1,18],$V9=[1,19],$Va=[1,33],$Vb=[1,20],$Vc=[1,21],$Vd=[1,22],$Ve=[1,23],$Vf=[1,24],$Vg=[1,26],$Vh=[1,27],$Vi=[1,28],$Vj=[1,29],$Vk=[1,30],$Vl=[1,31],$Vm=[1,32],$Vn=[1,35],$Vo=[1,36],$Vp=[1,37],$Vq=[1,38],$Vr=[1,34],$Vs=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],$Vt=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,39,40,41,45,48,51,52,53,54,57],$Vu=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57]; var parser = {trace: function trace () { }, yy: {}, symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"SD":6,"document":7,"line":8,"statement":9,"classDefStatement":10,"styleStatement":11,"cssClassStatement":12,"idStatement":13,"DESCR":14,"-->":15,"HIDE_EMPTY":16,"scale":17,"WIDTH":18,"COMPOSIT_STATE":19,"STRUCT_START":20,"STRUCT_STOP":21,"STATE_DESCR":22,"AS":23,"ID":24,"FORK":25,"JOIN":26,"CHOICE":27,"CONCURRENT":28,"note":29,"notePosition":30,"NOTE_TEXT":31,"direction":32,"acc_title":33,"acc_title_value":34,"acc_descr":35,"acc_descr_value":36,"acc_descr_multiline_value":37,"CLICK":38,"STRING":39,"HREF":40,"classDef":41,"CLASSDEF_ID":42,"CLASSDEF_STYLEOPTS":43,"DEFAULT":44,"style":45,"STYLE_IDS":46,"STYLEDEF_STYLEOPTS":47,"class":48,"CLASSENTITY_IDS":49,"STYLECLASS":50,"direction_tb":51,"direction_bt":52,"direction_rl":53,"direction_lr":54,"eol":55,";":56,"EDGE_STATE":57,"STYLE_SEPARATOR":58,"left_of":59,"right_of":60,"$accept":0,"$end":1}, terminals_: {2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"-->",16:"HIDE_EMPTY",17:"scale",18:"WIDTH",19:"COMPOSIT_STATE",20:"STRUCT_START",21:"STRUCT_STOP",22:"STATE_DESCR",23:"AS",24:"ID",25:"FORK",26:"JOIN",27:"CHOICE",28:"CONCURRENT",29:"note",31:"NOTE_TEXT",33:"acc_title",34:"acc_title_value",35:"acc_descr",36:"acc_descr_value",37:"acc_descr_multiline_value",38:"CLICK",39:"STRING",40:"HREF",41:"classDef",42:"CLASSDEF_ID",43:"CLASSDEF_STYLEOPTS",44:"DEFAULT",45:"style",46:"STYLE_IDS",47:"STYLEDEF_STYLEOPTS",48:"class",49:"CLASSENTITY_IDS",50:"STYLECLASS",51:"direction_tb",52:"direction_bt",53:"direction_rl",54:"direction_lr",56:";",57:"EDGE_STATE",58:"STYLE_SEPARATOR",59:"left_of",60:"right_of"}, productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,1],[9,1],[9,1],[9,1],[9,2],[9,3],[9,4],[9,1],[9,2],[9,1],[9,4],[9,3],[9,6],[9,1],[9,1],[9,1],[9,1],[9,4],[9,4],[9,1],[9,2],[9,2],[9,1],[9,5],[9,5],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[55,1],[55,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]], performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) { /* this == yyval */ var $0 = $$.length - 1; switch (yystate) { case 3: /* console.log('--> Root document', $$[$0]); */ yy.setRootDoc($$[$0]); return $$[$0]; break; case 4: /*console.log('empty document'); */ this.$ = [] break; case 5: if($$[$0] !='nl'){ /* console.log(' document: 1: ', $$[$0-1], ' pushing 2: ', $$[$0]); */ $$[$0-1].push($$[$0]); this.$ = $$[$0-1] } /* console.log('Got document',$$[$0-1], $$[$0]); */ break; case 6: case 7: this.$ = $$[$0] break; case 8: this.$='nl'; break; case 12: /* console.log('got id', $$[$0]); */ this.$=$$[$0]; break; case 13: const stateStmt = $$[$0-1]; stateStmt.description = yy.trimColon($$[$0]); this.$ = stateStmt; break; case 14: /* console.info('got ids: 1: ', $$[$0-2], ' 2:', $$[$0-1],' 3: ', $$[$0]); */ // console.log(' idStatement --> idStatement : state1 =', $$[$0-2], ' state2 =', $$[$0]); this.$={ stmt: 'relation', state1: $$[$0-2], state2: $$[$0]}; break; case 15: const relDescription = yy.trimColon($$[$0]); /* console.log(' idStatement --> idStatement DESCR : state1 =', $$[$0-3], ' state2stmt =', $$[$0-1], ' description: ', relDescription); */ this.$={ stmt: 'relation', state1: $$[$0-3], state2: $$[$0-1], description: relDescription}; break; case 19: // console.log('Adding document for state without id ', $$[$0-3]); this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: '', doc: $$[$0-1] } break; case 20: var id=$$[$0]; var description = $$[$0-2].trim(); if($$[$0].match(':')){ var parts = $$[$0].split(':'); id=parts[0]; description = [description, parts[1]]; } this.$={stmt: 'state', id: id, type: 'default', description: description}; break; case 21: // console.log('state with id ', $$[$0-3],' document = ', $$[$0-1], ); this.$={ stmt: 'state', id: $$[$0-3], type: 'default', description: $$[$0-5], doc: $$[$0-1] } break; case 22: this.$={ stmt: 'state', id: $$[$0], type: 'fork' } break; case 23: this.$={ stmt: 'state', id: $$[$0], type: 'join' } break; case 24: this.$={ stmt: 'state', id: $$[$0], type: 'choice' } break; case 25: this.$={ stmt: 'state', id: yy.getDividerId(), type: 'divider' } break; case 26: /* console.warn('got NOTE, position: ', $$[$0-2].trim(), 'id = ', $$[$0-1].trim(), 'note: ', $$[$0]);*/ this.$={ stmt: 'state', id: $$[$0-1].trim(), note:{position: $$[$0-2].trim(), text: $$[$0].trim()}}; break; case 29: this.$=$$[$0].trim();yy.setAccTitle(this.$); break; case 30: case 31: this.$=$$[$0].trim();yy.setAccDescription(this.$); break; case 32: this.$ = { stmt: "click", id: $$[$0-3], url: $$[$0-2], tooltip: $$[$0-1] }; break; case 33: this.$ = { stmt: "click", id: $$[$0-3], url: $$[$0-1], tooltip: "" }; break; case 34: case 35: this.$ = { stmt: 'classDef', id: $$[$0-1].trim(), classes: $$[$0].trim() }; break; case 36: this.$ = { stmt: 'style', id: $$[$0-1].trim(), styleClass: $$[$0].trim() }; break; case 37: //console.log('apply class: id(s): ',$$[$0-1], ' style class: ', $$[$0]); this.$={ stmt: 'applyClass', id: $$[$0-1].trim(), styleClass: $$[$0].trim() }; break; case 38: yy.setDirection('TB');this.$={stmt:'dir', value:'TB'}; break; case 39: yy.setDirection('BT');this.$={stmt:'dir', value:'BT'}; break; case 40: yy.setDirection('RL'); this.$={stmt:'dir', value:'RL'}; break; case 41: yy.setDirection('LR');this.$={stmt:'dir', value:'LR'}; break; case 44: case 45: /* console.log('idStatement id: ', $$[$0]); */ this.$={ stmt: 'state', id: $$[$0].trim(), type: 'default', description: '' }; break; case 46: /*console.log('idStatement ID STYLE_SEPARATOR ID'); */ this.$={ stmt: 'state', id: $$[$0-2].trim(), classes: [$$[$0].trim()], type: 'default', description: '' }; break; case 47: /*console.log('idStatement EDGE_STATE STYLE_SEPARATOR ID'); */ this.$={ stmt: 'state', id: $$[$0-2].trim(), classes: [$$[$0].trim()], type: 'default', description: '' }; break; } }, table: [{3:1,4:$V0,5:$V1,6:$V2},{1:[3]},{3:5,4:$V0,5:$V1,6:$V2},{3:6,4:$V0,5:$V1,6:$V2},o([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,41,45,48,51,52,53,54,57],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,5]),{9:39,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,7]),o($Vs,[2,8]),o($Vs,[2,9]),o($Vs,[2,10]),o($Vs,[2,11]),o($Vs,[2,12],{14:[1,40],15:[1,41]}),o($Vs,[2,16]),{18:[1,42]},o($Vs,[2,18],{20:[1,43]}),{23:[1,44]},o($Vs,[2,22]),o($Vs,[2,23]),o($Vs,[2,24]),o($Vs,[2,25]),{30:45,31:[1,46],59:[1,47],60:[1,48]},o($Vs,[2,28]),{34:[1,49]},{36:[1,50]},o($Vs,[2,31]),{13:51,24:$Va,57:$Vr},{42:[1,52],44:[1,53]},{46:[1,54]},{49:[1,55]},o($Vt,[2,44],{58:[1,56]}),o($Vt,[2,45],{58:[1,57]}),o($Vs,[2,38]),o($Vs,[2,39]),o($Vs,[2,40]),o($Vs,[2,41]),o($Vs,[2,6]),o($Vs,[2,13]),{13:58,24:$Va,57:$Vr},o($Vs,[2,17]),o($Vu,$V3,{7:59}),{24:[1,60]},{24:[1,61]},{23:[1,62]},{24:[2,48]},{24:[2,49]},o($Vs,[2,29]),o($Vs,[2,30]),{39:[1,63],40:[1,64]},{43:[1,65]},{43:[1,66]},{47:[1,67]},{50:[1,68]},{24:[1,69]},{24:[1,70]},o($Vs,[2,14],{14:[1,71]}),{4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,21:[1,72],22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,20],{20:[1,73]}),{31:[1,74]},{24:[1,75]},{39:[1,76]},{39:[1,77]},o($Vs,[2,34]),o($Vs,[2,35]),o($Vs,[2,36]),o($Vs,[2,37]),o($Vt,[2,46]),o($Vt,[2,47]),o($Vs,[2,15]),o($Vs,[2,19]),o($Vu,$V3,{7:78}),o($Vs,[2,26]),o($Vs,[2,27]),{5:[1,79]},{5:[1,80]},{4:$V4,5:$V5,8:8,9:10,10:12,11:13,12:14,13:15,16:$V6,17:$V7,19:$V8,21:[1,81],22:$V9,24:$Va,25:$Vb,26:$Vc,27:$Vd,28:$Ve,29:$Vf,32:25,33:$Vg,35:$Vh,37:$Vi,38:$Vj,41:$Vk,45:$Vl,48:$Vm,51:$Vn,52:$Vo,53:$Vp,54:$Vq,57:$Vr},o($Vs,[2,32]),o($Vs,[2,33]),o($Vs,[2,21])], defaultActions: {5:[2,1],6:[2,2],47:[2,48],48:[2,49]}, 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; }}; /* 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: {"case-insensitive":true}, performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) { var YYSTATE=YY_START; switch($avoiding_name_collisions) { case 0:return 38; break; case 1:return 40; break; case 2:return 39; break; case 3:return 44; break; case 4:return 51; break; case 5:return 52; break; case 6:return 53; break; case 7:return 54; break; case 8:/* skip comments */ break; case 9:/* skip comments */{ /*console.log('Crap after close');*/ } break; case 10:return 5; break; case 11:/* skip all whitespace */ break; case 12:/* skip same-line whitespace */ break; case 13:/* skip comments */ break; case 14:/* skip comments */ break; case 15: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 17; break; case 16:return 18; break; case 17: this.popState(); break; case 18: this.begin("acc_title");return 33; break; case 19: this.popState(); return "acc_title_value"; break; case 20: this.begin("acc_descr");return 35; break; case 21: this.popState(); return "acc_descr_value"; break; case 22: this.begin("acc_descr_multiline"); break; case 23: this.popState(); break; case 24:return "acc_descr_multiline_value"; break; case 25: this.pushState('CLASSDEF'); return 41; break; case 26: this.popState(); this.pushState('CLASSDEFID'); return 'DEFAULT_CLASSDEF_ID' break; case 27: this.popState(); this.pushState('CLASSDEFID'); return 42 break; case 28: this.popState(); return 43 break; case 29: this.pushState('CLASS'); return 48; break; case 30: this.popState(); this.pushState('CLASS_STYLE'); return 49 break; case 31: this.popState(); return 50 break; case 32: this.pushState('STYLE'); return 45; break; case 33: this.popState(); this.pushState('STYLEDEF_STYLES'); return 46 break; case 34: this.popState(); return 47 break; case 35: this.pushState('SCALE'); /* console.log('Got scale', yy_.yytext);*/ return 17; break; case 36:return 18; break; case 37:this.popState(); break; case 38: /* console.log('Starting STATE '); */ this.pushState('STATE'); break; case 39:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim(); /*console.warn('Fork Fork: ',yy_.yytext);*/return 25; break; case 40:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 26; break; case 41:this.popState();yy_.yytext=yy_.yytext.slice(0,-10).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 27; break; case 42:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Fork: ',yy_.yytext);*/return 25; break; case 43:this.popState();yy_.yytext=yy_.yytext.slice(0,-8).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 26; break; case 44:this.popState();yy_.yytext=yy_.yytext.slice(0,-10).trim();/*console.warn('Fork Join: ',yy_.yytext);*/return 27; break; case 45: return 51; break; case 46: return 52; break; case 47: return 53; break; case 48: return 54; break; case 49: /* console.log('Starting STATE_STRING'); */ this.pushState("STATE_STRING"); break; case 50: this.pushState('STATE_ID'); /* console.log('pushState(STATE_ID)'); */ return "AS"; break; case 51: this.popState(); /* console.log('STATE_ID', yy_.yytext); */ return "ID"; break; case 52: this.popState(); break; case 53: /* console.log('Long description:', yy_.yytext); */ return "STATE_DESCR"; break; case 54: /* console.log('COMPOSIT_STATE', yy_.yytext); */ return 19; break; case 55: this.popState(); break; case 56: this.popState(); this.pushState('struct'); /* console.log('begin struct', yy_.yytext); */ return 20; break; case 57:/* skip comments inside state*/ break; case 58: /*console.log('Ending struct');*/ this.popState(); return 21; break; case 59:/* nothing */ break; case 60: this.begin('NOTE'); return 29; break; case 61: this.popState(); this.pushState('NOTE_ID'); return 59; break; case 62: this.popState(); this.pushState('NOTE_ID'); return 60; break; case 63: this.popState(); this.pushState('FLOATING_NOTE'); break; case 64: this.popState(); this.pushState('FLOATING_NOTE_ID'); return "AS"; break; case 65:/**/ break; case 66: /* console.log('Floating note text: ', yy_.yytext); */ return "NOTE_TEXT"; break; case 67: this.popState(); /* console.log('Floating note ID', yy_.yytext);*/ return "ID"; break; case 68: this.popState(); this.pushState('NOTE_TEXT'); /*console.log('Got ID for note', yy_.yytext);*/ return 24; break; case 69: this.popState(); /* console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.substr(2).trim(); return 31; break; case 70: this.popState(); /* console.log('Got NOTE_TEXT for note',yy_.yytext);*/yy_.yytext = yy_.yytext.slice(0,-8).trim(); return 31; break; case 71: /* console.log('Got state diagram', yy_.yytext,'#'); */ return 6; break; case 72: /* console.log('Got state diagram', yy_.yytext,'#'); */ return 6; break; case 73: /* console.log('HIDE_EMPTY', yy_.yytext,'#'); */ return 16; break; case 74: /* console.log('EDGE_STATE=',yy_.yytext); */ return 57; break; case 75: /* console.log('=>ID=',yy_.yytext); */ return 24; break; case 76: yy_.yytext = yy_.yytext.trim(); /* console.log('Descr = ', yy_.yytext); */ return 14; break; case 77:return 15; break; case 78:return 28; break; case 79:return 58; break; case 80:return 5; break; case 81:return 'INVALID'; break; } }, rules: [/^(?:click\b)/i,/^(?:href\b)/i,/^(?:"[^"]*")/i,/^(?:default\b)/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[\n]+)/i,/^(?:[\s]+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:accTitle\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*:\s*)/i,/^(?:(?!\n||)*[^\n]*)/i,/^(?:accDescr\s*\{\s*)/i,/^(?:[\}])/i,/^(?:[^\}]*)/i,/^(?:classDef\s+)/i,/^(?:DEFAULT\s+)/i,/^(?:\w+\s+)/i,/^(?:[^\n]*)/i,/^(?:class\s+)/i,/^(?:(\w+)+((,\s*\w+)*))/i,/^(?:[^\n]*)/i,/^(?:style\s+)/i,/^(?:[\w,]+\s+)/i,/^(?:[^\n]*)/i,/^(?:scale\s+)/i,/^(?:\d+)/i,/^(?:\s+width\b)/i,/^(?:state\s+)/i,/^(?:.*<<fork>>)/i,/^(?:.*<<join>>)/i,/^(?:.*<<choice>>)/i,/^(?:.*\[\[fork\]\])/i,/^(?:.*\[\[join\]\])/i,/^(?:.*\[\[choice\]\])/i,/^(?:.*direction\s+TB[^\n]*)/i,/^(?:.*direction\s+BT[^\n]*)/i,/^(?:.*direction\s+RL[^\n]*)/i,/^(?:.*direction\s+LR[^\n]*)/i,/^(?:["])/i,/^(?:\s*as\s+)/i,/^(?:[^\n\{]*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n\s\{]+)/i,/^(?:\n)/i,/^(?:\{)/i,/^(?:%%(?!\{)[^\n]*)/i,/^(?:\})/i,/^(?:[\n])/i,/^(?:note\s+)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:")/i,/^(?:\s*as\s*)/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[^\n]*)/i,/^(?:\s*[^:\n\s\-]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:[\s\S]*?end note\b)/i,/^(?:stateDiagram\s+)/i,/^(?:stateDiagram-v2\s+)/i,/^(?:hide empty description\b)/i,/^(?:\[\*\])/i,/^(?:[^:\n\s\-\{]+)/i,/^(?:\s*:[^:\n;]+)/i,/^(?:-->)/i,/^(?:--)/i,/^(?::::)/i,/^(?:$)/i,/^(?:.)/i], conditions: {"LINE":{"rules":[12,13],"inclusive":false},"struct":{"rules":[12,13,25,29,32,38,45,46,47,48,57,58,59,60,74,75,76,77,78],"inclusive":false},"FLOATING_NOTE_ID":{"rules":[67],"inclusive":false},"FLOATING_NOTE":{"rules":[64,65,66],"inclusive":false},"NOTE_TEXT":{"rules":[69,70],"inclusive":false},"NOTE_ID":{"rules":[68],"inclusive":false},"NOTE":{"rules":[61,62,63],"inclusive":false},"STYLEDEF_STYLEOPTS":{"rules":[],"inclusive":false},"STYLEDEF_STYLES":{"rules":[34],"inclusive":false},"STYLE_IDS":{"rules":[],"inclusive":false},"STYLE":{"rules":[33],"inclusive":false},"CLASS_STYLE":{"rules":[31],"inclusive":false},"CLASS":{"rules":[30],"inclusive":false},"CLASSDEFID":{"rules":[28],"inclusive":false},"CLASSDEF":{"rules":[26,27],"inclusive":false},"acc_descr_multiline":{"rules":[23,24],"inclusive":false},"acc_descr":{"rules":[21],"inclusive":false},"acc_title":{"rules":[19],"inclusive":false},"SCALE":{"rules":[16,17,36,37],"inclusive":false},"ALIAS":{"rules":[],"inclusive":false},"STATE_ID":{"rules":[51],"inclusive":false},"STATE_STRING":{"rules":[52,53],"inclusive":false},"FORK_STATE":{"rules":[],"inclusive":false},"STATE":{"rules":[12,13,39,40,41,42,43,44,49,50,54,55,56],"inclusive":false},"ID":{"rules":[12,13],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,13,14,15,18,20,22,25,29,32,35,38,56,60,71,72,73,74,75,76,77,79,80,81],"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)); } };

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ai-of-mine/fast-mermaid-validator-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server