@parser-generator/core
Version:
A Parser Generator that supports LL,SLR,LR1,LALR
69 lines • 2.25 kB
JavaScript
import { isIterable } from "@light0x00/shim";
export class CyclicDepsDector {
constructor() {
this.dependencies = new Map();
}
/**
* 广度优先遍历图,如果找到 startPoint到endPoint的路径,则说明存在循环依赖 issue: 9.循环依赖
* @param endPoint
* @param startPoint
*/
isConnected(startPoint, endPoint) {
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);
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;
}
/**
* 注册依赖,并检测是否存在反向依赖,如存在则说明存在环,将返回true
* @param holder
* @param dep
*/
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.isConnected(dep, holder);
}
}
export class MismatchError extends Error {
constructor(expected, actual) {
let err_msg;
if (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}`;
}
// err_msg+=` at (${actual.lineNo},${actual.colNo})`;
super(err_msg);
}
}
//# sourceMappingURL=utils.js.map