fxyn
Version:
Minimalist parser combinator
31 lines (30 loc) • 4.99 kB
JavaScript
import { matchString } from "./combinators/match.js";
import { Tree } from "./tree.js";
export const toPattern = (from)=>typeof from === 'string' ? matchString(from) : from;
export const p = (name, pattern, hidden = false)=>{
const resolvedPattern = toPattern(pattern);
const namedPattern = (source)=>{
const match = resolvedPattern(source);
if (match === null) return null;
match.tree.name = name;
match.tree.hidden = hidden;
return match;
};
namedPattern.p = name;
return namedPattern;
};
// allow combinator to support `PatternLike` types, like raw string.
export const wrapPatternLike = (combinator)=>(...patternLikes)=>combinator(...patternLikes.map(toPattern));
// NOTE: this is a quick helper. it does not check slice validity and assumes that the caller already proved it.
export const newLeafSuccessResult = (source, consumed)=>({
tree: Tree.newLeaf(source.take(consumed)),
consumed,
rest: source.skip(consumed)
});
export const wrapSuccessResult = (matchResult)=>matchResult !== null ? {
...matchResult,
tree: Tree.newTree(matchResult.tree.spanned, [
matchResult.tree
])
} : null;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9wYXR0ZXJuLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IG1hdGNoU3RyaW5nIH0gZnJvbSAnLi9jb21iaW5hdG9ycy9tYXRjaCdcbmltcG9ydCB0eXBlIHsgTWF0Y2hSZXN1bHQsIFBhdHRlcm4gfSBmcm9tICcuL3BhdHRlcm4nXG5pbXBvcnQgdHlwZSB7IFNwYW5uZWRTdHJpbmcgfSBmcm9tICcuL3NwYW5uZWQtc3RyaW5nJ1xuaW1wb3J0IHsgVHJlZSB9IGZyb20gJy4vdHJlZSdcblxuZXhwb3J0IHR5cGUgUGF0dGVybkxpa2UgPSBQYXR0ZXJuIHwgc3RyaW5nXG5cbmV4cG9ydCBjb25zdCB0b1BhdHRlcm4gPSAoZnJvbTogUGF0dGVybkxpa2UpID0+XG5cdHR5cGVvZiBmcm9tID09PSAnc3RyaW5nJyA/IG1hdGNoU3RyaW5nKGZyb20pIDogZnJvbVxuXG5leHBvcnQgY29uc3QgcCA9IChuYW1lOiBzdHJpbmcsIHBhdHRlcm46IFBhdHRlcm5MaWtlLCBoaWRkZW4gPSBmYWxzZSkgPT4ge1xuXHRjb25zdCByZXNvbHZlZFBhdHRlcm4gPSB0b1BhdHRlcm4ocGF0dGVybilcblxuXHRjb25zdCBuYW1lZFBhdHRlcm46IFBhdHRlcm4gPSBzb3VyY2UgPT4ge1xuXHRcdGNvbnN0IG1hdGNoID0gcmVzb2x2ZWRQYXR0ZXJuKHNvdXJjZSlcblxuXHRcdGlmIChtYXRjaCA9PT0gbnVsbCkgcmV0dXJuIG51bGxcblxuXHRcdG1hdGNoLnRyZWUubmFtZSA9IG5hbWVcblx0XHRtYXRjaC50cmVlLmhpZGRlbiA9IGhpZGRlblxuXHRcdHJldHVybiBtYXRjaFxuXHR9XG5cblx0bmFtZWRQYXR0ZXJuLnAgPSBuYW1lXG5cblx0cmV0dXJuIG5hbWVkUGF0dGVyblxufVxuXG4vLyBhbGxvdyBjb21iaW5hdG9yIHRvIHN1cHBvcnQgYFBhdHRlcm5MaWtlYCB0eXBlcywgbGlrZSByYXcgc3RyaW5nLlxuZXhwb3J0IGNvbnN0IHdyYXBQYXR0ZXJuTGlrZSA9XG5cdDxUIGV4dGVuZHMgQXJyYXk8UGF0dGVybj4sIFU+KGNvbWJpbmF0b3I6ICguLi5wYXR0ZXJuczogVCkgPT4gVSkgPT5cblx0KC4uLnBhdHRlcm5MaWtlczogeyBbSyBpbiBrZXlvZiBUXTogUGF0dGVybkxpa2UgfSkgPT5cblx0XHRjb21iaW5hdG9yKC4uLihwYXR0ZXJuTGlrZXMubWFwKHRvUGF0dGVybikgYXMgVCkpXG5cbi8vIE5PVEU6IHRoaXMgaXMgYSBxdWljayBoZWxwZXIuIGl0IGRvZXMgbm90IGNoZWNrIHNsaWNlIHZhbGlkaXR5IGFuZCBhc3N1bWVzIHRoYXQgdGhlIGNhbGxlciBhbHJlYWR5IHByb3ZlZCBpdC5cbmV4cG9ydCBjb25zdCBuZXdMZWFmU3VjY2Vzc1Jlc3VsdCA9IChcblx0c291cmNlOiBTcGFubmVkU3RyaW5nLFxuXHRjb25zdW1lZDogbnVtYmVyLFxuKSA9PiAoe1xuXHR0cmVlOiBUcmVlLm5ld0xlYWYoc291cmNlLnRha2UoY29uc3VtZWQpISksXG5cdGNvbnN1bWVkLFxuXHRyZXN0OiBzb3VyY2Uuc2tpcChjb25zdW1lZCkhLFxufSlcblxuZXhwb3J0IGNvbnN0IHdyYXBTdWNjZXNzUmVzdWx0ID0gKG1hdGNoUmVzdWx0OiBNYXRjaFJlc3VsdCkgPT5cblx0bWF0Y2hSZXN1bHQgIT09IG51bGxcblx0XHQ/IHtcblx0XHRcdFx0Li4ubWF0Y2hSZXN1bHQsXG5cdFx0XHRcdHRyZWU6IFRyZWUubmV3VHJlZShtYXRjaFJlc3VsdC50cmVlLnNwYW5uZWQsIFtcblx0XHRcdFx0XHRtYXRjaFJlc3VsdC50cmVlLFxuXHRcdFx0XHRdKSxcblx0XHRcdH1cblx0XHQ6IG51bGxcbiJdLCJuYW1lcyI6WyJtYXRjaFN0cmluZyIsIlRyZWUiLCJ0b1BhdHRlcm4iLCJmcm9tIiwicCIsIm5hbWUiLCJwYXR0ZXJuIiwiaGlkZGVuIiwicmVzb2x2ZWRQYXR0ZXJuIiwibmFtZWRQYXR0ZXJuIiwic291cmNlIiwibWF0Y2giLCJ0cmVlIiwid3JhcFBhdHRlcm5MaWtlIiwiY29tYmluYXRvciIsInBhdHRlcm5MaWtlcyIsIm1hcCIsIm5ld0xlYWZTdWNjZXNzUmVzdWx0IiwiY29uc3VtZWQiLCJuZXdMZWFmIiwidGFrZSIsInJlc3QiLCJza2lwIiwid3JhcFN1Y2Nlc3NSZXN1bHQiLCJtYXRjaFJlc3VsdCIsIm5ld1RyZWUiLCJzcGFubmVkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxXQUFXLFFBQVEseUJBQXFCO0FBR2pELFNBQVNDLElBQUksUUFBUSxZQUFRO0FBSTdCLE9BQU8sTUFBTUMsWUFBWSxDQUFDQyxPQUN6QixPQUFPQSxTQUFTLFdBQVdILFlBQVlHLFFBQVFBLEtBQUk7QUFFcEQsT0FBTyxNQUFNQyxJQUFJLENBQUNDLE1BQWNDLFNBQXNCQyxTQUFTLEtBQUs7SUFDbkUsTUFBTUMsa0JBQWtCTixVQUFVSTtJQUVsQyxNQUFNRyxlQUF3QkMsQ0FBQUE7UUFDN0IsTUFBTUMsUUFBUUgsZ0JBQWdCRTtRQUU5QixJQUFJQyxVQUFVLE1BQU0sT0FBTztRQUUzQkEsTUFBTUMsSUFBSSxDQUFDUCxJQUFJLEdBQUdBO1FBQ2xCTSxNQUFNQyxJQUFJLENBQUNMLE1BQU0sR0FBR0E7UUFDcEIsT0FBT0k7SUFDUjtJQUVBRixhQUFhTCxDQUFDLEdBQUdDO0lBRWpCLE9BQU9JO0FBQ1IsRUFBQztBQUVELG9FQUFvRTtBQUNwRSxPQUFPLE1BQU1JLGtCQUNaLENBQThCQyxhQUM5QixDQUFDLEdBQUdDLGVBQ0hELGNBQWVDLGFBQWFDLEdBQUcsQ0FBQ2QsWUFBaUI7QUFFbkQsZ0hBQWdIO0FBQ2hILE9BQU8sTUFBTWUsdUJBQXVCLENBQ25DUCxRQUNBUSxXQUNLLENBQUE7UUFDTE4sTUFBTVgsS0FBS2tCLE9BQU8sQ0FBQ1QsT0FBT1UsSUFBSSxDQUFDRjtRQUMvQkE7UUFDQUcsTUFBTVgsT0FBT1ksSUFBSSxDQUFDSjtJQUNuQixDQUFBLEVBQUU7QUFFRixPQUFPLE1BQU1LLG9CQUFvQixDQUFDQyxjQUNqQ0EsZ0JBQWdCLE9BQ2I7UUFDQSxHQUFHQSxXQUFXO1FBQ2RaLE1BQU1YLEtBQUt3QixPQUFPLENBQUNELFlBQVlaLElBQUksQ0FBQ2MsT0FBTyxFQUFFO1lBQzVDRixZQUFZWixJQUFJO1NBQ2hCO0lBQ0YsSUFDQyxLQUFJIn0=