@ts-jison/ebnf-parser
Version:
A parser for BNF and EBNF grammars used by jison
118 lines (108 loc) • 3.72 kB
text/typescript
import { JisonParser, JisonParserApi, StateType, SymbolsType, TerminalsType, ProductionsType } from '@ts-jison/parser';
/**
* parser generated by @ts-jison/parser-generator 0.3.0
* @returns Parser implementing JisonParserApi and a Lexer implementing JisonLexerApi.
*/
export class EbnfParser extends JisonParser implements JisonParserApi {
$?: any;
symbols_: SymbolsType = {"error":2,"production":3,"handle":4,"EOF":5,"handle_list":6,"|":7,"expression_suffix":8,"expression":9,"suffix":10,"ALIAS":11,"symbol":12,"(":13,")":14,"*":15,"?":16,"+":17,"$accept":0,"$end":1};
terminals_: TerminalsType = {2:"error",5:"EOF",7:"|",11:"ALIAS",12:"symbol",13:"(",14:")",15:"*",16:"?",17:"+"};
productions_: ProductionsType = [0,[3,2],[6,1],[6,3],[4,0],[4,2],[8,3],[8,2],[9,1],[9,3],[10,0],[10,1],[10,1],[10,1]];
table: Array<StateType>;
defaultActions: {[key:number]: any} = {3:[2,1]};
constructor (yy = {}, lexer = new EbnfLexer(yy)) {
super(yy, lexer);
// shorten static method to just `o` for terse STATE_TABLE
const $V0=[2,4],$V1=[1,6],$V2=[1,7],$V3=[5,7,12,13,14],$V4=[5,7,11,12,13,14],$V5=[5,7,11,12,13,14,15,16,17],$V6=[7,12,13,14],$V7=[7,14];
const o = JisonParser.expandParseTable;
this.table = [o([5,12,13],$V0,{3:1,4:2}),{1:[3]},{5:[1,3],8:4,9:5,12:$V1,13:$V2},{1:[2,1]},o($V3,[2,5]),o($V4,[2,10],{10:8,15:[1,9],16:[1,10],17:[1,11]}),o($V5,[2,8]),o($V6,$V0,{6:12,4:13}),o($V3,[2,7],{11:[1,14]}),o($V4,[2,11]),o($V4,[2,12]),o($V4,[2,13]),{7:[1,16],14:[1,15]},o($V7,[2,2],{8:4,9:5,12:$V1,13:$V2}),o($V3,[2,6]),o($V5,[2,9]),o($V6,$V0,{4:17}),o($V7,[2,3],{8:4,9:5,12:$V1,13:$V2})];
}
performAction (yytext:string, yyleng:number, yylineno:number, yy:any, yystate:number /* action[1] */, $$:any /* vstack */, _$:any /* lstack */): any {
/* this == yyval */
var $0 = $$.length - 1;
switch (yystate) {
case 1:
return $$[$0-1];
break;
case 2:
this.$ = [$$[$0]];
break;
case 3:
$$[$0-2].push($$[$0]);
break;
case 4:
this.$ = [];
break;
case 5:
$$[$0-1].push($$[$0]);
break;
case 6:
this.$ = ['xalias', $$[$0-1], $$[$0-2], $$[$0]];
break;
case 7:
if ($$[$0]) this.$ = [$$[$0], $$[$0-1]]; else this.$ = $$[$0-1];
break;
case 8:
this.$ = ['symbol', $$[$0]];
break;
case 9:
this.$ = ['()', $$[$0-1]];
break;
}
}
}
/* generated by @ts-jison/lexer-generator 0.3.0 */
import { JisonLexer, JisonLexerApi } from '@ts-jison/lexer';
export class EbnfLexer extends JisonLexer implements JisonLexerApi {
options: any = {"moduleName":"Ebnf"};
constructor (yy = {}) {
super(yy);
}
rules: RegExp[] = [
/^(?:\s+)/,
/^(?:[a-zA-Z][a-zA-Z0-9_-]*)/,
/^(?:\[[a-zA-Z][a-zA-Z0-9_-]*\])/,
/^(?:'[^']*')/,
/^(?:\.)/,
/^(?:bar\b)/,
/^(?:\()/,
/^(?:\))/,
/^(?:\*)/,
/^(?:\?)/,
/^(?:\|)/,
/^(?:\+)/,
/^(?:$)/
];
conditions: any = {"INITIAL":{"rules":[0,1,2,3,4,5,6,7,8,9,10,11,12],"inclusive":true}}
performAction (yy:any,yy_:any,$avoiding_name_collisions:any,YY_START:any): any {
var YYSTATE=YY_START;
switch($avoiding_name_collisions) {
case 0:/* skip whitespace */
break;
case 1:return 12;
break;
case 2:yy_.yytext = yy_.yytext.substr(1, yy_.yyleng-2); return 11;
break;
case 3:return 12;
break;
case 4:return 12;
break;
case 5:return 'bar';
break;
case 6:return 13;
break;
case 7:return 14;
break;
case 8:return 15;
break;
case 9:return 16;
break;
case 10:return 7;
break;
case 11:return 17;
break;
case 12:return 5;
break;
}
}
}