mirror of
				https://github.com/mermaid-js/mermaid.git
				synced 2025-11-04 04:44:08 +01:00 
			
		
		
		
	chore: integrate jison into webpack build
This commit is contained in:
		
							
								
								
									
										10
									
								
								gulpfile.js
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								gulpfile.js
									
									
									
									
									
								
							@@ -1,10 +0,0 @@
 | 
			
		||||
import gulp from 'gulp'
 | 
			
		||||
import jison from 'gulp-jison'
 | 
			
		||||
import print from 'gulp-print'
 | 
			
		||||
 | 
			
		||||
gulp.task('jison', function () {
 | 
			
		||||
  return gulp.src('./src/**/*.jison')
 | 
			
		||||
    .pipe(print())
 | 
			
		||||
    .pipe(jison({ 'token-stack': true }))
 | 
			
		||||
    .pipe(gulp.dest('./src/'))
 | 
			
		||||
})
 | 
			
		||||
@@ -1,9 +1,13 @@
 | 
			
		||||
const path = require('path')
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  transform: {
 | 
			
		||||
    '^.+\\.jsx?$': './transformer.js'
 | 
			
		||||
    '^.+\\.jsx?$': './transformer.js',
 | 
			
		||||
    '^.+\\.jison$': path.resolve(__dirname, './jisonTransformer.js')
 | 
			
		||||
  },
 | 
			
		||||
  transformIgnorePatterns: ['/node_modules/(?!dagre-d3-renderer/lib).*\\.js'],
 | 
			
		||||
  moduleNameMapper: {
 | 
			
		||||
    '\\.(css|scss)$': 'identity-obj-proxy'
 | 
			
		||||
  }
 | 
			
		||||
  },
 | 
			
		||||
  moduleFileExtensions: ['js', 'json', 'jsx', 'ts', 'tsx', 'node', 'jison']
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										6
									
								
								jisonLoader.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								jisonLoader.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
const { Generator } = require('jison')
 | 
			
		||||
const { getOptions } = require('loader-utils')
 | 
			
		||||
 | 
			
		||||
