UNPKG

pegisland

Version:

General PEG-based parser supporting island grammars with lake symbols

49 lines 1.57 kB
"use strict"; 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