@light0x00/parser-generator
Version:
A Parser Generator
95 lines (70 loc) • 8.21 kB
JavaScript
;
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=