module.exports = function jisonLoader (source) {
 | 
			
		||||
  return new Generator(source, getOptions(this)).generate()
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								jisonTransformer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								jisonTransformer.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
const { Generator } = require('jison')
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  process (source, filename, config, transformOptions) {
 | 
			
		||||
    return new Generator(source, {
 | 
			
		||||
      'token-stack': true
 | 
			
		||||
    }).generate()
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
@@ -24,7 +24,6 @@
 | 
			
		||||
    "dev": "yarn lint && webpack-dev-server --config webpack.config.e2e.js",
 | 
			
		||||
    "test": "yarn lint && jest src",
 | 
			
		||||
    "test:watch": "jest --watch src",
 | 
			
		||||
    "jison": "node -r @babel/register node_modules/.bin/gulp jison",
 | 
			
		||||
    "prepublishOnly": "yarn build && yarn release && yarn test",
 | 
			
		||||
    "prepush": "yarn test"
 | 
			
		||||
  },
 | 
			
		||||
@@ -50,7 +49,6 @@
 | 
			
		||||
    "dagre-layout": "^0.8.8",
 | 
			
		||||
    "documentation": "^12.0.1",
 | 
			
		||||
    "graphlibrary": "^2.2.0",
 | 
			
		||||
    "gulp-print": "^5.0.2",
 | 
			
		||||
    "he": "^1.2.0",
 | 
			
		||||
    "lodash": "^4.17.11",
 | 
			
		||||
    "minify": "^4.1.1",
 | 
			
		||||
@@ -67,8 +65,6 @@
 | 
			
		||||
    "coveralls": "^3.0.2",
 | 
			
		||||
    "css-loader": "^2.0.1",
 | 
			
		||||
    "css-to-string-loader": "^0.1.3",
 | 
			
		||||
    "gulp": "^4.0.0",
 | 
			
		||||
    "gulp-jison": "^1.2.0",
 | 
			
		||||
    "husky": "^1.2.1",
 | 
			
		||||
    "identity-obj-proxy": "^3.0.0",
 | 
			
		||||
    "jest": "^23.6.0",
 | 
			
		||||
 
 | 
			
		||||
@@ -1,743 +0,0 @@
 | 
			
		||||
/* 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,11],$V1=[1,12],$V2=[1,13],$V3=[1,15],$V4=[1,16],$V5=[1,17],$V6=[6,8],$V7=[1,26],$V8=[1,27],$V9=[1,28],$Va=[1,29],$Vb=[1,30],$Vc=[1,31],$Vd=[6,8,13,17,23,26,27,28,29,30,31],$Ve=[6,8,13,17,23,26,27,28,29,30,31,45,46,47],$Vf=[23,45,46,47],$Vg=[23,30,31,45,46,47],$Vh=[23,26,27,28,29,45,46,47],$Vi=[6,8,13],$Vj=[1,46];
 | 
			
		||||
var parser = {trace: function trace () { },
 | 
			
		||||
yy: {},
 | 
			
		||||
symbols_: {"error":2,"mermaidDoc":3,"graphConfig":4,"CLASS_DIAGRAM":5,"NEWLINE":6,"statements":7,"EOF":8,"statement":9,"className":10,"alphaNumToken":11,"relationStatement":12,"LABEL":13,"classStatement":14,"methodStatement":15,"CLASS":16,"STRUCT_START":17,"members":18,"STRUCT_STOP":19,"MEMBER":20,"SEPARATOR":21,"relation":22,"STR":23,"relationType":24,"lineType":25,"AGGREGATION":26,"EXTENSION":27,"COMPOSITION":28,"DEPENDENCY":29,"LINE":30,"DOTTED_LINE":31,"commentToken":32,"textToken":33,"graphCodeTokens":34,"textNoTagsToken":35,"TAGSTART":36,"TAGEND":37,"==":38,"--":39,"PCT":40,"DEFAULT":41,"SPACE":42,"MINUS":43,"keywords":44,"UNICODE_TEXT":45,"NUM":46,"ALPHA":47,"$accept":0,"$end":1},
 | 
			
		||||
terminals_: {2:"error",5:"CLASS_DIAGRAM",6:"NEWLINE",8:"EOF",13:"LABEL",16:"CLASS",17:"STRUCT_START",19:"STRUCT_STOP",20:"MEMBER",21:"SEPARATOR",23:"STR",26:"AGGREGATION",27:"EXTENSION",28:"COMPOSITION",29:"DEPENDENCY",30:"LINE",31:"DOTTED_LINE",34:"graphCodeTokens",36:"TAGSTART",37:"TAGEND",38:"==",39:"--",40:"PCT",41:"DEFAULT",42:"SPACE",43:"MINUS",44:"keywords",45:"UNICODE_TEXT",46:"NUM",47:"ALPHA"},
 | 
			
		||||
productions_: [0,[3,1],[4,4],[7,1],[7,2],[7,3],[10,2],[10,1],[9,1],[9,2],[9,1],[9,1],[14,2],[14,5],[18,1],[18,2],[15,1],[15,2],[15,1],[15,1],[12,3],[12,4],[12,4],[12,5],[22,3],[22,2],[22,2],[22,1],[24,1],[24,1],[24,1],[24,1],[25,1],[25,1],[32,1],[32,1],[33,1],[33,1],[33,1],[33,1],[33,1],[33,1],[33,1],[35,1],[35,1],[35,1],[35,1],[11,1],[11,1],[11,1]],
 | 
			
		||||
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
 | 
			
		||||
/* this == yyval */
 | 
			
		||||
 | 
			
		||||
var $0 = $$.length - 1;
 | 
			
		||||
switch (yystate) {
 | 
			
		||||
case 6:
 | 
			
		||||
 this.$=$$[$0-1]+$$[$0]; 
 | 
			
		||||
break;
 | 
			
		||||
case 7:
 | 
			
		||||
 this.$=$$[$0]; 
 | 
			
		||||
break;
 | 
			
		||||
case 8:
 | 
			
		||||
 yy.addRelation($$[$0]); 
 | 
			
		||||
break;
 | 
			
		||||
case 9:
 | 
			
		||||
 $$[$0-1].title =  yy.cleanupLabel($$[$0]); yy.addRelation($$[$0-1]);        
 | 
			
		||||
break;
 | 
			
		||||
case 12:
 | 
			
		||||
yy.addClass($$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 13:
 | 
			
		||||
/*console.log($$[$0-3],JSON.stringify($$[$0-1]));*/yy.addClass($$[$0-3]);yy.addMembers($$[$0-3],$$[$0-1]);
 | 
			
		||||
break;
 | 
			
		||||
case 14:
 | 
			
		||||
 this.$ = [$$[$0]]; 
 | 
			
		||||
break;
 | 
			
		||||
case 15:
 | 
			
		||||
 $$[$0].push($$[$0-1]);this.$=$$[$0];
 | 
			
		||||
break;
 | 
			
		||||
case 16:
 | 
			
		||||
/*console.log('Rel found',$$[$0]);*/
 | 
			
		||||
break;
 | 
			
		||||
case 17:
 | 
			
		||||
yy.addMember($$[$0-1],yy.cleanupLabel($$[$0]));
 | 
			
		||||
break;
 | 
			
		||||
case 18:
 | 
			
		||||
console.warn('Member',$$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 19:
 | 
			
		||||
/*console.log('sep found',$$[$0]);*/
 | 
			
		||||
break;
 | 
			
		||||
case 20:
 | 
			
		||||
 this.$ = {'id1':$$[$0-2],'id2':$$[$0], relation:$$[$0-1], relationTitle1:'none', relationTitle2:'none'}; 
 | 
			
		||||
break;
 | 
			
		||||
case 21:
 | 
			
		||||
 this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-1], relationTitle1:$$[$0-2], relationTitle2:'none'}
 | 
			
		||||
break;
 | 
			
		||||
case 22:
 | 
			
		||||
 this.$ = {id1:$$[$0-3], id2:$$[$0], relation:$$[$0-2], relationTitle1:'none', relationTitle2:$$[$0-1]}; 
 | 
			
		||||
break;
 | 
			
		||||
case 23:
 | 
			
		||||
 this.$ = {id1:$$[$0-4], id2:$$[$0], relation:$$[$0-2], relationTitle1:$$[$0-3], relationTitle2:$$[$0-1]} 
 | 
			
		||||
break;
 | 
			
		||||
case 24:
 | 
			
		||||
 this.$={type1:$$[$0-2],type2:$$[$0],lineType:$$[$0-1]}; 
 | 
			
		||||
break;
 | 
			
		||||
case 25:
 | 
			
		||||
 this.$={type1:'none',type2:$$[$0],lineType:$$[$0-1]}; 
 | 
			
		||||
break;
 | 
			
		||||
case 26:
 | 
			
		||||
 this.$={type1:$$[$0-1],type2:'none',lineType:$$[$0]}; 
 | 
			
		||||
break;
 | 
			
		||||
case 27:
 | 
			
		||||
 this.$={type1:'none',type2:'none',lineType:$$[$0]}; 
 | 
			
		||||
break;
 | 
			
		||||
case 28:
 | 
			
		||||
 this.$=yy.relationType.AGGREGATION;
 | 
			
		||||
break;
 | 
			
		||||
case 29:
 | 
			
		||||
 this.$=yy.relationType.EXTENSION;
 | 
			
		||||
break;
 | 
			
		||||
case 30:
 | 
			
		||||
 this.$=yy.relationType.COMPOSITION;
 | 
			
		||||
break;
 | 
			
		||||
case 31:
 | 
			
		||||
 this.$=yy.relationType.DEPENDENCY;
 | 
			
		||||
break;
 | 
			
		||||
case 32:
 | 
			
		||||
this.$=yy.lineType.LINE;
 | 
			
		||||
break;
 | 
			
		||||
case 33:
 | 
			
		||||
this.$=yy.lineType.DOTTED_LINE;
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
table: [{3:1,4:2,5:[1,3]},{1:[3]},{1:[2,1]},{6:[1,4]},{7:5,9:6,10:10,11:14,12:7,14:8,15:9,16:$V0,20:$V1,21:$V2,45:$V3,46:$V4,47:$V5},{8:[1,18]},{6:[1,19],8:[2,3]},o($V6,[2,8],{13:[1,20]}),o($V6,[2,10]),o($V6,[2,11]),o($V6,[2,16],{22:21,24:24,25:25,13:[1,23],23:[1,22],26:$V7,27:$V8,28:$V9,29:$Va,30:$Vb,31:$Vc}),{10:32,11:14,45:$V3,46:$V4,47:$V5},o($V6,[2,18]),o($V6,[2,19]),o($Vd,[2,7],{11:14,10:33,45:$V3,46:$V4,47:$V5}),o($Ve,[2,47]),o($Ve,[2,48]),o($Ve,[2,49]),{1:[2,2]},{7:34,8:[2,4],9:6,10:10,11:14,12:7,14:8,15:9,16:$V0,20:$V1,21:$V2,45:$V3,46:$V4,47:$V5},o($V6,[2,9]),{10:35,11:14,23:[1,36],45:$V3,46:$V4,47:$V5},{22:37,24:24,25:25,26:$V7,27:$V8,28:$V9,29:$Va,30:$Vb,31:$Vc},o($V6,[2,17]),{25:38,30:$Vb,31:$Vc},o($Vf,[2,27],{24:39,26:$V7,27:$V8,28:$V9,29:$Va}),o($Vg,[2,28]),o($Vg,[2,29]),o($Vg,[2,30]),o($Vg,[2,31]),o($Vh,[2,32]),o($Vh,[2,33]),o($V6,[2,12],{17:[1,40]}),o($Vd,[2,6]),{8:[2,5]},o($Vi,[2,20]),{10:41,11:14,45:$V3,46:$V4,47:$V5},{10:42,11:14,23:[1,43],45:$V3,46:$V4,47:$V5},o($Vf,[2,26],{24:44,26:$V7,27:$V8,28:$V9,29:$Va}),o($Vf,[2,25]),{18:45,20:$Vj},o($Vi,[2,22]),o($Vi,[2,21]),{10:47,11:14,45:$V3,46:$V4,47:$V5},o($Vf,[2,24]),{19:[1,48]},{18:49,19:[2,14],20:$Vj},o($Vi,[2,23]),o($V6,[2,13]),{19:[2,15]}],
 | 
			
		||||
defaultActions: {2:[2,1],18:[2,2],34:[2,5],49:[2,15]},
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
            function lex() {
 | 
			
		||||
            var token;
 | 
			
		||||
            token = tstack.pop() || lexer.lex() || EOF;
 | 
			
		||||
            if (typeof token !== 'number') {
 | 
			
		||||
                if (token instanceof Array) {
 | 
			
		||||
                    tstack = token;
 | 
			
		||||
                    token = tstack.pop();
 | 
			
		||||
                }
 | 
			
		||||
                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: {},
 | 
			
		||||
performAction: function anonymous(yy,yy_,$avoiding_name_collisions,YY_START) {
 | 
			
		||||
var YYSTATE=YY_START;
 | 
			
		||||
switch($avoiding_name_collisions) {
 | 
			
		||||
case 0:/* do nothing */
 | 
			
		||||
break;
 | 
			
		||||
case 1:return 6;
 | 
			
		||||
break;
 | 
			
		||||
case 2:/* skip whitespace */
 | 
			
		||||
break;
 | 
			
		||||
case 3:return 5;
 | 
			
		||||
break;
 | 
			
		||||
case 4: this.begin("struct"); /*console.log('Starting struct');*/return 17;
 | 
			
		||||
break;
 | 
			
		||||
case 5: /*console.log('Ending struct');*/this.popState(); return 19;
 | 
			
		||||
break;
 | 
			
		||||
case 6:/* nothing */
 | 
			
		||||
break;
 | 
			
		||||
case 7: /*console.log('lex-member: ' + yy_.yytext);*/  return "MEMBER";
 | 
			
		||||
break;
 | 
			
		||||
case 8:return 16;
 | 
			
		||||
break;
 | 
			
		||||
case 9:this.begin("string");
 | 
			
		||||
break;
 | 
			
		||||
case 10:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 11:return "STR";
 | 
			
		||||
break;
 | 
			
		||||
case 12:return 27;
 | 
			
		||||
break;
 | 
			
		||||
case 13:return 27;
 | 
			
		||||
break;
 | 
			
		||||
case 14:return 29;
 | 
			
		||||
break;
 | 
			
		||||
case 15:return 29;
 | 
			
		||||
break;
 | 
			
		||||
case 16:return 28;
 | 
			
		||||
break;
 | 
			
		||||
case 17:return 26;
 | 
			
		||||
break;
 | 
			
		||||
case 18:return 30;
 | 
			
		||||
break;
 | 
			
		||||
case 19:return 31;
 | 
			
		||||
break;
 | 
			
		||||
case 20:return 13;
 | 
			
		||||
break;
 | 
			
		||||
case 21:return 43;
 | 
			
		||||
break;
 | 
			
		||||
case 22:return 'DOT';
 | 
			
		||||
break;
 | 
			
		||||
case 23:return 'PLUS';
 | 
			
		||||
break;
 | 
			
		||||
case 24:return 40;
 | 
			
		||||
break;
 | 
			
		||||
case 25:return 'EQUALS';
 | 
			
		||||
break;
 | 
			
		||||
case 26:return 'EQUALS';
 | 
			
		||||
break;
 | 
			
		||||
case 27:return 47;
 | 
			
		||||
break;
 | 
			
		||||
case 28:return 'PUNCTUATION';
 | 
			
		||||
break;
 | 
			
		||||
case 29:return 46;
 | 
			
		||||
break;
 | 
			
		||||
case 30:return 45;
 | 
			
		||||
break;
 | 
			
		||||
case 31:return 42;
 | 
			
		||||
break;
 | 
			
		||||
case 32:return 8;
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
rules: [/^(?:%%[^\n]*)/,/^(?:\n+)/,/^(?:\s+)/,/^(?:classDiagram\b)/,/^(?:[\{])/,/^(?:\})/,/^(?:[\n])/,/^(?:[^\{\}\n]*)/,/^(?:class\b)/,/^(?:["])/,/^(?:["])/,/^(?:[^"]*)/,/^(?:\s*<\|)/,/^(?:\s*\|>)/,/^(?:\s*>)/,/^(?:\s*<)/,/^(?:\s*\*)/,/^(?:\s*o\b)/,/^(?:--)/,/^(?:\.\.)/,/^(?::[^#\n;]+)/,/^(?:-)/,/^(?:\.)/,/^(?:\+)/,/^(?:%)/,/^(?:=)/,/^(?:=)/,/^(?:[A-Za-z]+)/,/^(?:[!"#$%&'*+,-.`?\\_\/])/,/^(?:[0-9]+)/,/^(?:[\u00AA\u00B5\u00BA\u00C0-\u00D6\u00D8-\u00F6]|[\u00F8-\u02C1\u02C6-\u02D1\u02E0-\u02E4\u02EC\u02EE\u0370-\u0374\u0376\u0377]|[\u037A-\u037D\u0386\u0388-\u038A\u038C\u038E-\u03A1\u03A3-\u03F5]|[\u03F7-\u0481\u048A-\u0527\u0531-\u0556\u0559\u0561-\u0587\u05D0-\u05EA]|[\u05F0-\u05F2\u0620-\u064A\u066E\u066F\u0671-\u06D3\u06D5\u06E5\u06E6\u06EE]|[\u06EF\u06FA-\u06FC\u06FF\u0710\u0712-\u072F\u074D-\u07A5\u07B1\u07CA-\u07EA]|[\u07F4\u07F5\u07FA\u0800-\u0815\u081A\u0824\u0828\u0840-\u0858\u08A0]|[\u08A2-\u08AC\u0904-\u0939\u093D\u0950\u0958-\u0961\u0971-\u0977]|[\u0979-\u097F\u0985-\u098C\u098F\u0990\u0993-\u09A8\u09AA-\u09B0\u09B2]|[\u09B6-\u09B9\u09BD\u09CE\u09DC\u09DD\u09DF-\u09E1\u09F0\u09F1\u0A05-\u0A0A]|[\u0A0F\u0A10\u0A13-\u0A28\u0A2A-\u0A30\u0A32\u0A33\u0A35\u0A36\u0A38\u0A39]|[\u0A59-\u0A5C\u0A5E\u0A72-\u0A74\u0A85-\u0A8D\u0A8F-\u0A91\u0A93-\u0AA8]|[\u0AAA-\u0AB0\u0AB2\u0AB3\u0AB5-\u0AB9\u0ABD\u0AD0\u0AE0\u0AE1\u0B05-\u0B0C]|[\u0B0F\u0B10\u0B13-\u0B28\u0B2A-\u0B30\u0B32\u0B33\u0B35-\u0B39\u0B3D\u0B5C]|[\u0B5D\u0B5F-\u0B61\u0B71\u0B83\u0B85-\u0B8A\u0B8E-\u0B90\u0B92-\u0B95\u0B99]|[\u0B9A\u0B9C\u0B9E\u0B9F\u0BA3\u0BA4\u0BA8-\u0BAA\u0BAE-\u0BB9\u0BD0]|[\u0C05-\u0C0C\u0C0E-\u0C10\u0C12-\u0C28\u0C2A-\u0C33\u0C35-\u0C39\u0C3D]|[\u0C58\u0C59\u0C60\u0C61\u0C85-\u0C8C\u0C8E-\u0C90\u0C92-\u0CA8\u0CAA-\u0CB3]|[\u0CB5-\u0CB9\u0CBD\u0CDE\u0CE0\u0CE1\u0CF1\u0CF2\u0D05-\u0D0C\u0D0E-\u0D10]|[\u0D12-\u0D3A\u0D3D\u0D4E\u0D60\u0D61\u0D7A-\u0D7F\u0D85-\u0D96\u0D9A-\u0DB1]|[\u0DB3-\u0DBB\u0DBD\u0DC0-\u0DC6\u0E01-\u0E30\u0E32\u0E33\u0E40-\u0E46\u0E81]|[\u0E82\u0E84\u0E87\u0E88\u0E8A\u0E8D\u0E94-\u0E97\u0E99-\u0E9F\u0EA1-\u0EA3]|[\u0EA5\u0EA7\u0EAA\u0EAB\u0EAD-\u0EB0\u0EB2\u0EB3\u0EBD\u0EC0-\u0EC4\u0EC6]|[\u0EDC-\u0EDF\u0F00\u0F40-\u0F47\u0F49-\u0F6C\u0F88-\u0F8C\u1000-\u102A]|[\u103F\u1050-\u1055\u105A-\u105D\u1061\u1065\u1066\u106E-\u1070\u1075-\u1081]|[\u108E\u10A0-\u10C5\u10C7\u10CD\u10D0-\u10FA\u10FC-\u1248\u124A-\u124D]|[\u1250-\u1256\u1258\u125A-\u125D\u1260-\u1288\u128A-\u128D\u1290-\u12B0]|[\u12B2-\u12B5\u12B8-\u12BE\u12C0\u12C2-\u12C5\u12C8-\u12D6\u12D8-\u1310]|[\u1312-\u1315\u1318-\u135A\u1380-\u138F\u13A0-\u13F4\u1401-\u166C]|[\u166F-\u167F\u1681-\u169A\u16A0-\u16EA\u1700-\u170C\u170E-\u1711]|[\u1720-\u1731\u1740-\u1751\u1760-\u176C\u176E-\u1770\u1780-\u17B3\u17D7]|[\u17DC\u1820-\u1877\u1880-\u18A8\u18AA\u18B0-\u18F5\u1900-\u191C]|[\u1950-\u196D\u1970-\u1974\u1980-\u19AB\u19C1-\u19C7\u1A00-\u1A16]|[\u1A20-\u1A54\u1AA7\u1B05-\u1B33\u1B45-\u1B4B\u1B83-\u1BA0\u1BAE\u1BAF]|[\u1BBA-\u1BE5\u1C00-\u1C23\u1C4D-\u1C4F\u1C5A-\u1C7D\u1CE9-\u1CEC]|[\u1CEE-\u1CF1\u1CF5\u1CF6\u1D00-\u1DBF\u1E00-\u1F15\u1F18-\u1F1D]|[\u1F20-\u1F45\u1F48-\u1F4D\u1F50-\u1F57\u1F59\u1F5B\u1F5D\u1F5F-\u1F7D]|[\u1F80-\u1FB4\u1FB6-\u1FBC\u1FBE\u1FC2-\u1FC4\u1FC6-\u1FCC\u1FD0-\u1FD3]|[\u1FD6-\u1FDB\u1FE0-\u1FEC\u1FF2-\u1FF4\u1FF6-\u1FFC\u2071\u207F]|[\u2090-\u209C\u2102\u2107\u210A-\u2113\u2115\u2119-\u211D\u2124\u2126\u2128]|[\u212A-\u212D\u212F-\u2139\u213C-\u213F\u2145-\u2149\u214E\u2183\u2184]|[\u2C00-\u2C2E\u2C30-\u2C5E\u2C60-\u2CE4\u2CEB-\u2CEE\u2CF2\u2CF3]|[\u2D00-\u2D25\u2D27\u2D2D\u2D30-\u2D67\u2D6F\u2D80-\u2D96\u2DA0-\u2DA6]|[\u2DA8-\u2DAE\u2DB0-\u2DB6\u2DB8-\u2DBE\u2DC0-\u2DC6\u2DC8-\u2DCE]|[\u2DD0-\u2DD6\u2DD8-\u2DDE\u2E2F\u3005\u3006\u3031-\u3035\u303B\u303C]|[\u3041-\u3096\u309D-\u309F\u30A1-\u30FA\u30FC-\u30FF\u3105-\u312D]|[\u3131-\u318E\u31A0-\u31BA\u31F0-\u31FF\u3400-\u4DB5\u4E00-\u9FCC]|[\uA000-\uA48C\uA4D0-\uA4FD\uA500-\uA60C\uA610-\uA61F\uA62A\uA62B]|[\uA640-\uA66E\uA67F-\uA697\uA6A0-\uA6E5\uA717-\uA71F\uA722-\uA788]|[\uA78B-\uA78E\uA790-\uA793\uA7A0-\uA7AA\uA7F8-\uA801\uA803-\uA805]|[\uA807-\uA80A\uA80C-\uA822\uA840-\uA873\uA882-\uA8B3\uA8F2-\uA8F7\uA8FB]|[\uA90A-\uA925\uA930-\uA946\uA960-\uA97C\uA984-\uA9B2\uA9CF\uAA00-\uAA28]|[\uAA40-\uAA42\uAA44-\uAA4B\uAA60-\uAA76\uAA7A\uAA80-\uAAAF\uAAB1\uAAB5]|[\uAAB6\uAAB9-\uAABD\uAAC0\uAAC2\uAADB-\uAADD\uAAE0-\uAAEA\uAAF2-\uAAF4]|[\uAB01-\uAB06\uAB09-\uAB0E\uAB11-\uAB16\uAB20-\uAB26\uAB28-\uAB2E]|[\uABC0-\uABE2\uAC00-\uD7A3\uD7B0-\uD7C6\uD7CB-\uD7FB\uF900-\uFA6D]|[\uFA70-\uFAD9\uFB00-\uFB06\uFB13-\uFB17\uFB1D\uFB1F-\uFB28\uFB2A-\uFB36]|[\uFB38-\uFB3C\uFB3E\uFB40\uFB41\uFB43\uFB44\uFB46-\uFBB1\uFBD3-\uFD3D]|[\uFD50-\uFD8F\uFD92-\uFDC7\uFDF0-\uFDFB\uFE70-\uFE74\uFE76-\uFEFC]|[\uFF21-\uFF3A\uFF41-\uFF5A\uFF66-\uFFBE\uFFC2-\uFFC7\uFFCA-\uFFCF]|[\uFFD2-\uFFD7\uFFDA-\uFFDC])/,/^(?:\s)/,/^(?:$)/],
 | 
			
		||||
conditions: {"string":{"rules":[10,11],"inclusive":false},"struct":{"rules":[5,6,7],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,8,9,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32],"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));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -251,6 +251,8 @@ statement
 | 
			
		||||
    {$$=[];}
 | 
			
		||||
    | clickStatement separator
 | 
			
		||||
    {$$=[];}
 | 
			
		||||
    | subgraph SPACE text separator document end
 | 
			
		||||
    { debugger; $$=[]}
 | 
			
		||||
    | subgraph SPACE alphaNum SQS text SQE separator document end
 | 
			
		||||
    {$$=yy.addSubGraph($3,$8,$5);}
 | 
			
		||||
    | subgraph SPACE STR separator document end
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							@@ -1,723 +0,0 @@
 | 
			
		||||
/* 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=[6,8,10,11,12,13,14,15,16,18,20],$V1=[1,9],$V2=[1,10],$V3=[1,11],$V4=[1,12],$V5=[1,13],$V6=[1,14],$V7=[1,16],$V8=[1,17];
 | 
			
		||||
var parser = {trace: function trace () { },
 | 
			
		||||
yy: {},
 | 
			
		||||
symbols_: {"error":2,"start":3,"gantt":4,"document":5,"EOF":6,"line":7,"SPACE":8,"statement":9,"NL":10,"dateFormat":11,"inclusiveEndDates":12,"axisFormat":13,"excludes":14,"title":15,"section":16,"clickStatement":17,"taskTxt":18,"taskData":19,"click":20,"callbackname":21,"callbackargs":22,"href":23,"clickStatementDebug":24,"$accept":0,"$end":1},
 | 
			
		||||
terminals_: {2:"error",4:"gantt",6:"EOF",8:"SPACE",10:"NL",11:"dateFormat",12:"inclusiveEndDates",13:"axisFormat",14:"excludes",15:"title",16:"section",18:"taskTxt",19:"taskData",20:"click",21:"callbackname",22:"callbackargs",23:"href"},
 | 
			
		||||
productions_: [0,[3,3],[5,0],[5,2],[7,2],[7,1],[7,1],[7,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,1],[9,2],[17,2],[17,3],[17,3],[17,4],[17,3],[17,4],[17,2],[24,2],[24,3],[24,3],[24,4],[24,3],[24,4],[24,2]],
 | 
			
		||||
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.$ = [] 
 | 
			
		||||
break;
 | 
			
		||||
case 3:
 | 
			
		||||
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
 | 
			
		||||
break;
 | 
			
		||||
case 4: case 5:
 | 
			
		||||
 this.$ = $$[$0] 
 | 
			
		||||
break;
 | 
			
		||||
case 6: case 7:
 | 
			
		||||
 this.$=[];
 | 
			
		||||
break;
 | 
			
		||||
case 8:
 | 
			
		||||
yy.setDateFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
 | 
			
		||||
break;
 | 
			
		||||
case 9:
 | 
			
		||||
yy.enableInclusiveEndDates();this.$=$$[$0].substr(18);
 | 
			
		||||
break;
 | 
			
		||||
case 10:
 | 
			
		||||
yy.setAxisFormat($$[$0].substr(11));this.$=$$[$0].substr(11);
 | 
			
		||||
break;
 | 
			
		||||
case 11:
 | 
			
		||||
yy.setExcludes($$[$0].substr(9));this.$=$$[$0].substr(9);
 | 
			
		||||
break;
 | 
			
		||||
case 12:
 | 
			
		||||
yy.setTitle($$[$0].substr(6));this.$=$$[$0].substr(6);
 | 
			
		||||
break;
 | 
			
		||||
case 13:
 | 
			
		||||
yy.addSection($$[$0].substr(8));this.$=$$[$0].substr(8);
 | 
			
		||||
break;
 | 
			
		||||
case 15:
 | 
			
		||||
yy.addTask($$[$0-1],$$[$0]);this.$='task';
 | 
			
		||||
break;
 | 
			
		||||
case 16:
 | 
			
		||||
this.$ = $$[$0-1];yy.setClickEvent($$[$0-1], $$[$0], null);
 | 
			
		||||
break;
 | 
			
		||||
case 17:
 | 
			
		||||
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], $$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 18:
 | 
			
		||||
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0-1], null);yy.setLink($$[$0-2],$$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 19:
 | 
			
		||||
this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-2], $$[$0-1]);yy.setLink($$[$0-3],$$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 20:
 | 
			
		||||
this.$ = $$[$0-2];yy.setClickEvent($$[$0-2], $$[$0], null);yy.setLink($$[$0-2],$$[$0-1]);
 | 
			
		||||
break;
 | 
			
		||||
case 21:
 | 
			
		||||
this.$ = $$[$0-3];yy.setClickEvent($$[$0-3], $$[$0-1], $$[$0]);yy.setLink($$[$0-3],$$[$0-2]);
 | 
			
		||||
break;
 | 
			
		||||
case 22:
 | 
			
		||||
this.$ = $$[$0-1];yy.setLink($$[$0-1], $$[$0]);
 | 
			
		||||
break;
 | 
			
		||||
case 23: case 29:
 | 
			
		||||
this.$=$$[$0-1] + ' ' + $$[$0];
 | 
			
		||||
break;
 | 
			
		||||
case 24: case 25: case 27:
 | 
			
		||||
this.$=$$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
 | 
			
		||||
break;
 | 
			
		||||
case 26: case 28:
 | 
			
		||||
this.$=$$[$0-3] + ' ' + $$[$0-2] + ' ' + $$[$0-1] + ' ' + $$[$0];
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:$V1,12:$V2,13:$V3,14:$V4,15:$V5,16:$V6,17:15,18:$V7,20:$V8},o($V0,[2,7],{1:[2,1]}),o($V0,[2,3]),{9:18,11:$V1,12:$V2,13:$V3,14:$V4,15:$V5,16:$V6,17:15,18:$V7,20:$V8},o($V0,[2,5]),o($V0,[2,6]),o($V0,[2,8]),o($V0,[2,9]),o($V0,[2,10]),o($V0,[2,11]),o($V0,[2,12]),o($V0,[2,13]),o($V0,[2,14]),{19:[1,19]},{21:[1,20],23:[1,21]},o($V0,[2,4]),o($V0,[2,15]),o($V0,[2,16],{22:[1,22],23:[1,23]}),o($V0,[2,22],{21:[1,24]}),o($V0,[2,17],{23:[1,25]}),o($V0,[2,18]),o($V0,[2,20],{22:[1,26]}),o($V0,[2,19]),o($V0,[2,21])],
 | 
			
		||||
defaultActions: {},
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
            function lex() {
 | 
			
		||||
            var token;
 | 
			
		||||
            token = tstack.pop() || lexer.lex() || EOF;
 | 
			
		||||
            if (typeof token !== 'number') {
 | 
			
		||||
                if (token instanceof Array) {
 | 
			
		||||
                    tstack = token;
 | 
			
		||||
                    token = tstack.pop();
 | 
			
		||||
                }
 | 
			
		||||
                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 10;
 | 
			
		||||
break;
 | 
			
		||||
case 1:/* skip whitespace */
 | 
			
		||||
break;
 | 
			
		||||
case 2:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 3:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 4:this.begin("href");
 | 
			
		||||
break;
 | 
			
		||||
case 5:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 6:return 23;
 | 
			
		||||
break;
 | 
			
		||||
case 7:this.begin("callbackname");
 | 
			
		||||
break;
 | 
			
		||||
case 8:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 9:this.popState(); this.begin("callbackargs");
 | 
			
		||||
break;
 | 
			
		||||
case 10:return 21;
 | 
			
		||||
break;
 | 
			
		||||
case 11:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 12:return 22;
 | 
			
		||||
break;
 | 
			
		||||
case 13:this.begin("click");
 | 
			
		||||
break;
 | 
			
		||||
case 14:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 15:return 20;
 | 
			
		||||
break;
 | 
			
		||||
case 16:return 4;
 | 
			
		||||
break;
 | 
			
		||||
case 17:return 11;
 | 
			
		||||
break;
 | 
			
		||||
case 18:return 12;
 | 
			
		||||
break;
 | 
			
		||||
case 19:return 13;
 | 
			
		||||
break;
 | 
			
		||||
case 20:return 14;
 | 
			
		||||
break;
 | 
			
		||||
case 21:return 'date';
 | 
			
		||||
break;
 | 
			
		||||
case 22:return 15;
 | 
			
		||||
break;
 | 
			
		||||
case 23:return 16;
 | 
			
		||||
break;
 | 
			
		||||
case 24:return 18;
 | 
			
		||||
break;
 | 
			
		||||
case 25:return 19;
 | 
			
		||||
break;
 | 
			
		||||
case 26:return ':';
 | 
			
		||||
break;
 | 
			
		||||
case 27:return 6;
 | 
			
		||||
break;
 | 
			
		||||
case 28:return 'INVALID';
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:href[\s]+["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:call[\s]+)/i,/^(?:\([\s]*\))/i,/^(?:\()/i,/^(?:[^(]*)/i,/^(?:\))/i,/^(?:[^)]*)/i,/^(?:click[\s]+)/i,/^(?:[\s\n])/i,/^(?:[^\s\n]*)/i,/^(?:gantt\b)/i,/^(?:dateFormat\s[^#\n;]+)/i,/^(?:inclusiveEndDates\b)/i,/^(?:axisFormat\s[^#\n;]+)/i,/^(?:excludes\s[^#\n;]+)/i,/^(?:\d\d\d\d-\d\d-\d\d\b)/i,/^(?:title\s[^#\n;]+)/i,/^(?:section\s[^#:\n;]+)/i,/^(?:[^#:\n;]+)/i,/^(?::[^#\n;]+)/i,/^(?::)/i,/^(?:$)/i,/^(?:.)/i],
 | 
			
		||||
conditions: {"callbackargs":{"rules":[11,12],"inclusive":false},"callbackname":{"rules":[8,9,10],"inclusive":false},"href":{"rules":[5,6],"inclusive":false},"click":{"rules":[14,15],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,7,13,16,17,18,19,20,21,22,23,24,25,26,27,28],"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));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,696 +0,0 @@
 | 
			
		||||
/* 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=[2,3],$V1=[1,7],$V2=[7,12,15,17,19,20,21],$V3=[7,11,12,15,17,19,20,21],$V4=[2,20],$V5=[1,32];
 | 
			
		||||
var parser = {trace: function trace () { },
 | 
			
		||||
yy: {},
 | 
			
		||||
symbols_: {"error":2,"start":3,"GG":4,":":5,"document":6,"EOF":7,"DIR":8,"options":9,"body":10,"OPT":11,"NL":12,"line":13,"statement":14,"COMMIT":15,"commit_arg":16,"BRANCH":17,"ID":18,"CHECKOUT":19,"MERGE":20,"RESET":21,"reset_arg":22,"STR":23,"HEAD":24,"reset_parents":25,"CARET":26,"$accept":0,"$end":1},
 | 
			
		||||
terminals_: {2:"error",4:"GG",5:":",7:"EOF",8:"DIR",11:"OPT",12:"NL",15:"COMMIT",17:"BRANCH",18:"ID",19:"CHECKOUT",20:"MERGE",21:"RESET",23:"STR",24:"HEAD",26:"CARET"},
 | 
			
		||||
productions_: [0,[3,4],[3,5],[6,0],[6,2],[9,2],[9,1],[10,0],[10,2],[13,2],[13,1],[14,2],[14,2],[14,2],[14,2],[14,2],[16,0],[16,1],[22,2],[22,2],[25,0],[25,2]],
 | 
			
		||||
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:
 | 
			
		||||
yy.setDirection($$[$0-3]); return $$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 4:
 | 
			
		||||
 yy.setOptions($$[$0-1]); this.$ = $$[$0]
 | 
			
		||||
break;
 | 
			
		||||
case 5:
 | 
			
		||||
$$[$0-1] +=$$[$0]; this.$=$$[$0-1]
 | 
			
		||||
break;
 | 
			
		||||
case 7:
 | 
			
		||||
this.$ = []
 | 
			
		||||
break;
 | 
			
		||||
case 8:
 | 
			
		||||
$$[$0-1].push($$[$0]); this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 9:
 | 
			
		||||
this.$ =$$[$0-1]
 | 
			
		||||
break;
 | 
			
		||||
case 11:
 | 
			
		||||
yy.commit($$[$0])
 | 
			
		||||
break;
 | 
			
		||||
case 12:
 | 
			
		||||
yy.branch($$[$0])
 | 
			
		||||
break;
 | 
			
		||||
case 13:
 | 
			
		||||
yy.checkout($$[$0])
 | 
			
		||||
break;
 | 
			
		||||
case 14:
 | 
			
		||||
yy.merge($$[$0])
 | 
			
		||||
break;
 | 
			
		||||
case 15:
 | 
			
		||||
yy.reset($$[$0])
 | 
			
		||||
break;
 | 
			
		||||
case 16:
 | 
			
		||||
this.$ = ""
 | 
			
		||||
break;
 | 
			
		||||
case 17:
 | 
			
		||||
this.$=$$[$0]
 | 
			
		||||
break;
 | 
			
		||||
case 18:
 | 
			
		||||
this.$ = $$[$0-1]+ ":" + $$[$0] 
 | 
			
		||||
break;
 | 
			
		||||
case 19:
 | 
			
		||||
this.$ = $$[$0-1]+ ":"  + yy.count; yy.count = 0
 | 
			
		||||
break;
 | 
			
		||||
case 20:
 | 
			
		||||
yy.count = 0
 | 
			
		||||
break;
 | 
			
		||||
case 21:
 | 
			
		||||
 yy.count += 1 
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
table: [{3:1,4:[1,2]},{1:[3]},{5:[1,3],8:[1,4]},{6:5,7:$V0,9:6,12:$V1},{5:[1,8]},{7:[1,9]},o($V2,[2,7],{10:10,11:[1,11]}),o($V3,[2,6]),{6:12,7:$V0,9:6,12:$V1},{1:[2,1]},{7:[2,4],12:[1,15],13:13,14:14,15:[1,16],17:[1,17],19:[1,18],20:[1,19],21:[1,20]},o($V3,[2,5]),{7:[1,21]},o($V2,[2,8]),{12:[1,22]},o($V2,[2,10]),{12:[2,16],16:23,23:[1,24]},{18:[1,25]},{18:[1,26]},{18:[1,27]},{18:[1,30],22:28,24:[1,29]},{1:[2,2]},o($V2,[2,9]),{12:[2,11]},{12:[2,17]},{12:[2,12]},{12:[2,13]},{12:[2,14]},{12:[2,15]},{12:$V4,25:31,26:$V5},{12:$V4,25:33,26:$V5},{12:[2,18]},{12:$V4,25:34,26:$V5},{12:[2,19]},{12:[2,21]}],
 | 
			
		||||
defaultActions: {9:[2,1],21:[2,2],23:[2,11],24:[2,17],25:[2,12],26:[2,13],27:[2,14],28:[2,15],31:[2,18],33:[2,19],34:[2,21]},
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
            function lex() {
 | 
			
		||||
            var token;
 | 
			
		||||
            token = tstack.pop() || lexer.lex() || EOF;
 | 
			
		||||
            if (typeof token !== 'number') {
 | 
			
		||||
                if (token instanceof Array) {
 | 
			
		||||
                    tstack = token;
 | 
			
		||||
                    token = tstack.pop();
 | 
			
		||||
                }
 | 
			
		||||
                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 12;
 | 
			
		||||
break;
 | 
			
		||||
case 1:/* skip all whitespace */
 | 
			
		||||
break;
 | 
			
		||||
case 2:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 3:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 4:return 4;
 | 
			
		||||
break;
 | 
			
		||||
case 5:return 15;
 | 
			
		||||
break;
 | 
			
		||||
case 6:return 17;
 | 
			
		||||
break;
 | 
			
		||||
case 7:return 20;
 | 
			
		||||
break;
 | 
			
		||||
case 8:return 21;
 | 
			
		||||
break;
 | 
			
		||||
case 9:return 19;
 | 
			
		||||
break;
 | 
			
		||||
case 10:return 8;
 | 
			
		||||
break;
 | 
			
		||||
case 11:return 8;
 | 
			
		||||
break;
 | 
			
		||||
case 12:return 5;
 | 
			
		||||
break;
 | 
			
		||||
case 13:return 26
 | 
			
		||||
break;
 | 
			
		||||
case 14:this.begin("options");
 | 
			
		||||
break;
 | 
			
		||||
case 15:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 16:return 11;
 | 
			
		||||
break;
 | 
			
		||||
case 17:this.begin("string");
 | 
			
		||||
break;
 | 
			
		||||
case 18:this.popState();
 | 
			
		||||
break;
 | 
			
		||||
case 19:return 23;
 | 
			
		||||
break;
 | 
			
		||||
case 20:return 18;
 | 
			
		||||
break;
 | 
			
		||||
case 21:return 7;
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
rules: [/^(?:(\r?\n)+)/i,/^(?:\s+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:gitGraph\b)/i,/^(?:commit\b)/i,/^(?:branch\b)/i,/^(?:merge\b)/i,/^(?:reset\b)/i,/^(?:checkout\b)/i,/^(?:LR\b)/i,/^(?:BT\b)/i,/^(?::)/i,/^(?:\^)/i,/^(?:options\r?\n)/i,/^(?:end\r?\n)/i,/^(?:[^\n]+\r?\n)/i,/^(?:["])/i,/^(?:["])/i,/^(?:[^"]*)/i,/^(?:[a-zA-Z][a-zA-Z0-9_]+)/i,/^(?:$)/i],
 | 
			
		||||
conditions: {"options":{"rules":[15,16],"inclusive":false},"string":{"rules":[18,19],"inclusive":false},"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,17,20,21],"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));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -3,7 +3,7 @@
 | 
			
		||||
 */
 | 
			
		||||
import * as d3 from 'd3'
 | 
			
		||||
import db from './infoDb'
 | 
			
		||||
import infoParser from './parser/info.js'
 | 
			
		||||
import infoParser from './parser/info'
 | 
			
		||||
import { logger } from '../../logger'
 | 
			
		||||
 | 
			
		||||
const conf = {
 | 
			
		||||
 
 | 
			
		||||
@@ -1,621 +0,0 @@
 | 
			
		||||
/* 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=[6,9,10];
 | 
			
		||||
var parser = {trace: function trace () { },
 | 
			
		||||
yy: {},
 | 
			
		||||
symbols_: {"error":2,"start":3,"info":4,"document":5,"EOF":6,"line":7,"statement":8,"NL":9,"showInfo":10,"$accept":0,"$end":1},
 | 
			
		||||
terminals_: {2:"error",4:"info",6:"EOF",9:"NL",10:"showInfo"},
 | 
			
		||||
productions_: [0,[3,3],[5,0],[5,2],[7,1],[7,1],[8,1]],
 | 
			
		||||
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
 | 
			
		||||
/* this == yyval */
 | 
			
		||||
 | 
			
		||||
var $0 = $$.length - 1;
 | 
			
		||||
switch (yystate) {
 | 
			
		||||
case 1:
 | 
			
		||||
 return yy; 
 | 
			
		||||
break;
 | 
			
		||||
case 4:
 | 
			
		||||
 
 | 
			
		||||
break;
 | 
			
		||||
case 6:
 | 
			
		||||
 yy.setInfo(true);  
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
table: [{3:1,4:[1,2]},{1:[3]},o($V0,[2,2],{5:3}),{6:[1,4],7:5,8:6,9:[1,7],10:[1,8]},{1:[2,1]},o($V0,[2,3]),o($V0,[2,4]),o($V0,[2,5]),o($V0,[2,6])],
 | 
			
		||||
defaultActions: {4:[2,1]},
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
            function lex() {
 | 
			
		||||
            var token;
 | 
			
		||||
            token = tstack.pop() || lexer.lex() || EOF;
 | 
			
		||||
            if (typeof token !== 'number') {
 | 
			
		||||
                if (token instanceof Array) {
 | 
			
		||||
                    tstack = token;
 | 
			
		||||
                    token = tstack.pop();
 | 
			
		||||
                }
 | 
			
		||||
                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) {
 | 
			
		||||
	// Pre-lexer code can go here
 | 
			
		||||
 | 
			
		||||
var YYSTATE=YY_START;
 | 
			
		||||
switch($avoiding_name_collisions) {
 | 
			
		||||
case 0:return 4    ;
 | 
			
		||||
break;
 | 
			
		||||
case 1:return 9      ;
 | 
			
		||||
break;
 | 
			
		||||
case 2:return 'space';
 | 
			
		||||
break;
 | 
			
		||||
case 3:return 10;
 | 
			
		||||
break;
 | 
			
		||||
case 4:return 6     ;
 | 
			
		||||
break;
 | 
			
		||||
case 5:return 'TXT' ;
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
rules: [/^(?:info\b)/i,/^(?:[\s\n\r]+)/i,/^(?:[\s]+)/i,/^(?:showInfo\b)/i,/^(?:$)/i,/^(?:.)/i],
 | 
			
		||||
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));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -1,812 +0,0 @@
 | 
			
		||||
/* 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,12],$V7=[1,14],$V8=[1,15],$V9=[1,17],$Va=[1,18],$Vb=[1,19],$Vc=[1,20],$Vd=[1,21],$Ve=[1,22],$Vf=[1,24],$Vg=[1,25],$Vh=[1,4,5,10,15,16,18,20,21,22,23,24,26,28,29,30,41],$Vi=[1,33],$Vj=[4,5,10,15,16,18,20,21,22,23,24,26,30,41],$Vk=[4,5,10,15,16,18,20,21,22,23,24,26,29,30,41],$Vl=[4,5,10,15,16,18,20,21,22,23,24,26,28,30,41],$Vm=[39,40,41];
 | 
			
		||||
var parser = {trace: function trace () { },
 | 
			
		||||
yy: {},
 | 
			
		||||
symbols_: {"error":2,"start":3,"SPACE":4,"NL":5,"SD":6,"document":7,"line":8,"statement":9,"participant":10,"actor":11,"AS":12,"restOfLine":13,"signal":14,"activate":15,"deactivate":16,"note_statement":17,"title":18,"text2":19,"loop":20,"end":21,"rect":22,"opt":23,"alt":24,"else_sections":25,"par":26,"par_sections":27,"and":28,"else":29,"note":30,"placement":31,"over":32,"actor_pair":33,"spaceList":34,",":35,"left_of":36,"right_of":37,"signaltype":38,"+":39,"-":40,"ACTOR":41,"SOLID_OPEN_ARROW":42,"DOTTED_OPEN_ARROW":43,"SOLID_ARROW":44,"DOTTED_ARROW":45,"SOLID_CROSS":46,"DOTTED_CROSS":47,"TXT":48,"$accept":0,"$end":1},
 | 
			
		||||
terminals_: {2:"error",4:"SPACE",5:"NL",6:"SD",10:"participant",12:"AS",13:"restOfLine",15:"activate",16:"deactivate",18:"title",20:"loop",21:"end",22:"rect",23:"opt",24:"alt",26:"par",28:"and",29:"else",30:"note",32:"over",35:",",36:"left_of",37:"right_of",39:"+",40:"-",41:"ACTOR",42:"SOLID_OPEN_ARROW",43:"DOTTED_OPEN_ARROW",44:"SOLID_ARROW",45:"DOTTED_ARROW",46:"SOLID_CROSS",47:"DOTTED_CROSS",48:"TXT"},
 | 
			
		||||
productions_: [0,[3,2],[3,2],[3,2],[7,0],[7,2],[8,2],[8,1],[8,1],[9,5],[9,3],[9,2],[9,3],[9,3],[9,2],[9,3],[9,4],[9,4],[9,4],[9,4],[9,4],[27,1],[27,4],[25,1],[25,4],[17,4],[17,4],[34,2],[34,1],[33,3],[33,1],[31,1],[31,1],[14,5],[14,5],[14,4],[11,1],[38,1],[38,1],[38,1],[38,1],[38,1],[38,1],[19,1]],
 | 
			
		||||
performAction: function anonymous(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
 | 
			
		||||
/* this == yyval */
 | 
			
		||||
 | 
			
		||||
var $0 = $$.length - 1;
 | 
			
		||||
switch (yystate) {
 | 
			
		||||
case 3:
 | 
			
		||||
 yy.apply($$[$0]);return $$[$0]; 
 | 
			
		||||
break;
 | 
			
		||||
case 4:
 | 
			
		||||
 this.$ = [] 
 | 
			
		||||
break;
 | 
			
		||||
case 5:
 | 
			
		||||
$$[$0-1].push($$[$0]);this.$ = $$[$0-1]
 | 
			
		||||
break;
 | 
			
		||||
case 6: case 7:
 | 
			
		||||
 this.$ = $$[$0] 
 | 
			
		||||
break;
 | 
			
		||||
case 8:
 | 
			
		||||
 this.$=[];
 | 
			
		||||
break;
 | 
			
		||||
case 9:
 | 
			
		||||
$$[$0-3].description=$$[$0-1]; this.$=$$[$0-3];
 | 
			
		||||
break;
 | 
			
		||||
case 10:
 | 
			
		||||
this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 12:
 | 
			
		||||
this.$={type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]};
 | 
			
		||||
break;
 | 
			
		||||
case 13:
 | 
			
		||||
this.$={type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-1]};
 | 
			
		||||
break;
 | 
			
		||||
case 15:
 | 
			
		||||
this.$=[{type:'setTitle', text:$$[$0-1]}]
 | 
			
		||||
break;
 | 
			
		||||
case 16:
 | 
			
		||||
 | 
			
		||||
		$$[$0-1].unshift({type: 'loopStart', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_START});
 | 
			
		||||
		$$[$0-1].push({type: 'loopEnd', loopText:$$[$0-2], signalType: yy.LINETYPE.LOOP_END});
 | 
			
		||||
		this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 17:
 | 
			
		||||
 | 
			
		||||
		$$[$0-1].unshift({type: 'rectStart', color:$$[$0-2], signalType: yy.LINETYPE.RECT_START });
 | 
			
		||||
		$$[$0-1].push({type: 'rectEnd', color:$$[$0-2], signalType: yy.LINETYPE.RECT_END });
 | 
			
		||||
		this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 18:
 | 
			
		||||
 | 
			
		||||
		$$[$0-1].unshift({type: 'optStart', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_START});
 | 
			
		||||
		$$[$0-1].push({type: 'optEnd', optText:$$[$0-2], signalType: yy.LINETYPE.OPT_END});
 | 
			
		||||
		this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 19:
 | 
			
		||||
 | 
			
		||||
		// Alt start
 | 
			
		||||
		$$[$0-1].unshift({type: 'altStart', altText:$$[$0-2], signalType: yy.LINETYPE.ALT_START});
 | 
			
		||||
		// Content in alt is already in $$[$0-1]
 | 
			
		||||
		// End
 | 
			
		||||
		$$[$0-1].push({type: 'altEnd', signalType: yy.LINETYPE.ALT_END});
 | 
			
		||||
		this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 20:
 | 
			
		||||
 | 
			
		||||
		// Parallel start
 | 
			
		||||
		$$[$0-1].unshift({type: 'parStart', parText:$$[$0-2], signalType: yy.LINETYPE.PAR_START});
 | 
			
		||||
		// Content in par is already in $$[$0-1]
 | 
			
		||||
		// End
 | 
			
		||||
		$$[$0-1].push({type: 'parEnd', signalType: yy.LINETYPE.PAR_END});
 | 
			
		||||
		this.$=$$[$0-1];
 | 
			
		||||
break;
 | 
			
		||||
case 22:
 | 
			
		||||
 this.$ = $$[$0-3].concat([{type: 'and', parText:$$[$0-1], signalType: yy.LINETYPE.PAR_AND}, $$[$0]]); 
 | 
			
		||||
break;
 | 
			
		||||
case 24:
 | 
			
		||||
 this.$ = $$[$0-3].concat([{type: 'else', altText:$$[$0-1], signalType: yy.LINETYPE.ALT_ELSE}, $$[$0]]); 
 | 
			
		||||
break;
 | 
			
		||||
case 25:
 | 
			
		||||
 | 
			
		||||
		this.$ = [$$[$0-1], {type:'addNote', placement:$$[$0-2], actor:$$[$0-1].actor, text:$$[$0]}];
 | 
			
		||||
break;
 | 
			
		||||
case 26:
 | 
			
		||||
 | 
			
		||||
		// Coerce actor_pair into a [to, from, ...] array
 | 
			
		||||
		$$[$0-2] = [].concat($$[$0-1], $$[$0-1]).slice(0, 2);
 | 
			
		||||
		$$[$0-2][0] = $$[$0-2][0].actor;
 | 
			
		||||
		$$[$0-2][1] = $$[$0-2][1].actor;
 | 
			
		||||
		this.$ = [$$[$0-1], {type:'addNote', placement:yy.PLACEMENT.OVER, actor:$$[$0-2].slice(0, 2), text:$$[$0]}];
 | 
			
		||||
break;
 | 
			
		||||
case 29:
 | 
			
		||||
 this.$ = [$$[$0-2], $$[$0]]; 
 | 
			
		||||
break;
 | 
			
		||||
case 30:
 | 
			
		||||
 this.$ = $$[$0]; 
 | 
			
		||||
break;
 | 
			
		||||
case 31:
 | 
			
		||||
 this.$ = yy.PLACEMENT.LEFTOF; 
 | 
			
		||||
break;
 | 
			
		||||
case 32:
 | 
			
		||||
 this.$ = yy.PLACEMENT.RIGHTOF; 
 | 
			
		||||
break;
 | 
			
		||||
case 33:
 | 
			
		||||
 this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
 | 
			
		||||
	              {type: 'activeStart', signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0-1]}
 | 
			
		||||
	             ]
 | 
			
		||||
break;
 | 
			
		||||
case 34:
 | 
			
		||||
 this.$ = [$$[$0-4],$$[$0-1],{type: 'addMessage', from:$$[$0-4].actor, to:$$[$0-1].actor, signalType:$$[$0-3], msg:$$[$0]},
 | 
			
		||||
	             {type: 'activeEnd', signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0-4]}
 | 
			
		||||
	             ]
 | 
			
		||||
break;
 | 
			
		||||
case 35:
 | 
			
		||||
 this.$ = [$$[$0-3],$$[$0-1],{type: 'addMessage', from:$$[$0-3].actor, to:$$[$0-1].actor, signalType:$$[$0-2], msg:$$[$0]}]
 | 
			
		||||
break;
 | 
			
		||||
case 36:
 | 
			
		||||
this.$={type: 'addActor', actor:$$[$0]}
 | 
			
		||||
break;
 | 
			
		||||
case 37:
 | 
			
		||||
 this.$ = yy.LINETYPE.SOLID_OPEN; 
 | 
			
		||||
break;
 | 
			
		||||
case 38:
 | 
			
		||||
 this.$ = yy.LINETYPE.DOTTED_OPEN; 
 | 
			
		||||
break;
 | 
			
		||||
case 39:
 | 
			
		||||
 this.$ = yy.LINETYPE.SOLID; 
 | 
			
		||||
break;
 | 
			
		||||
case 40:
 | 
			
		||||
 this.$ = yy.LINETYPE.DOTTED; 
 | 
			
		||||
break;
 | 
			
		||||
case 41:
 | 
			
		||||
 this.$ = yy.LINETYPE.SOLID_CROSS; 
 | 
			
		||||
break;
 | 
			
		||||
case 42:
 | 
			
		||||
 this.$ = yy.LINETYPE.DOTTED_CROSS; 
 | 
			
		||||
break;
 | 
			
		||||
case 43:
 | 
			
		||||
this.$ = $$[$0].substring(1).trim().replace(/\\n/gm, "\n");
 | 
			
		||||
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,10,15,16,18,20,22,23,24,26,30,41],$V3,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,26:$Ve,30:$Vf,41:$Vg},o($Vh,[2,5]),{9:26,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,22:$Vb,23:$Vc,24:$Vd,26:$Ve,30:$Vf,41:$Vg},o($Vh,[2,7]),o($Vh,[2,8]),{11:27,41:$Vg},{5:[1,28]},{11:29,41:$Vg},{11:30,41:$Vg},{5:[1,31]},{19:32,48:$Vi},{13:[1,34]},{13:[1,35]},{13:[1,36]},{13:[1,37]},{13:[1,38]},{38:39,42:[1,40],43:[1,41],44:[1,42],45:[1,43],46:[1,44],47:[1,45]},{31:46,32:[1,47],36:[1,48],37:[1,49]},o([5,12,35,42,43,44,45,46,47,48],[2,36]),o($Vh,[2,6]),{5:[1,51],12:[1,50]},o($Vh,[2,11]),{5:[1,52]},{5:[1,53]},o($Vh,[2,14]),{5:[1,54]},{5:[2,43]},o($Vj,$V3,{7:55}),o($Vj,$V3,{7:56}),o($Vj,$V3,{7:57}),o($Vk,$V3,{25:58,7:59}),o($Vl,$V3,{27:60,7:61}),{11:64,39:[1,62],40:[1,63],41:$Vg},o($Vm,[2,37]),o($Vm,[2,38]),o($Vm,[2,39]),o($Vm,[2,40]),o($Vm,[2,41]),o($Vm,[2,42]),{11:65,41:$Vg},{11:67,33:66,41:$Vg},{41:[2,31]},{41:[2,32]},{13:[1,68]},o($Vh,[2,10]),o($Vh,[2,12]),o($Vh,[2,13]),o($Vh,[2,15]),{4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,69],22:$Vb,23:$Vc,24:$Vd,26:$Ve,30:$Vf,41:$Vg},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,70],22:$Vb,23:$Vc,24:$Vd,26:$Ve,30:$Vf,41:$Vg},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[1,71],22:$Vb,23:$Vc,24:$Vd,26:$Ve,30:$Vf,41:$Vg},{21:[1,72]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,23],22:$Vb,23:$Vc,24:$Vd,26:$Ve,29:[1,73],30:$Vf,41:$Vg},{21:[1,74]},{4:$V4,5:$V5,8:8,9:10,10:$V6,11:23,14:13,15:$V7,16:$V8,17:16,18:$V9,20:$Va,21:[2,21],22:$Vb,23:$Vc,24:$Vd,26:$Ve,28:[1,75],30:$Vf,41:$Vg},{11:76,41:$Vg},{11:77,41:$Vg},{19:78,48:$Vi},{19:79,48:$Vi},{19:80,48:$Vi},{35:[1,81],48:[2,30]},{5:[1,82]},o($Vh,[2,16]),o($Vh,[2,17]),o($Vh,[2,18]),o($Vh,[2,19]),{13:[1,83]},o($Vh,[2,20]),{13:[1,84]},{19:85,48:$Vi},{19:86,48:$Vi},{5:[2,35]},{5:[2,25]},{5:[2,26]},{11:87,41:$Vg},o($Vh,[2,9]),o($Vk,$V3,{7:59,25:88}),o($Vl,$V3,{7:61,27:89}),{5:[2,33]},{5:[2,34]},{48:[2,29]},{21:[2,24]},{21:[2,22]}],
 | 
			
		||||
defaultActions: {5:[2,1],6:[2,2],33:[2,43],48:[2,31],49:[2,32],78:[2,35],79:[2,25],80:[2,26],85:[2,33],86:[2,34],87:[2,29],88:[2,24],89:[2,22]},
 | 
			
		||||
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;
 | 
			
		||||
    }
 | 
			
		||||
            function lex() {
 | 
			
		||||
            var token;
 | 
			
		||||
            token = tstack.pop() || lexer.lex() || EOF;
 | 
			
		||||
            if (typeof token !== 'number') {
 | 
			
		||||
                if (token instanceof Array) {
 | 
			
		||||
                    tstack = token;
 | 
			
		||||
                    token = tstack.pop();
 | 
			
		||||
                }
 | 
			
		||||
                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 5;
 | 
			
		||||
break;
 | 
			
		||||
case 1:/* skip all whitespace */
 | 
			
		||||
break;
 | 
			
		||||
case 2:/* skip same-line whitespace */
 | 
			
		||||
break;
 | 
			
		||||
case 3:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 4:/* skip comments */
 | 
			
		||||
break;
 | 
			
		||||
case 5: this.begin('ID'); return 10; 
 | 
			
		||||
break;
 | 
			
		||||
case 6: yy_.yytext = yy_.yytext.trim(); this.begin('ALIAS'); return 41; 
 | 
			
		||||
break;
 | 
			
		||||
case 7: this.popState(); this.popState(); this.begin('LINE'); return 12; 
 | 
			
		||||
break;
 | 
			
		||||
case 8: this.popState(); this.popState(); return 5; 
 | 
			
		||||
break;
 | 
			
		||||
case 9: this.begin('LINE'); return 20; 
 | 
			
		||||
break;
 | 
			
		||||
case 10: this.begin('LINE'); return 22; 
 | 
			
		||||
break;
 | 
			
		||||
case 11: this.begin('LINE'); return 23; 
 | 
			
		||||
break;
 | 
			
		||||
case 12: this.begin('LINE'); return 24; 
 | 
			
		||||
break;
 | 
			
		||||
case 13: this.begin('LINE'); return 29; 
 | 
			
		||||
break;
 | 
			
		||||
case 14: this.begin('LINE'); return 26; 
 | 
			
		||||
break;
 | 
			
		||||
case 15: this.begin('LINE'); return 28; 
 | 
			
		||||
break;
 | 
			
		||||
case 16: this.popState(); return 13; 
 | 
			
		||||
break;
 | 
			
		||||
case 17:return 21;
 | 
			
		||||
break;
 | 
			
		||||
case 18:return 36;
 | 
			
		||||
break;
 | 
			
		||||
case 19:return 37;
 | 
			
		||||
break;
 | 
			
		||||
case 20:return 32;
 | 
			
		||||
break;
 | 
			
		||||
case 21:return 30;
 | 
			
		||||
break;
 | 
			
		||||
case 22: this.begin('ID'); return 15; 
 | 
			
		||||
break;
 | 
			
		||||
case 23: this.begin('ID'); return 16; 
 | 
			
		||||
break;
 | 
			
		||||
case 24:return 18;
 | 
			
		||||
break;
 | 
			
		||||
case 25:return 6;
 | 
			
		||||
break;
 | 
			
		||||
case 26:return 35;
 | 
			
		||||
break;
 | 
			
		||||
case 27:return 5;
 | 
			
		||||
break;
 | 
			
		||||
case 28: yy_.yytext = yy_.yytext.trim(); return 41; 
 | 
			
		||||
break;
 | 
			
		||||
case 29:return 44;
 | 
			
		||||
break;
 | 
			
		||||
case 30:return 45;
 | 
			
		||||
break;
 | 
			
		||||
case 31:return 42;
 | 
			
		||||
break;
 | 
			
		||||
case 32:return 43;
 | 
			
		||||
break;
 | 
			
		||||
case 33:return 46;
 | 
			
		||||
break;
 | 
			
		||||
case 34:return 47;
 | 
			
		||||
break;
 | 
			
		||||
case 35:return 48;
 | 
			
		||||
break;
 | 
			
		||||
case 36:return 39;
 | 
			
		||||
break;
 | 
			
		||||
case 37:return 40;
 | 
			
		||||
break;
 | 
			
		||||
case 38:return 5;
 | 
			
		||||
break;
 | 
			
		||||
case 39:return 'INVALID';
 | 
			
		||||
break;
 | 
			
		||||
}
 | 
			
		||||
},
 | 
			
		||||
rules: [/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%[^\n]*)/i,/^(?:participant\b)/i,/^(?:[^\->:\n,;]+?(?=((?!\n)\s)+as(?!\n)\s|[#\n;]|$))/i,/^(?:as\b)/i,/^(?:(?:))/i,/^(?:loop\b)/i,/^(?:rect\b)/i,/^(?:opt\b)/i,/^(?:alt\b)/i,/^(?:else\b)/i,/^(?:par\b)/i,/^(?:and\b)/i,/^(?:[^#\n;]*)/i,/^(?:end\b)/i,/^(?:left of\b)/i,/^(?:right of\b)/i,/^(?:over\b)/i,/^(?:note\b)/i,/^(?:activate\b)/i,/^(?:deactivate\b)/i,/^(?:title\b)/i,/^(?:sequenceDiagram\b)/i,/^(?:,)/i,/^(?:;)/i,/^(?:[^\+\->:\n,;]+)/i,/^(?:->>)/i,/^(?:-->>)/i,/^(?:->)/i,/^(?:-->)/i,/^(?:-[x])/i,/^(?:--[x])/i,/^(?::[^#\n;]+)/i,/^(?:\+)/i,/^(?:-)/i,/^(?:$)/i,/^(?:.)/i],
 | 
			
		||||
conditions: {"LINE":{"rules":[2,3,16],"inclusive":false},"ALIAS":{"rules":[2,3,7,8],"inclusive":false},"ID":{"rules":[2,3,6],"inclusive":false},"INITIAL":{"rules":[0,1,3,4,5,9,10,11,12,13,14,15,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39],"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));
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
@@ -6,6 +6,15 @@ const amdRule = {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const jisonRule = {
 | 
			
		||||
  test: /\.jison$/,
 | 
			
		||||
  use: {
 | 
			
		||||
    loader: path.resolve(__dirname, './jisonLoader'),
 | 
			
		||||
    options: {
 | 
			
		||||
      'token-stack': true
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
const jsRule = {
 | 
			
		||||
  test: /\.js$/,
 | 
			
		||||
  include: [
 | 
			
		||||
@@ -33,6 +42,9 @@ export const jsConfig = () => {
 | 
			
		||||
    entry: {
 | 
			
		||||
      mermaid: './src/mermaid.js'
 | 
			
		||||
    },
 | 
			
		||||
    resolve: {
 | 
			
		||||
      extensions: ['.wasm', '.mjs', '.js', '.json', '.jison']
 | 
			
		||||
    },
 | 
			
		||||
    node: {
 | 
			
		||||
      fs: 'empty' // jison generated code requires 'fs'
 | 
			
		||||
    },
 | 
			
		||||
@@ -44,7 +56,7 @@ export const jsConfig = () => {
 | 
			
		||||
      libraryExport: 'default'
 | 
			
		||||
    },
 | 
			
		||||
    module: {
 | 
			
		||||
      rules: [amdRule, jsRule, scssRule]
 | 
			
		||||
      rules: [amdRule, jsRule, scssRule, jisonRule]
 | 
			
		||||
    },
 | 
			
		||||
    devtool: 'source-map'
 | 
			
		||||
  }
 | 
			
		||||
 
 | 
			
		||||
@@ -8,6 +8,16 @@ const jsRule = {
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const jisonRule = {
 | 
			
		||||
  test: /\.jison$/,
 | 
			
		||||
  use: {
 | 
			
		||||
    loader: path.resolve(__dirname, './jisonLoader'),
 | 
			
		||||
    options: {
 | 
			
		||||
      'token-stack': true
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const amdRule = {
 | 
			
		||||
  parser: {
 | 
			
		||||
    amd: false // https://github.com/lodash/lodash/issues/3052
 | 
			
		||||
@@ -31,6 +41,9 @@ module.exports = {
 | 
			
		||||
    e2e: './e2e/platform/viewer.js',
 | 
			
		||||
    'bundle-test': './e2e/platform/bundle-test.js'
 | 
			
		||||
  },
 | 
			
		||||
  resolve: {
 | 
			
		||||
    extensions: ['.wasm', '.mjs', '.js', '.json', '.jison']
 | 
			
		||||
  },
 | 
			
		||||
  node: {
 | 
			
		||||
    fs: 'empty' // jison generated code requires 'fs'
 | 
			
		||||
  },
 | 
			
		||||
@@ -50,7 +63,7 @@ module.exports = {
 | 
			
		||||
    port: 9000
 | 
			
		||||
  },
 | 
			
		||||
  module: {
 | 
			
		||||
    rules: [amdRule, jsRule, scssRule]
 | 
			
		||||
    rules: [amdRule, jsRule, scssRule, jisonRule]
 | 
			
		||||
  },
 | 
			
		||||
  externals: {
 | 
			
		||||
    mermaid: 'mermaid'
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user