UNPKG

@light0x00/parser-generator

Version:

A Parser Generator

95 lines (70 loc) 8.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MismatchError = exports.CyclicDepsDector = void 0; var _debug = _interopRequireDefault(require("debug")); var _shim = require("@light0x00/shim"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } let debug = (0, _debug.default)("APP:pg:toolkit"); class CyclicDepsDector { constructor() { _defineProperty(this, "dependencies", new Map()); } /** * 广度优先遍历图,如果找到 startPoint到endPoint的路径,则说明存在循环依赖 issue: 9.循环依赖 * @param endPoint * @param startPoint */ existsCycl(endPoint, startPoint) { let otherDeps = this.dependencies.get(startPoint); if (otherDeps === undefined) return false; if (otherDeps.has(endPoint)) { return true; } let stack = Array.from(otherDeps); let visited = new Set(); //标记无向图中已经被遍历过的节点 while (stack.length > 0) { let top = stack.pop(); visited.add(top); debug(`visited ${top}`); if (top == endPoint) return true; let topDeps = this.dependencies.get(top); if (topDeps == undefined) continue; if (topDeps.has(endPoint)) return true; for (let topDep of topDeps) { stack.push(topDep); } } return false; } registerAndCheckCycl(holder, dep) { let holderDeps = this.dependencies.get(holder); if (holderDeps === undefined) { holderDeps = new Set(); this.dependencies.set(holder, holderDeps); } holderDeps.add(dep); return this.existsCycl(holder, dep); } } exports.CyclicDepsDector = CyclicDepsDector; class MismatchError extends Error { constructor(expected, actual) { let err_msg; if ((0, _shim.isIterable)(expected)) { let expectation = ""; for (let e of expected) { expectation += e + ","; } expectation = expectation.replace(/,$/, ""); err_msg = `The expected input is one of ${expectation},but actually ${actual}`; } else { err_msg = `The expected input is ${expected},but actually ${actual}`; } super(err_msg); } } exports.MismatchError = MismatchError; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9Ub29sa2l0LnRzIl0sIm5hbWVzIjpbImRlYnVnIiwiQ3ljbGljRGVwc0RlY3RvciIsIk1hcCIsImV4aXN0c0N5Y2wiLCJlbmRQb2ludCIsInN0YXJ0UG9pbnQiLCJvdGhlckRlcHMiLCJkZXBlbmRlbmNpZXMiLCJnZXQiLCJ1bmRlZmluZWQiLCJoYXMiLCJzdGFjayIsIkFycmF5IiwiZnJvbSIsInZpc2l0ZWQiLCJTZXQiLCJsZW5ndGgiLCJ0b3AiLCJwb3AiLCJhZGQiLCJ0b3BEZXBzIiwidG9wRGVwIiwicHVzaCIsInJlZ2lzdGVyQW5kQ2hlY2tDeWNsIiwiaG9sZGVyIiwiZGVwIiwiaG9sZGVyRGVwcyIsInNldCIsIk1pc21hdGNoRXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwiZXhwZWN0ZWQiLCJhY3R1YWwiLCJlcnJfbXNnIiwiZXhwZWN0YXRpb24iLCJlIiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7OztBQUFBOztBQUNBOzs7Ozs7QUFDQSxJQUFJQSxLQUFLLEdBQUcsb0JBQVUsZ0JBQVYsQ0FBWjs7QUFFTyxNQUFNQyxnQkFBTixDQUEwQjtBQUFBO0FBQUEsMENBQ1QsSUFBSUMsR0FBSixFQURTO0FBQUE7O0FBRWhDOzs7OztBQUtRQyxFQUFBQSxVQUFSLENBQW1CQyxRQUFuQixFQUFnQ0MsVUFBaEMsRUFBK0M7QUFDOUMsUUFBSUMsU0FBUyxHQUFHLEtBQUtDLFlBQUwsQ0FBa0JDLEdBQWxCLENBQXNCSCxVQUF0QixDQUFoQjtBQUNBLFFBQUlDLFNBQVMsS0FBS0csU0FBbEIsRUFDQyxPQUFPLEtBQVA7O0FBQ0QsUUFBSUgsU0FBUyxDQUFDSSxHQUFWLENBQWNOLFFBQWQsQ0FBSixFQUE2QjtBQUM1QixhQUFPLElBQVA7QUFDQTs7QUFDRCxRQUFJTyxLQUFLLEdBQUdDLEtBQUssQ0FBQ0MsSUFBTixDQUFXUCxTQUFYLENBQVo7QUFDQSxRQUFJUSxPQUFPLEdBQUcsSUFBSUMsR0FBSixFQUFkLENBUjhDLENBUWxCOztBQUM1QixXQUFPSixLQUFLLENBQUNLLE1BQU4sR0FBZSxDQUF0QixFQUF5QjtBQUN4QixVQUFJQyxHQUFHLEdBQUdOLEtBQUssQ0FBQ08sR0FBTixFQUFWO0FBQ0FKLE1BQUFBLE9BQU8sQ0FBQ0ssR0FBUixDQUFZRixHQUFaO0FBQ0FqQixNQUFBQSxLQUFLLENBQUUsV0FBVWlCLEdBQUksRUFBaEIsQ0FBTDtBQUNBLFVBQUlBLEdBQUcsSUFBSWIsUUFBWCxFQUNDLE9BQU8sSUFBUDtBQUNELFVBQUlnQixPQUFPLEdBQUcsS0FBS2IsWUFBTCxDQUFrQkMsR0FBbEIsQ0FBc0JTLEdBQXRCLENBQWQ7QUFDQSxVQUFJRyxPQUFPLElBQUlYLFNBQWYsRUFDQztBQUNELFVBQUlXLE9BQU8sQ0FBQ1YsR0FBUixDQUFZTixRQUFaLENBQUosRUFDQyxPQUFPLElBQVA7O0FBQ0QsV0FBSyxJQUFJaUIsTUFBVCxJQUFtQkQsT0FBbkIsRUFBNEI7QUFDM0JULFFBQUFBLEtBQUssQ0FBQ1csSUFBTixDQUFXRCxNQUFYO0FBQ0E7QUFDRDs7QUFDRCxXQUFPLEtBQVA7QUFDQTs7QUFDREUsRUFBQUEsb0JBQW9CLENBQUNDLE1BQUQsRUFBWUMsR0FBWixFQUFvQjtBQUN2QyxRQUFJQyxVQUFVLEdBQUcsS0FBS25CLFlBQUwsQ0FBa0JDLEdBQWxCLENBQXNCZ0IsTUFBdEIsQ0FBakI7O0FBQ0EsUUFBSUUsVUFBVSxLQUFLakIsU0FBbkIsRUFBOEI7QUFDN0JpQixNQUFBQSxVQUFVLEdBQUcsSUFBSVgsR0FBSixFQUFiO0FBQ0EsV0FBS1IsWUFBTCxDQUFrQm9CLEdBQWxCLENBQXNCSCxNQUF0QixFQUE4QkUsVUFBOUI7QUFDQTs7QUFDREEsSUFBQUEsVUFBVSxDQUFDUCxHQUFYLENBQWVNLEdBQWY7QUFDQSxXQUFPLEtBQUt0QixVQUFMLENBQWdCcUIsTUFBaEIsRUFBd0JDLEdBQXhCLENBQVA7QUFDQTs7QUF6QytCOzs7O0FBNkMxQixNQUFNRyxhQUFOLFNBQTRCQyxLQUE1QixDQUFrQztBQUN4Q0MsRUFBQUEsV0FBVyxDQUFDQyxRQUFELEVBQW1CQyxNQUFuQixFQUFtQztBQUM3QyxRQUFJQyxPQUFKOztBQUNBLFFBQUksc0JBQVdGLFFBQVgsQ0FBSixFQUEwQjtBQUN6QixVQUFJRyxXQUFXLEdBQUcsRUFBbEI7O0FBQ0EsV0FBSyxJQUFJQyxDQUFULElBQWNKLFFBQWQsRUFBd0I7QUFDdkJHLFFBQUFBLFdBQVcsSUFBSUMsQ0FBQyxHQUFHLEdBQW5CO0FBQ0E7O0FBQ0RELE1BQUFBLFdBQVcsR0FBR0EsV0FBVyxDQUFDRSxPQUFaLENBQW9CLElBQXBCLEVBQTBCLEVBQTFCLENBQWQ7QUFDQUgsTUFBQUEsT0FBTyxHQUFJLGdDQUErQkMsV0FBWSxpQkFBZ0JGLE1BQU8sRUFBN0U7QUFDQSxLQVBELE1BUUs7QUFDSkMsTUFBQUEsT0FBTyxHQUFJLHlCQUF3QkYsUUFBUyxpQkFBZ0JDLE1BQU8sRUFBbkU7QUFDQTs7QUFDRCxVQUFNQyxPQUFOO0FBQ0E7O0FBZnVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHJvb3REZWJ1ZyBmcm9tIFwiZGVidWdcIjtcbmltcG9ydCB7IGlzSXRlcmFibGUgfSBmcm9tIFwiQGxpZ2h0MHgwMC9zaGltXCI7XG5sZXQgZGVidWcgPSByb290RGVidWcoXCJBUFA6cGc6dG9vbGtpdFwiKTtcblxuZXhwb3J0IGNsYXNzIEN5Y2xpY0RlcHNEZWN0b3I8VD4ge1xuXHRwcml2YXRlIGRlcGVuZGVuY2llcyA9IG5ldyBNYXA8VCwgU2V0PFQ+PigpO1xuXHQvKipcbiAgICAgKiDlub/luqbkvJjlhYjpgY3ljoblm74s5aaC5p6c5om+5YiwIHN0YXJ0UG9pbnTliLBlbmRQb2ludOeahOi3r+W+hCzliJnor7TmmI7lrZjlnKjlvqrnjq/kvp3otZYgIGlzc3VlOiA5LuW+queOr+S+nei1llxuICAgICAqIEBwYXJhbSBlbmRQb2ludFxuICAgICAqIEBwYXJhbSBzdGFydFBvaW50XG4gICAgICovXG5cdHByaXZhdGUgZXhpc3RzQ3ljbChlbmRQb2ludDogVCwgc3RhcnRQb2ludDogVCkge1xuXHRcdGxldCBvdGhlckRlcHMgPSB0aGlzLmRlcGVuZGVuY2llcy5nZXQoc3RhcnRQb2ludCk7XG5cdFx0aWYgKG90aGVyRGVwcyA9PT0gdW5kZWZpbmVkKVxuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdGlmIChvdGhlckRlcHMuaGFzKGVuZFBvaW50KSkge1xuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fVxuXHRcdGxldCBzdGFjayA9IEFycmF5LmZyb20ob3RoZXJEZXBzKTtcblx0XHRsZXQgdmlzaXRlZCA9IG5ldyBTZXQ8VD4oKTsgLy/moIforrDml6DlkJHlm77kuK3lt7Lnu4/ooqvpgY3ljobov4fnmoToioLngrlcblx0XHR3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuXHRcdFx0bGV0IHRvcCA9IHN0YWNrLnBvcCgpIGFzIFQ7XG5cdFx0XHR2aXNpdGVkLmFkZCh0b3ApO1xuXHRcdFx0ZGVidWcoYHZpc2l0ZWQgJHt0b3B9YCk7XG5cdFx0XHRpZiAodG9wID09IGVuZFBvaW50KVxuXHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdGxldCB0b3BEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KHRvcCk7XG5cdFx0XHRpZiAodG9wRGVwcyA9PSB1bmRlZmluZWQpXG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0aWYgKHRvcERlcHMuaGFzKGVuZFBvaW50KSlcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRmb3IgKGxldCB0b3BEZXAgb2YgdG9wRGVwcykge1xuXHRcdFx0XHRzdGFjay5wdXNoKHRvcERlcCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXHRyZWdpc3RlckFuZENoZWNrQ3ljbChob2xkZXI6IFQsIGRlcDogVCkge1xuXHRcdGxldCBob2xkZXJEZXBzID0gdGhpcy5kZXBlbmRlbmNpZXMuZ2V0KGhvbGRlcik7XG5cdFx0aWYgKGhvbGRlckRlcHMgPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0aG9sZGVyRGVwcyA9IG5ldyBTZXQ8VD4oKTtcblx0XHRcdHRoaXMuZGVwZW5kZW5jaWVzLnNldChob2xkZXIsIGhvbGRlckRlcHMpO1xuXHRcdH1cblx0XHRob2xkZXJEZXBzLmFkZChkZXApO1xuXHRcdHJldHVybiB0aGlzLmV4aXN0c0N5Y2woaG9sZGVyLCBkZXApO1xuXHR9XG59XG5cblxuZXhwb3J0IGNsYXNzIE1pc21hdGNoRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG5cdGNvbnN0cnVjdG9yKGV4cGVjdGVkOiBPYmplY3QsIGFjdHVhbDogT2JqZWN0KSB7XG5cdFx0bGV0IGVycl9tc2c7XG5cdFx0aWYgKGlzSXRlcmFibGUoZXhwZWN0ZWQpKSB7XG5cdFx0XHRsZXQgZXhwZWN0YXRpb24gPSBcIlwiO1xuXHRcdFx0Zm9yIChsZXQgZSBvZiBleHBlY3RlZCkge1xuXHRcdFx0XHRleHBlY3RhdGlvbiArPSBlICsgXCIsXCI7XG5cdFx0XHR9XG5cdFx0XHRleHBlY3RhdGlvbiA9IGV4cGVjdGF0aW9uLnJlcGxhY2UoLywkLywgXCJcIik7XG5cdFx0XHRlcnJfbXNnID0gYFRoZSBleHBlY3RlZCBpbnB1dCBpcyBvbmUgb2YgJHtleHBlY3RhdGlvbn0sYnV0IGFjdHVhbGx5ICR7YWN0dWFsfWA7XG5cdFx0fVxuXHRcdGVsc2Uge1xuXHRcdFx0ZXJyX21zZyA9IGBUaGUgZXhwZWN0ZWQgaW5wdXQgaXMgJHtleHBlY3RlZH0sYnV0IGFjdHVhbGx5ICR7YWN0dWFsfWA7XG5cdFx0fVxuXHRcdHN1cGVyKGVycl9tc2cpO1xuXHR9XG59XG4iXX0=