UNPKG

@light0x00/parser-generator

Version:

A Parser Generator

96 lines (76 loc) 7.72 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.constructStateSet_SLR = constructStateSet_SLR; exports.SLRAutotamaTools = void 0; var _Definition = require("../../Definition"); var _Definition2 = require("../Definition"); var _StateAutomata = require("../StateAutomata"); /* SLR */ class SLRAutotamaTools { /** * 求指定项集的闭包 * * 例 * 考虑文法: * E->E+T | T * T->T*F | F * F->(E) | id * * 输入: * E->·E+T * E->·T * * 输出: * E->·E+T * E->·T * T->·T*F * T->·F * F->·(E) * F->·id * * @param itemSet 项集 */ closure(itemSet) { let itemSetClosure = itemSet; //考虑实际情况 不需要深拷贝 let added = new Set(); //项集的每一个项 item for (let processedIdx = 0; processedIdx < itemSetClosure.length; processedIdx++) { let item = itemSetClosure[processedIdx]; /* 没有闭包的情况 1. 「点」已经到了产生式的最后末尾 A-> X· 2. 后继符号不是终结符 没有闭包 A-> ·a */ if (!item.hasNext()) continue; let next = item.nextSymbol(); if (!(next instanceof _Definition.NonTerminal)) continue; //如果已经添加过 则跳过 if (added.has(next)) continue; //将后继符号的产生式加入 closure for (let prod of next.prods) { itemSetClosure.push(new _Definition2.Item(prod)); } added.add(next); } return itemSetClosure; } GOTO(I, inputSymbol) { let nextItemSet = new _Definition2.ItemSet(); for (let item of I) { if (!item.hasNext()) continue; if (item.nextSymbol() == inputSymbol) { nextItemSet.push(item.nextItem()); } } return this.closure(nextItemSet); } getStartState(grammar) { return new _Definition2.State(0, this.closure(new _Definition2.ItemSet(new _Definition2.Item(grammar.prodOfStartNT)))); } } exports.SLRAutotamaTools = SLRAutotamaTools; function constructStateSet_SLR(grammar) { return (0, _StateAutomata.getStateSet)(grammar, new SLRAutotamaTools()); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9MUi9TTFIvQXV0b21hdGEudHMiXSwibmFtZXMiOlsiU0xSQXV0b3RhbWFUb29scyIsImNsb3N1cmUiLCJpdGVtU2V0IiwiaXRlbVNldENsb3N1cmUiLCJhZGRlZCIsIlNldCIsInByb2Nlc3NlZElkeCIsImxlbmd0aCIsIml0ZW0iLCJoYXNOZXh0IiwibmV4dCIsIm5leHRTeW1ib2wiLCJOb25UZXJtaW5hbCIsImhhcyIsInByb2QiLCJwcm9kcyIsInB1c2giLCJJdGVtIiwiYWRkIiwiR09UTyIsIkkiLCJpbnB1dFN5bWJvbCIsIm5leHRJdGVtU2V0IiwiSXRlbVNldCIsIm5leHRJdGVtIiwiZ2V0U3RhcnRTdGF0ZSIsImdyYW1tYXIiLCJTdGF0ZSIsInByb2RPZlN0YXJ0TlQiLCJjb25zdHJ1Y3RTdGF0ZVNldF9TTFIiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUE7O0FBQ0E7O0FBQ0E7O0FBQ0E7QUFFTyxNQUFNQSxnQkFBTixDQUFnRDtBQUN0RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1QkFDLEVBQUFBLE9BQU8sQ0FBQ0MsT0FBRCxFQUE0QjtBQUNsQyxRQUFJQyxjQUF1QixHQUFHRCxPQUE5QixDQURrQyxDQUNLOztBQUN2QyxRQUFJRSxLQUFLLEdBQUcsSUFBSUMsR0FBSixFQUFaLENBRmtDLENBR2xDOztBQUNBLFNBQUssSUFBSUMsWUFBWSxHQUFHLENBQXhCLEVBQTJCQSxZQUFZLEdBQUdILGNBQWMsQ0FBQ0ksTUFBekQsRUFBaUVELFlBQVksRUFBN0UsRUFBaUY7QUFDaEYsVUFBSUUsSUFBSSxHQUFHTCxjQUFjLENBQUNHLFlBQUQsQ0FBekI7QUFDQTs7Ozs7Ozs7QUFPQSxVQUFJLENBQUNFLElBQUksQ0FBQ0MsT0FBTCxFQUFMLEVBQ0M7QUFDRCxVQUFJQyxJQUFJLEdBQUdGLElBQUksQ0FBQ0csVUFBTCxFQUFYO0FBQ0EsVUFBSSxFQUFFRCxJQUFJLFlBQVlFLHVCQUFsQixDQUFKLEVBQ0MsU0FiK0UsQ0FjaEY7O0FBQ0EsVUFBSVIsS0FBSyxDQUFDUyxHQUFOLENBQVVILElBQVYsQ0FBSixFQUNDLFNBaEIrRSxDQWlCaEY7O0FBQ0EsV0FBSyxJQUFJSSxJQUFULElBQWlCSixJQUFJLENBQUNLLEtBQXRCLEVBQTZCO0FBQzVCWixRQUFBQSxjQUFjLENBQUNhLElBQWYsQ0FBb0IsSUFBSUMsaUJBQUosQ0FBU0gsSUFBVCxDQUFwQjtBQUNBOztBQUNEVixNQUFBQSxLQUFLLENBQUNjLEdBQU4sQ0FBVVIsSUFBVjtBQUNBOztBQUNELFdBQU9QLGNBQVA7QUFDQTs7QUFFRGdCLEVBQUFBLElBQUksQ0FBQ0MsQ0FBRCxFQUFhQyxXQUFiLEVBQTJDO0FBQzlDLFFBQUlDLFdBQVcsR0FBRyxJQUFJQyxvQkFBSixFQUFsQjs7QUFDQSxTQUFLLElBQUlmLElBQVQsSUFBaUJZLENBQWpCLEVBQW9CO0FBQ25CLFVBQUksQ0FBQ1osSUFBSSxDQUFDQyxPQUFMLEVBQUwsRUFDQzs7QUFDRCxVQUFJRCxJQUFJLENBQUNHLFVBQUwsTUFBcUJVLFdBQXpCLEVBQXNDO0FBQ3JDQyxRQUFBQSxXQUFXLENBQUNOLElBQVosQ0FBaUJSLElBQUksQ0FBQ2dCLFFBQUwsRUFBakI7QUFDQTtBQUNEOztBQUNELFdBQU8sS0FBS3ZCLE9BQUwsQ0FBYXFCLFdBQWIsQ0FBUDtBQUNBOztBQUVERyxFQUFBQSxhQUFhLENBQUNDLE9BQUQsRUFBNEI7QUFDeEMsV0FBTyxJQUFJQyxrQkFBSixDQUFVLENBQVYsRUFBYSxLQUFLMUIsT0FBTCxDQUFhLElBQUlzQixvQkFBSixDQUFZLElBQUlOLGlCQUFKLENBQVNTLE9BQU8sQ0FBQ0UsYUFBakIsQ0FBWixDQUFiLENBQWIsQ0FBUDtBQUNBOztBQXBFcUQ7Ozs7QUF5RWhELFNBQVNDLHFCQUFULENBQStCSCxPQUEvQixFQUEwRDtBQUNoRSxTQUFPLGdDQUFZQSxPQUFaLEVBQXFCLElBQUkxQixnQkFBSixFQUFyQixDQUFQO0FBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOb25UZXJtaW5hbCxTeW1ib2wgfSBmcm9tIFwiQC9EZWZpbml0aW9uXCI7XG5pbXBvcnQgeyBJdGVtU2V0LEl0ZW0sIEF1Z21lbnRlZEdyYW1tYXIsIFN0YXRlLCBBdXRvbWF0YVRvb2xzIH0gZnJvbSBcIi4uL0RlZmluaXRpb25cIjtcbmltcG9ydCB7IGdldFN0YXRlU2V0IH0gZnJvbSBcIi4uL1N0YXRlQXV0b21hdGFcIjtcbi8qIFNMUiAqL1xuXG5leHBvcnQgY2xhc3MgU0xSQXV0b3RhbWFUb29scyBpbXBsZW1lbnRzIEF1dG9tYXRhVG9vbHMge1xuXHQvKipcbiAgICAgKiDmsYLmjIflrprpobnpm4bnmoTpl63ljIVcbiAgICAgKlxuICAgICAqIOS+i1xuICAgICAqIOiAg+iZkeaWh+azlTpcbiAgICAgKiBFLT5FK1QgfCBUXG4gICAgICogVC0+VCpGIHwgRlxuICAgICAqIEYtPihFKSB8IGlkXG4gICAgICpcbiAgICAgKiDovpPlhaU6XG4gICAgICogIEUtPsK3RStUXG4gICAgICogIEUtPsK3VFxuICAgICAqXG4gICAgICog6L6T5Ye6OlxuICAgICAqICBFLT7Ct0UrVFxuICAgICAqICBFLT7Ct1RcbiAgICAgKiAgVC0+wrdUKkZcbiAgICAgKiAgVC0+wrdGXG4gICAgICogIEYtPsK3KEUpXG4gICAgICogIEYtPsK3aWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtU2V0IOmhuembhlxuICAgICAqL1xuXHRjbG9zdXJlKGl0ZW1TZXQ6IEl0ZW1TZXQpOiBJdGVtU2V0IHtcblx0XHRsZXQgaXRlbVNldENsb3N1cmU6IEl0ZW1TZXQgPSBpdGVtU2V0OyAvL+iAg+iZkeWunumZheaDheWGtSDkuI3pnIDopoHmt7Hmi7fotJ1cblx0XHRsZXQgYWRkZWQgPSBuZXcgU2V0PE5vblRlcm1pbmFsPigpO1xuXHRcdC8v6aG56ZuG55qE5q+P5LiA5Liq6aG5IGl0ZW1cblx0XHRmb3IgKGxldCBwcm9jZXNzZWRJZHggPSAwOyBwcm9jZXNzZWRJZHggPCBpdGVtU2V0Q2xvc3VyZS5sZW5ndGg7IHByb2Nlc3NlZElkeCsrKSB7XG5cdFx0XHRsZXQgaXRlbSA9IGl0ZW1TZXRDbG9zdXJlW3Byb2Nlc3NlZElkeF07XG5cdFx0XHQvKlxuICAgICAgICAgICAg5rKh5pyJ6Zet5YyF55qE5oOF5Ya1XG4gICAgICAgICAgICAxLiDjgIzngrnjgI3lt7Lnu4/liLDkuobkuqfnlJ/lvI/nmoTmnIDlkI7mnKvlsL5cbiAgICAgICAgICAgICAgICAgICAgQS0+IFjCt1xuICAgICAgICAgICAgMi4g5ZCO57un56ym5Y+35LiN5piv57uI57uT56ymIOayoeaciemXreWMhVxuICAgICAgICAgICAgICAgICAgICBBLT4gwrdhXG4gICAgICAgICAgICAqL1xuXHRcdFx0aWYgKCFpdGVtLmhhc05leHQoKSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRsZXQgbmV4dCA9IGl0ZW0ubmV4dFN5bWJvbCgpO1xuXHRcdFx0aWYgKCEobmV4dCBpbnN0YW5jZW9mIE5vblRlcm1pbmFsKSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHQvL+WmguaenOW3sue7j+a3u+WKoOi/hyDliJnot7Pov4dcblx0XHRcdGlmIChhZGRlZC5oYXMobmV4dCkpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0Ly/lsIblkI7nu6fnrKblj7fnmoTkuqfnlJ/lvI/liqDlhaUgY2xvc3VyZVxuXHRcdFx0Zm9yIChsZXQgcHJvZCBvZiBuZXh0LnByb2RzKSB7XG5cdFx0XHRcdGl0ZW1TZXRDbG9zdXJlLnB1c2gobmV3IEl0ZW0ocHJvZCkpO1xuXHRcdFx0fVxuXHRcdFx0YWRkZWQuYWRkKG5leHQpO1xuXHRcdH1cblx0XHRyZXR1cm4gaXRlbVNldENsb3N1cmU7XG5cdH1cblxuXHRHT1RPKEk6IEl0ZW1TZXQsIGlucHV0U3ltYm9sOiBTeW1ib2wpOiBJdGVtU2V0IHtcblx0XHRsZXQgbmV4dEl0ZW1TZXQgPSBuZXcgSXRlbVNldCgpO1xuXHRcdGZvciAobGV0IGl0ZW0gb2YgSSkge1xuXHRcdFx0aWYgKCFpdGVtLmhhc05leHQoKSlcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHRpZiAoaXRlbS5uZXh0U3ltYm9sKCkgPT0gaW5wdXRTeW1ib2wpIHtcblx0XHRcdFx0bmV4dEl0ZW1TZXQucHVzaChpdGVtLm5leHRJdGVtKCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5jbG9zdXJlKG5leHRJdGVtU2V0KTtcblx0fVxuXG5cdGdldFN0YXJ0U3RhdGUoZ3JhbW1hcjogQXVnbWVudGVkR3JhbW1hcikge1xuXHRcdHJldHVybiBuZXcgU3RhdGUoMCwgdGhpcy5jbG9zdXJlKG5ldyBJdGVtU2V0KG5ldyBJdGVtKGdyYW1tYXIucHJvZE9mU3RhcnROVCkpKSk7XG5cdH1cblxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25zdHJ1Y3RTdGF0ZVNldF9TTFIoZ3JhbW1hcjogQXVnbWVudGVkR3JhbW1hcikge1xuXHRyZXR1cm4gZ2V0U3RhdGVTZXQoZ3JhbW1hciwgbmV3IFNMUkF1dG90YW1hVG9vbHMoKSk7XG59XG4iXX0=