@ts-jison/ebnf-parser
Version:
A parser for BNF and EBNF grammars used by jison
395 lines • 17 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.BnfLexer = exports.BnfParser = void 0;
const parser_1 = require("@ts-jison/parser");
/**
* parser generated by @ts-jison/parser-generator 0.3.0
* @returns Parser implementing JisonParserApi and a Lexer implementing JisonLexerApi.
*/
// import {transform} from './ebnf-parser';
const transform = require('../ebnf-transform').transform;
let ebnf = false;
// transform ebnf to bnf if necessary
function extend(json, grammar) {
json.bnf = ebnf ? transform(grammar) : grammar;
return json;
}
class BnfParser extends parser_1.JisonParser {
constructor(yy = {}, lexer = new BnfLexer(yy)) {
super(yy, lexer);
this.symbols_ = { "error": 2, "spec": 3, "declaration_list": 4, "%%": 5, "grammar": 6, "optional_end_block": 7, "EOF": 8, "CODE": 9, "declaration": 10, "START": 11, "id": 12, "LEX_BLOCK": 13, "operator": 14, "ACTION": 15, "parse_param": 16, "options": 17, "OPTIONS": 18, "token_list": 19, "PARSE_PARAM": 20, "associativity": 21, "LEFT": 22, "RIGHT": 23, "NONASSOC": 24, "symbol": 25, "production_list": 26, "production": 27, ":": 28, "handle_list": 29, ";": 30, "|": 31, "handle_action": 32, "handle": 33, "prec": 34, "action": 35, "expression_suffix": 36, "handle_sublist": 37, "expression": 38, "suffix": 39, "ALIAS": 40, "ID": 41, "STRING": 42, "(": 43, ")": 44, "*": 45, "?": 46, "+": 47, "PREC": 48, "{": 49, "action_body": 50, "}": 51, "ARROW_ACTION": 52, "action_comments_body": 53, "ACTION_BODY": 54, "$accept": 0, "$end": 1 };
this.terminals_ = { 2: "error", 5: "%%", 8: "EOF", 9: "CODE", 11: "START", 13: "LEX_BLOCK", 15: "ACTION", 18: "OPTIONS", 20: "PARSE_PARAM", 22: "LEFT", 23: "RIGHT", 24: "NONASSOC", 28: ":", 30: ";", 31: "|", 40: "ALIAS", 41: "ID", 42: "STRING", 43: "(", 44: ")", 45: "*", 46: "?", 47: "+", 48: "PREC", 49: "{", 51: "}", 52: "ARROW_ACTION", 54: "ACTION_BODY" };
this.productions_ = [0, [3, 5], [3, 6], [7, 0], [7, 1], [4, 2], [4, 0], [10, 2], [10, 1], [10, 1], [10, 1], [10, 1], [10, 1], [17, 2], [16, 2], [14, 2], [21, 1], [21, 1], [21, 1], [19, 2], [19, 1], [6, 1], [26, 2], [26, 1], [27, 4], [29, 3], [29, 1], [32, 3], [33, 2], [33, 0], [37, 3], [37, 1], [36, 3], [36, 2], [38, 1], [38, 1], [38, 3], [39, 0], [39, 1], [39, 1], [39, 1], [34, 2], [34, 0], [25, 1], [25, 1], [12, 1], [35, 3], [35, 1], [35, 1], [35, 0], [50, 0], [50, 1], [50, 5], [50, 4], [53, 1], [53, 2]];
this.defaultActions = { 34: [2, 1], 39: [2, 2] };
// shorten static method to just `o` for terse STATE_TABLE
const $V0 = [5, 11, 13, 15, 18, 20, 22, 23, 24], $V1 = [1, 21], $V2 = [1, 26], $V3 = [41, 42], $V4 = [5, 8, 41], $V5 = [5, 11, 13, 15, 18, 20, 22, 23, 24, 41, 42], $V6 = [5, 11, 13, 15, 18, 20, 22, 23, 24, 30, 31, 41, 42, 49, 52], $V7 = [15, 30, 31, 41, 42, 43, 48, 49, 52], $V8 = [2, 29], $V9 = [30, 31], $Va = [15, 30, 31, 49, 52], $Vb = [1, 46], $Vc = [1, 47], $Vd = [1, 48], $Ve = [15, 30, 31, 41, 42, 43, 44, 48, 49, 52], $Vf = [15, 30, 31, 40, 41, 42, 43, 44, 48, 49, 52], $Vg = [15, 30, 31, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 52], $Vh = [31, 41, 42, 43, 44], $Vi = [49, 51], $Vj = [2, 50], $Vk = [1, 63], $Vl = [31, 44], $Vm = [1, 68], $Vn = [1, 69], $Vo = [49, 51, 54];
const o = parser_1.JisonParser.expandParseTable;
this.table = [o($V0, [2, 6], { 3: 1, 4: 2 }), { 1: [3] }, { 5: [1, 3], 10: 4, 11: [1, 5], 13: [1, 6], 14: 7, 15: [1, 8], 16: 9, 17: 10, 18: [1, 13], 20: [1, 12], 21: 11, 22: [1, 14], 23: [1, 15], 24: [1, 16] }, { 6: 17, 12: 20, 26: 18, 27: 19, 41: $V1 }, o($V0, [2, 5]), { 12: 22, 41: $V1 }, o($V0, [2, 8]), o($V0, [2, 9]), o($V0, [2, 10]), o($V0, [2, 11]), o($V0, [2, 12]), { 12: 25, 19: 23, 25: 24, 41: $V1, 42: $V2 }, { 12: 25, 19: 27, 25: 24, 41: $V1, 42: $V2 }, { 12: 25, 19: 28, 25: 24, 41: $V1, 42: $V2 }, o($V3, [2, 16]), o($V3, [2, 17]), o($V3, [2, 18]), { 5: [1, 30], 7: 29, 8: [2, 3] }, o([5, 8], [2, 21], { 12: 20, 27: 31, 41: $V1 }), o($V4, [2, 23]), { 28: [1, 32] }, o([5, 11, 13, 15, 18, 20, 22, 23, 24, 28, 30, 31, 41, 42, 49, 52], [2, 45]), o($V0, [2, 7]), o($V0, [2, 15], { 12: 25, 25: 33, 41: $V1, 42: $V2 }), o($V5, [2, 20]), o($V6, [2, 43]), o($V6, [2, 44]), o($V0, [2, 14], { 12: 25, 25: 33, 41: $V1, 42: $V2 }), o($V0, [2, 13], { 12: 25, 25: 33, 41: $V1, 42: $V2 }), { 8: [1, 34] }, { 8: [2, 4], 9: [1, 35] }, o($V4, [2, 22]), o($V7, $V8, { 29: 36, 32: 37, 33: 38 }), o($V5, [2, 19]), { 1: [2, 1] }, { 8: [1, 39] }, { 30: [1, 40], 31: [1, 41] }, o($V9, [2, 26]), o($Va, [2, 42], { 34: 42, 36: 43, 38: 45, 41: $Vb, 42: $Vc, 43: $Vd, 48: [1, 44] }), { 1: [2, 2] }, o($V4, [2, 24]), o($V7, $V8, { 33: 38, 32: 49 }), o($V9, [2, 49], { 35: 50, 15: [1, 52], 49: [1, 51], 52: [1, 53] }), o($Ve, [2, 28]), { 12: 25, 25: 54, 41: $V1, 42: $V2 }, o($Vf, [2, 37], { 39: 55, 45: [1, 56], 46: [1, 57], 47: [1, 58] }), o($Vg, [2, 34]), o($Vg, [2, 35]), o($Vh, $V8, { 37: 59, 33: 60 }), o($V9, [2, 25]), o($V9, [2, 27]), o($Vi, $Vj, { 50: 61, 53: 62, 54: $Vk }), o($V9, [2, 47]), o($V9, [2, 48]), o($Va, [2, 41]), o($Ve, [2, 33], { 40: [1, 64] }), o($Vf, [2, 38]), o($Vf, [2, 39]), o($Vf, [2, 40]), { 31: [1, 66], 44: [1, 65] }, o($Vl, [2, 31], { 36: 43, 38: 45, 41: $Vb, 42: $Vc, 43: $Vd }), { 49: $Vm, 51: [1, 67] }, o($Vi, [2, 51], { 54: $Vn }), o($Vo, [2, 54]), o($Ve, [2, 32]), o($Vg, [2, 36]), o($Vh, $V8, { 33: 70 }), o($V9, [2, 46]), o($Vi, $Vj, { 53: 62, 50: 71, 54: $Vk }), o($Vo, [2, 55]), o($Vl, [2, 30], { 36: 43, 38: 45, 41: $Vb, 42: $Vc, 43: $Vd }), { 49: $Vm, 51: [1, 72] }, o($Vi, [2, 53], { 53: 73, 54: $Vk }), o($Vi, [2, 52], { 54: $Vn })];
}
performAction(yytext, yyleng, yylineno, yy, yystate /* action[1] */, $$ /* vstack */, _$ /* lstack */) {
/* this == yyval */
var $0 = $$.length - 1;
switch (yystate) {
case 1:
this.$ = $$[$0 - 4];
return extend(this.$, $$[$0 - 2]);
break;
case 2:
this.$ = $$[$0 - 5];
yy.addDeclaration(this.$, { include: $$[$0 - 1] });
return extend(this.$, $$[$0 - 3]);
break;
case 5:
this.$ = $$[$0 - 1];
yy.addDeclaration(this.$, $$[$0]);
break;
case 6:
this.$ = {};
break;
case 7:
this.$ = { start: $$[$0] };
break;
case 8:
this.$ = { lex: $$[$0] };
break;
case 9:
this.$ = { operator: $$[$0] };
break;
case 10:
this.$ = { include: $$[$0] };
break;
case 11:
this.$ = { parseParam: $$[$0] };
break;
case 12:
this.$ = { options: $$[$0] };
break;
case 13:
case 14:
case 21:
case 43:
case 47:
case 51:
this.$ = $$[$0];
break;
case 15:
this.$ = [$$[$0 - 1]];
this.$.push.apply(this.$, $$[$0]);
break;
case 16:
this.$ = 'left';
break;
case 17:
this.$ = 'right';
break;
case 18:
this.$ = 'nonassoc';
break;
case 19:
this.$ = $$[$0 - 1];
this.$.push($$[$0]);
break;
case 20:
case 26:
this.$ = [$$[$0]];
break;
case 22:
this.$ = $$[$0 - 1];
if ($$[$0][0] in this.$)
this.$[$$[$0][0]] = this.$[$$[$0][0]].concat($$[$0][1]);
else
this.$[$$[$0][0]] = $$[$0][1];
break;
case 23:
this.$ = {};
this.$[$$[$0][0]] = $$[$0][1];
break;
case 24:
this.$ = [$$[$0 - 3], $$[$0 - 1]];
break;
case 25:
this.$ = $$[$0 - 2];
this.$.push($$[$0]);
break;
case 27:
this.$ = [($$[$0 - 2].length ? $$[$0 - 2].join(' ') : '')];
if ($$[$0])
this.$.push($$[$0]);
if ($$[$0 - 1])
this.$.push($$[$0 - 1]);
if (this.$.length === 1)
this.$ = this.$[0];
break;
case 28:
this.$ = $$[$0 - 1];
this.$.push($$[$0]);
break;
case 29:
this.$ = [];
break;
case 30:
this.$ = $$[$0 - 2];
this.$.push($$[$0].join(' '));
break;
case 31:
this.$ = [$$[$0].join(' ')];
break;
case 32:
this.$ = $$[$0 - 2] + $$[$0 - 1] + "[" + $$[$0] + "]";
break;
case 33:
this.$ = $$[$0 - 1] + $$[$0];
break;
case 34:
this.$ = $$[$0];
break;
case 35:
this.$ = ebnf ? "'" + $$[$0] + "'" : $$[$0];
break;
case 36:
this.$ = '(' + $$[$0 - 1].join(' | ') + ')';
break;
case 37:
this.$ = '';
break;
case 41:
this.$ = { prec: $$[$0] };
break;
case 42:
this.$ = null;
break;
case 44:
case 45:
this.$ = yytext;
break;
case 46:
this.$ = $$[$0 - 1];
break;
case 48:
this.$ = '$$ =' + $$[$0] + ';';
break;
case 49:
case 50:
this.$ = '';
break;
case 52:
this.$ = $$[$0 - 4] + $$[$0 - 3] + $$[$0 - 2] + $$[$0 - 1] + $$[$0];
break;
case 53:
this.$ = $$[$0 - 3] + $$[$0 - 2] + $$[$0 - 1] + $$[$0];
break;
case 54:
this.$ = yytext;
break;
case 55:
this.$ = $$[$0 - 1] + $$[$0];
break;
}
}
}
exports.BnfParser = BnfParser;
/* generated by @ts-jison/lexer-generator 0.3.0 */
const lexer_1 = require("@ts-jison/lexer");
class BnfLexer extends lexer_1.JisonLexer {
constructor(yy = {}) {
super(yy);
this.options = { "moduleName": "Bnf" };
this.rules = [
/^(?:%%)/,
/^(?:\()/,
/^(?:\))/,
/^(?:\*)/,
/^(?:\?)/,
/^(?:\+)/,
/^(?:\s+)/,
/^(?:\/\/.*)/,
/^(?:\/\*(?:.|\n|\r)*?\*\/)/,
/^(?:\[[a-zA-Z][a-zA-Z0-9_-]*\])/,
/^(?:[a-zA-Z][a-zA-Z0-9_-]*)/,
/^(?:"[^"]+")/,
/^(?:'[^']+')/,
/^(?::)/,
/^(?:;)/,
/^(?:\|)/,
/^(?:%%)/,
/^(?:%ebnf\b)/,
/^(?:%prec\b)/,
/^(?:%start\b)/,
/^(?:%left\b)/,
/^(?:%right\b)/,
/^(?:%nonassoc\b)/,
/^(?:%parse-param\b)/,
/^(?:%options\b)/,
/^(?:[%]lex[\w\W]*?[/]lex\b)/,
/^(?:%[a-zA-Z]+[^\r\n]*)/,
/^(?:<[a-zA-Z]*>)/,
/^(?:\{\{[\w\W]*?\}\})/,
/^(?:%\{(?:.|\r|\n)*?%\})/,
/^(?:\{)/,
/^(?:->.*)/,
/^(?:.)/,
/^(?:$)/,
/^(?:\/\*(?:.|\n|\r)*?\*\/)/,
/^(?:\/\/.*)/,
/^(?:\/[^ /]*?['"{}'][^ ]*?\/)/,
/^(?:"(?:\\\\|\\"|[^"])*")/,
/^(?:'(?:\\\\|\\'|[^'])*')/,
/^(?:[/"'][^{}/"']+)/,
/^(?:[^{}/"']+)/,
/^(?:\{)/,
/^(?:\})/,
/^(?:(?:.|\n|\r)+)/
];
this.conditions = { "bnf": { "rules": [0, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "inclusive": true }, "ebnf": { "rules": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "inclusive": true }, "action": { "rules": [33, 34, 35, 36, 37, 38, 39, 40, 41, 42], "inclusive": false }, "code": { "rules": [33, 43], "inclusive": false }, "INITIAL": { "rules": [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33], "inclusive": true } };
}
performAction(yy, yy_, $avoiding_name_collisions, YY_START) {
var YYSTATE = YY_START;
switch ($avoiding_name_collisions) {
case 0:
this.pushState('code');
return 5;
break;
case 1:
return 43;
break;
case 2:
return 44;
break;
case 3:
return 45;
break;
case 4:
return 46;
break;
case 5:
return 47;
break;
case 6: /* skip whitespace */
break;
case 7: /* skip comment */
break;
case 8: /* skip comment */
break;
case 9:
yy_.yytext = yy_.yytext.substr(1, yy_.yyleng - 2);
return 40;
break;
case 10:
return 41;
break;
case 11:
yy_.yytext = yy_.yytext.substr(1, yy_.yyleng - 2);
return 42;
break;
case 12:
yy_.yytext = yy_.yytext.substr(1, yy_.yyleng - 2);
return 42;
break;
case 13:
return 28;
break;
case 14:
return 30;
break;
case 15:
return 31;
break;
case 16:
this.pushState(ebnf ? 'ebnf' : 'bnf');
return 5;
break;
case 17:
if (!yy.options)
yy.options = {};
ebnf = yy.options.ebnf = true;
break;
case 18:
return 48;
break;
case 19:
return 11;
break;
case 20:
return 22;
break;
case 21:
return 23;
break;
case 22:
return 24;
break;
case 23:
return 20;
break;
case 24:
return 18;
break;
case 25:
return 13;
break;
case 26: /* ignore unrecognized decl */
break;
case 27: /* ignore type */
break;
case 28:
yy_.yytext = yy_.yytext.substr(2, yy_.yyleng - 4);
return 15;
break;
case 29:
yy_.yytext = yy_.yytext.substr(2, yy_.yytext.length - 4);
return 15;
break;
case 30:
yy.depth = 0;
this.pushState('action');
return 49;
break;
case 31:
yy_.yytext = yy_.yytext.substr(2, yy_.yyleng - 2);
return 52;
break;
case 32: /* ignore bad characters */
break;
case 33:
return 8;
break;
case 34:
return 54;
break;
case 35:
return 54;
break;
case 36:
return 54; // regexp with braces or quotes (and no spaces)
break;
case 37:
return 54;
break;
case 38:
return 54;
break;
case 39:
return 54;
break;
case 40:
return 54;
break;
case 41:
yy.depth++;
return 49;
break;
case 42:
if (yy.depth == 0)
this.begin(ebnf ? 'ebnf' : 'bnf');
else
yy.depth--;
return 51;
break;
case 43:
return 9;
break;
}
}
}
exports.BnfLexer = BnfLexer;
//# sourceMappingURL=bnf-parser.js.map