UNPKG

@parser-generator/core

Version:

A Parser Generator that supports LL,SLR,LR1,LALR

103 lines 3.01 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const fs_1 = __importDefault(require("fs")); const shim_1 = require("@light0x00/shim"); const definition_1 = require("@parser-generator/definition"); exports.getMock = (fullpath) => fs_1.default.readFileSync(fullpath, "utf8"); class SimpleGrammar { constructor(rawGrammar) { this._prodIdCounter = 0; this._nonTerminals = []; this._productions = []; this._prodMap = new Map(); this.construct(rawGrammar); } beforeConstruct(rawGrammar) { shim_1.assert(rawGrammar.length > 0); } construct(rawGrammar) { this.beforeConstruct(rawGrammar); //每一个非终结符 for (let x of rawGrammar) { shim_1.assert(x.length > 1 && x[0] instanceof definition_1.NonTerminal); let nt = x[0]; this._nonTerminals.push(x[0]); nt.prods = []; //非终结符的每一个产生式 for (let i = 1; i < x.length; i++) { let rowProd = x[i]; shim_1.assert(rowProd instanceof Array); let actionSyms = []; //每一个符号 for (let rawSym of rowProd) { actionSyms.push(new definition_1.SymbolWrapper(rawSym)); } let prod = new definition_1.Production(this._prodIdCounter++, x[0], actionSyms); nt.prods.push(prod); this._prodMap.set(prod.id, prod); this._productions.push(prod); } } this.afterConstruct(); } afterConstruct() { //Implement in subclasses } nonTerminals() { return this._nonTerminals; } productions() { return this._productions; } //start symbol startNT() { return this._nonTerminals[0]; } toString() { return this._productions.join("\n"); } } exports.SimpleGrammar = SimpleGrammar; class MockToken { constructor(key, val = key) { this._key = key; this._val = val; } key() { return this._key; } get value() { return this._val; } toString() { return this.value.toString(); } } exports.MockToken = MockToken; class MockLexer { constructor(ts) { this.index = 0; this.tokens = ts; } peek() { if (this.index > this.tokens.length - 1) { return new MockToken(definition_1.EOF); } else { return this.tokens[this.index]; } } next() { if (this.index > this.tokens.length - 1) { return new MockToken(definition_1.EOF); } else { return this.tokens[this.index++]; } } } exports.MockLexer = MockLexer; //# sourceMappingURL=toolkit.js.map