pegisland
Version:
General PEG-based parser supporting island grammars with lake symbols
49 lines • 1.57 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.search = exports.searchExpressions = exports.min = exports.max = exports.inRange = void 0;
function flatten(array) {
return [].concat(...array);
}
function isGEQ(a, b) {
return a.line > b.line || (a.line === b.line && a.column >= b.column);
}
function isLEQ(a, b) {
return isGEQ(b, a);
}
function inRange(a, b) {
return isGEQ(a.start, b.start) && isLEQ(a.end, b.end);
}
exports.inRange = inRange;
function select(f, a, b) {
return f(a, b) ? a : b;
}
function max(a, b) {
return select(isGEQ, a, b);
}
exports.max = max;
function min(a, b) {
return select(isLEQ, a, b);
}
exports.min = min;
function searchExpressions(node, range) {
const nodeIsLeaf = node.childNodes.length === 0;
if (nodeIsLeaf) {
return inRange(node.range, range) ? [node] : [];
}
const nodes = flatten(node.childNodes.map((child) => searchExpressions(child, range)));
const nodeSet = new Set(nodes);
return node.childNodes.every((child) => nodeSet.has(child)) ? [node] : nodes;
}
exports.searchExpressions = searchExpressions;
function search(node, range) {
const trees = flatten(node.childNodes.map((child) => search(child, range)));
const isEmpty = node.range.start.equal(node.range.end);
if (!isEmpty && inRange(node.range, range)) {
// if (node instanceof NNonterminal || node instanceof NTerminal) {
return [[node, trees]];
// }
}
return trees;
}
exports.search = search;
//# sourceMappingURL=search.js.map