ohm-js 18.0.0-beta.6 → 18.0.0-beta.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +16 -12
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -224,7 +224,19 @@ var Grammar = class Grammar {
|
|
|
224
224
|
const arr = re.exec(input.value);
|
|
225
225
|
if (arr) pos.value += arr[0].length;
|
|
226
226
|
return !!arr;
|
|
227
|
-
}
|
|
227
|
+
},
|
|
228
|
+
matchCaseInsensitive: (() => {
|
|
229
|
+
const cache = [];
|
|
230
|
+
return (stringIdx) => {
|
|
231
|
+
const { input, pos } = this._instance.exports;
|
|
232
|
+
let re = cache[stringIdx];
|
|
233
|
+
if (!re) re = cache[stringIdx] = new RegExp(this._strings[stringIdx], "iy");
|
|
234
|
+
re.lastIndex = pos.value;
|
|
235
|
+
const arr = re.exec(input.value);
|
|
236
|
+
if (arr) pos.value += arr[0].length;
|
|
237
|
+
return !!arr;
|
|
238
|
+
};
|
|
239
|
+
})()
|
|
228
240
|
},
|
|
229
241
|
"wasm:js-string": {
|
|
230
242
|
length(str) {
|
|
@@ -244,7 +256,7 @@ var Grammar = class Grammar {
|
|
|
244
256
|
/** @internal */
|
|
245
257
|
_input = "";
|
|
246
258
|
/** @internal */
|
|
247
|
-
|
|
259
|
+
_strings = [];
|
|
248
260
|
/** @internal */
|
|
249
261
|
_resultStack = [];
|
|
250
262
|
/**
|
|
@@ -263,18 +275,10 @@ var Grammar = class Grammar {
|
|
|
263
275
|
_init(module, instance) {
|
|
264
276
|
this._instance = instance;
|
|
265
277
|
this._extractStrings(module);
|
|
266
|
-
this._initMemoConfig(module);
|
|
267
278
|
this.name = this._getGrammarName(module);
|
|
268
279
|
return this;
|
|
269
280
|
}
|
|
270
281
|
/** @internal */
|
|
271
|
-
_initMemoConfig(module) {
|
|
272
|
-
const sections = WebAssembly.Module.customSections(module, "memoizedRuleCount");
|
|
273
|
-
assert(sections.length === 1, "Expected one memoizedRuleCount section");
|
|
274
|
-
const count = new DataView(sections[0]).getUint32(0, true);
|
|
275
|
-
this._instance.exports.setNumMemoizedRules(count);
|
|
276
|
-
}
|
|
277
|
-
/** @internal */
|
|
278
282
|
_manage(result) {
|
|
279
283
|
result._managed = true;
|
|
280
284
|
}
|
|
@@ -323,7 +327,7 @@ var Grammar = class Grammar {
|
|
|
323
327
|
this._ruleIds.set(ruleName, this._ruleIds.size);
|
|
324
328
|
this._ruleNames.push(ruleName);
|
|
325
329
|
}
|
|
326
|
-
for (const str of parseStringTable(module, "
|
|
330
|
+
for (const str of parseStringTable(module, "strings")) this._strings.push(str);
|
|
327
331
|
}
|
|
328
332
|
match(input, ruleName) {
|
|
329
333
|
assert(this._resultStack.every((r) => r._managed), "Cannot match while there are unmanaged MatchResults. Use `using` or `.use()` to manage the MatchResult lifecycle.");
|
|
@@ -355,7 +359,7 @@ var Grammar = class Grammar {
|
|
|
355
359
|
return [...new Set(ans)];
|
|
356
360
|
}
|
|
357
361
|
getFailureDescription(id) {
|
|
358
|
-
return this.
|
|
362
|
+
return this._strings[id];
|
|
359
363
|
}
|
|
360
364
|
getMemorySizeBytes() {
|
|
361
365
|
return this._instance.exports.memory.buffer.byteLength;
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../src/assert.ts","../src/extras.ts","../src/miniohm.ts"],"sourcesContent":["export function assert(cond: boolean, message = 'Assertion failed'): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nexport function checkNotNull<T>(x: T, msg = 'unexpected null value'): NonNullable<T> {\n assert(x != null, msg);\n return x as NonNullable<T>;\n}\n","// Self-contained copies of getLineAndColumn / getLineAndColumnMessage,\n// originally from packages/ohm-js/src/util.js. Inlined here so the runtime\n// package has zero dependency on the legacy engine.\n\nfunction repeatStr(str: string, n: number): string {\n return new Array(n + 1).join(str);\n}\n\nfunction padLeft(str: string, len: number, ch = ' '): string {\n if (str.length < len) {\n return repeatStr(ch, len - str.length) + str;\n }\n return str;\n}\n\nfunction padNumbersToEqualLength(arr: number[]): string[] {\n let maxLen = 0;\n const strings = arr.map(n => {\n const str = n.toString();\n maxLen = Math.max(maxLen, str.length);\n return str;\n });\n return strings.map(s => padLeft(s, maxLen));\n}\n\nfunction strcpy(dest: string, src: string, offset: number): string {\n const origDestLen = dest.length;\n const start = dest.slice(0, offset);\n const end = dest.slice(offset + src.length);\n return (start + src + end).substr(0, origDestLen);\n}\n\ninterface LineAndColumnInfo {\n offset: number;\n lineNum: number;\n colNum: number;\n line: string;\n prevLine: string | null;\n nextLine: string | null;\n toString(...ranges: [number, number][]): string;\n}\n\nfunction lineAndColumnToMessage(\n this: LineAndColumnInfo,\n ...ranges: [number, number][]\n): string {\n const lineAndCol = this;\n const {offset} = lineAndCol;\n\n let result = '';\n result += 'Line ' + lineAndCol.lineNum + ', col ' + lineAndCol.colNum + ':\\n';\n\n const lineNumbers = padNumbersToEqualLength([\n lineAndCol.prevLine == null ? 0 : lineAndCol.lineNum - 1,\n lineAndCol.lineNum,\n lineAndCol.nextLine == null ? 0 : lineAndCol.lineNum + 1,\n ]);\n\n const appendLine = (num: number, content: string, prefix: string) => {\n result += prefix + lineNumbers[num] + ' | ' + content + '\\n';\n };\n\n if (lineAndCol.prevLine != null) {\n appendLine(0, lineAndCol.prevLine, ' ');\n }\n appendLine(1, lineAndCol.line, '> ');\n\n const lineLen = lineAndCol.line.length;\n let indicationLine = repeatStr(' ', lineLen + 1);\n for (let i = 0; i < ranges.length; ++i) {\n let startIdx = ranges[i][0];\n let endIdx = ranges[i][1];\n if (!(startIdx >= 0 && startIdx <= endIdx)) {\n throw new Error('range start must be >= 0 and <= end');\n }\n\n const lineStartOffset = offset - lineAndCol.colNum + 1;\n startIdx = Math.max(0, startIdx - lineStartOffset);\n endIdx = Math.min(endIdx - lineStartOffset, lineLen);\n\n indicationLine = strcpy(indicationLine, repeatStr('~', endIdx - startIdx), startIdx);\n }\n const gutterWidth = 2 + lineNumbers[1].length + 3;\n result += repeatStr(' ', gutterWidth);\n indicationLine = strcpy(indicationLine, '^', lineAndCol.colNum - 1);\n result += indicationLine.replace(/ +$/, '') + '\\n';\n\n if (lineAndCol.nextLine != null) {\n appendLine(2, lineAndCol.nextLine, ' ');\n }\n return result;\n}\n\nexport function getLineAndColumn(str: string, offset: number): LineAndColumnInfo {\n let lineNum = 1;\n let colNum = 1;\n\n let currOffset = 0;\n let lineStartOffset = 0;\n\n let nextLine: string | null = null;\n let prevLine: string | null = null;\n let prevLineStartOffset = -1;\n\n while (currOffset < offset) {\n const c = str.charAt(currOffset++);\n if (c === '\\n') {\n lineNum++;\n colNum = 1;\n prevLineStartOffset = lineStartOffset;\n lineStartOffset = currOffset;\n } else if (c !== '\\r') {\n colNum++;\n }\n }\n\n // Find the end of the target line.\n let lineEndOffset = str.indexOf('\\n', lineStartOffset);\n if (lineEndOffset === -1) {\n lineEndOffset = str.length;\n } else {\n // Get the next line.\n const nextLineEndOffset = str.indexOf('\\n', lineEndOffset + 1);\n nextLine =\n nextLineEndOffset === -1\n ? str.slice(lineEndOffset)\n : str.slice(lineEndOffset, nextLineEndOffset);\n // Strip leading and trailing EOL char(s).\n nextLine = nextLine.replace(/^\\r?\\n/, '').replace(/\\r$/, '');\n }\n\n // Get the previous line.\n if (prevLineStartOffset >= 0) {\n // Strip trailing EOL char(s).\n prevLine = str.slice(prevLineStartOffset, lineStartOffset).replace(/\\r?\\n$/, '');\n }\n\n // Get the target line, stripping a trailing carriage return if necessary.\n const line = str.slice(lineStartOffset, lineEndOffset).replace(/\\r$/, '');\n\n return {\n offset,\n lineNum,\n colNum,\n line,\n prevLine,\n nextLine,\n toString: lineAndColumnToMessage,\n };\n}\n\nexport function getLineAndColumnMessage(\n str: string,\n offset: number,\n ...ranges: [number, number][]\n): string {\n return getLineAndColumn(str, offset).toString(...ranges);\n}\n","import {assert, checkNotNull} from './assert.ts';\nimport {getLineAndColumn, getLineAndColumnMessage} from './extras.ts';\n\nconst MATCH_RECORD_TYPE_MASK = 0b11;\n\n// A MatchRecord is the representation of a CstNode in Wasm linear memory.\nconst MatchRecordType = {\n NONTERMINAL: 0,\n TERMINAL: 1,\n ITER_FLAG: 2,\n OPTIONAL: 3,\n} as const;\n\n// A _CST node_ is the user-facing representation, built from a match record.\nexport const CstNodeType = {\n NONTERMINAL: 0,\n TERMINAL: 1,\n LIST: 2,\n OPT: 3,\n SEQ: 4,\n} as const;\n\n// Define types with the same name as the values above. This gives us roughly the\n// same functionality as a TypeScript enum, but works with erasableSyntaxOnly.\ntype MatchRecordType = (typeof MatchRecordType)[keyof typeof MatchRecordType];\nexport type CstNodeType = (typeof CstNodeType)[keyof typeof CstNodeType];\n\nconst EMPTY_CHILDREN: ReadonlyArray<CstNode> = Object.freeze([]);\n\nconst compileOptions = {\n builtins: ['js-string'],\n};\n\n// Bit flags for Unicode categories, based on the order that they appear in\n// https://www.unicode.org/Public/16.0.0/ucd/extracted/DerivedGeneralCategory.txt\n\nconst UnicodeCategoryNames = [\n 'Cn', // Unassigned\n 'Lu', // Uppercase_Letter\n 'Ll', // Lowercase_Letter\n 'Lt', // Titlecase_Letter\n 'Lm', // Modifier_Letter\n 'Lo', // Other_Letter\n];\n\nconst utf8 = new TextDecoder('utf-8');\nconst utf16le = new TextDecoder('utf-16le');\n\n// Minimal implementation of Interval (for FailedMatchResult)\nexport class Interval {\n startIdx: number;\n endIdx: number;\n /** @internal */\n private _sourceString: string;\n\n constructor(sourceString: string, startIdx: number, endIdx: number) {\n this._sourceString = sourceString;\n this.startIdx = startIdx;\n this.endIdx = endIdx;\n }\n\n get sourceString(): string {\n return this._sourceString;\n }\n\n get contents(): string {\n return this._sourceString.slice(this.startIdx, this.endIdx);\n }\n}\n\nexport class Failure {\n /** @internal */\n private _description: string;\n /** @internal */\n private _fluffy: boolean;\n\n constructor(description: string, fluffy: boolean) {\n this._description = description;\n this._fluffy = fluffy;\n }\n\n isFluffy(): boolean {\n return this._fluffy;\n }\n\n toString(): string {\n return this._description;\n }\n}\n\nfunction regexFromCategoryBitmap(bitmap: number): RegExp {\n const cats: string[] = [];\n for (let i = 0; i < 32; i++) {\n const mask = 1 << i;\n if (bitmap & mask) cats.push(UnicodeCategoryNames[i]);\n }\n return new RegExp(\n cats.map(cat => `\\\\p{${cat}}`).join('|'),\n 'uy' // u: unicode, y: sticky\n );\n}\n\nfunction parseStringTable(module: WebAssembly.Module, sectionName: string): string[] {\n const sections = WebAssembly.Module.customSections(module, sectionName);\n assert(\n sections.length === 1,\n `Expected one ${sectionName} section, found ${sections.length}`\n );\n\n const data = new Uint8Array(sections[0]);\n const dataView = new DataView(data.buffer);\n let offset = 0;\n\n const parseU32 = (): number => {\n // Quick 'n dirty ULeb128 parsing, assuming no more than 2 bytes.\n const b1 = dataView.getUint8(offset++);\n let value = b1 & 0x7f;\n if (b1 & 0x80) {\n const b2 = dataView.getUint8(offset++);\n assert((b2 & 0x80) === 0, 'Expected max two bytes');\n value |= (b2 & 0x7f) << 7;\n }\n return value;\n };\n\n const numEntries = parseU32();\n const ans: string[] = [];\n for (let i = 0; i < numEntries; i++) {\n const stringLen = parseU32();\n const bytes = data.slice(offset, offset + stringLen);\n offset += stringLen;\n const name = utf8.decode(bytes);\n ans.push(name);\n }\n return ans;\n}\n\nexport class Grammar {\n name = '';\n\n /** @internal */\n private _instance?: WebAssembly.Instance = undefined;\n /** @internal */\n private _imports = {\n // System-level AssemblyScript imports.\n env: {\n abort: (msgPtr: number, filePtr: number, line: number, column: number) => {\n const msg = this._readASString(msgPtr);\n const file = this._readASString(filePtr);\n throw new Error(`Wasm abort: ${msg} at ${file}:${line}:${column}`);\n },\n },\n // For imports from ohmRuntime.ts.\n ohmRuntime: {\n printI32(val: number) {\n // eslint-disable-next-line no-console\n console.log(val);\n },\n isRuleSyntactic: (ruleId: number) => {\n // TODO: Precompute this for all rules, and encode it in the module?\n const name = this._ruleNames[ruleId];\n assert(!!name);\n return name[0] === name[0].toUpperCase();\n },\n fillInputBuffer: this._fillInputBuffer.bind(this),\n matchUnicodeChar: (catBitmap: number) => {\n const {input, pos} = (this._instance as any).exports;\n const re = regexFromCategoryBitmap(catBitmap);\n re.lastIndex = pos;\n const arr = re.exec(input.value);\n if (arr) {\n pos.value += arr[0].length;\n }\n return !!arr;\n },\n },\n // Include a polyfill for js-string builtins for engines that don't\n // support that feature (e.g., Safari).\n 'wasm:js-string': {\n length(str: string): number {\n return str.length;\n },\n charCodeAt(str: string, idx: number): number {\n // NOTE: `index` is interpreted as a signed 32-bit integer when converted to\n // a JS value using standard conversions. Reinterpret as unsigned here.\n idx >>>= 0;\n assert(idx < str.length, 'string index out of bounds');\n return str.charCodeAt(idx);\n },\n },\n };\n /** @internal */\n private _ruleIds = new Map<string, number>();\n /** @internal */\n private _ruleNames: string[] = [];\n /** @internal */\n private _input = '';\n\n /** @internal */\n public _failureDescriptions: string[] = [];\n\n /*\n * Wasm heap memory management\n * ===========================\n *\n * The Wasm module uses a bump-pointer allocator (AssemblyScript's \"stub\"\n * runtime). Each match() call allocates a memo table and CST nodes on\n * the Wasm heap. There is no way to free individual allocations — you\n * can only reset the bump pointer.\n *\n * To allow incremental freeing, we exploit two facts:\n *\n * 1. MatchResult disposal is LIFO — you must dispose the most recent\n * result first (enforced by an assert in _dispose).\n *\n * 2. Allocations for match N are always contiguous and sit above\n * match N-1's allocations on the heap.\n *\n * Before each match, we snapshot the bump pointer (`exports.__offset`)\n * as a \"watermark\" and store it on the MatchResult. On dispose, we\n * reset the bump pointer to that watermark, freeing exactly that\n * match's allocations while keeping earlier results intact.\n *\n * When the last result is disposed, its watermark equals the initial\n * heap offset, so the entire heap is reclaimed — equivalent to the\n * old resetHeap() approach, but without the all-or-nothing limitation.\n */\n\n /** @internal */\n private _resultStack: MatchResult[] = [];\n\n /**\n * Create a new Grammar object.\n * If `bytes` is specified, the WebAssembly module will be synchronously\n * compiled and instantiated. Use `instantiate` or `instantiateStreaming`\n * to instantiate asynchronously.\n */\n constructor(bytes?: BufferSource) {\n if (bytes) {\n // @ts-expect-error: TS2554: Expected 1 arguments, but got 2.\n const mod = new WebAssembly.Module(bytes, compileOptions);\n this._init(mod, new WebAssembly.Instance(mod, this._imports));\n }\n }\n\n /** @internal */\n private _init(module: WebAssembly.Module, instance: WebAssembly.Instance) {\n this._instance = instance;\n this._extractStrings(module);\n this._initMemoConfig(module);\n this.name = this._getGrammarName(module);\n return this;\n }\n\n /** @internal */\n private _initMemoConfig(module: WebAssembly.Module) {\n const sections = WebAssembly.Module.customSections(module, 'memoizedRuleCount');\n assert(sections.length === 1, 'Expected one memoizedRuleCount section');\n const view = new DataView(sections[0]);\n const count = view.getUint32(0, true); // little-endian\n (this._instance as any).exports.setNumMemoizedRules(count);\n }\n\n /** @internal */\n _manage(result: MatchResult): void {\n result._managed = true;\n }\n\n /** @internal */\n _dispose(result: MatchResult): void {\n assert(\n this._resultStack.at(-1) === result,\n `You can only dispose() the most recent MatchResult`\n );\n this._resultStack.pop();\n // Reset the bump-pointer allocator to the watermark recorded before this\n // match. Because disposal is LIFO, this frees exactly this match's\n // allocations (memo table + CST nodes) while keeping earlier ones intact.\n (this._instance as any).exports.__offset.value = result._heapWatermark;\n result._attached = false;\n result._ctx.view = new DataView(new ArrayBuffer(0));\n }\n\n static async instantiate(source: BufferSource): Promise<Grammar> {\n return new Grammar()._instantiate(source);\n }\n\n static async instantiateStreaming(source: Response | Promise<Response>): Promise<Grammar> {\n return new Grammar()._instantiateStreaming(source);\n }\n\n /** @internal */\n async _instantiate(source: BufferSource, debugImports: any = {}): Promise<Grammar> {\n const {module, instance} = await WebAssembly.instantiate(\n source,\n {\n ...this._imports,\n debug: debugImports,\n },\n // @ts-expect-error: Expected 1-2 arguments, but got 3.\n compileOptions\n );\n return this._init(module, instance);\n }\n\n /** @internal */\n async _instantiateStreaming(\n source: Response | Promise<Response>,\n debugImports: any = {}\n ): Promise<Grammar> {\n const {module, instance} = await WebAssembly.instantiateStreaming(\n source,\n {\n ...this._imports,\n debug: debugImports,\n },\n // @ts-expect-error: TS2554: Expected 1-2 arguments, but got 3.\n compileOptions\n );\n return this._init(module, instance);\n }\n\n /** @internal */\n private _getGrammarName(module: WebAssembly.Module): string {\n const sections = WebAssembly.Module.customSections(module, 'name');\n assert(sections.length === 1, `Expected one name section, found ${sections.length}`);\n const data = new Uint8Array(sections[0]);\n return utf8.decode(data);\n }\n\n /** @internal */\n private _extractStrings(module: WebAssembly.Module): void {\n assert(this._ruleNames.length === 0);\n assert(this._ruleIds.size === 0);\n for (const ruleName of parseStringTable(module, 'ruleNames')) {\n this._ruleIds.set(ruleName, this._ruleIds.size);\n this._ruleNames.push(ruleName);\n }\n for (const str of parseStringTable(module, 'failureDescriptions')) {\n this._failureDescriptions.push(str);\n }\n }\n\n match<T>(input: string, ruleName?: string): MatchResult {\n assert(\n this._resultStack.every(r => r._managed),\n 'Cannot match while there are unmanaged MatchResults. ' +\n 'Use `using` or `.use()` to manage the MatchResult lifecycle.'\n );\n this._input = input;\n if (typeof process !== 'undefined' && process.env.OHM_DEBUG === '1') debugger; // eslint-disable-line no-debugger\n const exports = (this._instance as any).exports;\n const ruleId = checkNotNull(\n this._ruleIds.get(ruleName || this._ruleNames[0]),\n `unknown rule: '${ruleName}'`\n );\n const heapWatermark = exports.__offset.value;\n const succeeded = exports.match(input, ruleId);\n const buffer = exports.memory.buffer;\n\n // If the Wasm match triggered memory.grow() (e.g. for the memo table or\n // CST nodes), the old ArrayBuffer is detached. Refresh the DataView in\n // all existing match contexts so that their CstNodes can still read data.\n for (const r of this._resultStack) {\n if (r._ctx.view.buffer !== buffer) {\n r._ctx.view = new DataView(buffer);\n }\n }\n\n const ctx: MatchContext = {\n ruleNames: this._ruleNames,\n view: new DataView(buffer),\n input: exports.input.value,\n };\n const result = createMatchResult(this, ruleName || this._ruleNames[0], ctx, !!succeeded);\n result._heapWatermark = heapWatermark;\n result.dispose = this._dispose.bind(this, result);\n this._resultStack.push(result);\n return result;\n }\n\n /** @internal */\n recordFailures(): number[] {\n const {exports} = this._instance as any;\n exports.recordFailures(this._ruleIds.get(this._ruleNames[0]));\n const ans: number[] = [];\n for (let i = 0; i < exports.getRecordedFailuresLength(); i++) {\n if (!exports.isFluffy(i)) {\n // Filter out fluffy failures\n ans.push(exports.recordedFailuresAt(i));\n }\n }\n // Deduplicate\n return [...new Set(ans)];\n }\n\n getFailureDescription(id: number): string {\n return this._failureDescriptions[id];\n }\n\n getMemorySizeBytes(): number {\n return (this._instance as any).exports.memory.buffer.byteLength;\n }\n\n /** @internal Read an AssemblyScript string from Wasm linear memory. */\n private _readASString(ptr: number): string {\n if (!ptr || !this._instance) return '(unknown)';\n try {\n const buffer = (this._instance as any).exports.memory.buffer;\n // AS managed object layout: rtSize (byte length) is at ptr - 4.\n const byteLen = new DataView(buffer).getUint32(ptr - 4, true);\n return utf16le.decode(new Uint8Array(buffer, ptr, byteLen));\n } catch {\n return `(ptr=${ptr})`;\n }\n }\n\n /** @internal */\n _getCstRoot(ctx?: MatchContext): CstNode {\n const {exports} = this._instance as any;\n ctx ??= {\n ruleNames: this._ruleNames,\n view: new DataView(exports.memory.buffer),\n input: exports.input.value,\n };\n const firstNode = new CstNodeImpl(ctx, exports.bindingsAt(0), 0);\n assert(firstNode.isNonterminal());\n if (firstNode.ctorName !== '$spaces') {\n return firstNode;\n }\n assert(exports.getBindingsLength() > 1 && firstNode.ctorName === '$spaces');\n const nextAddr = exports.bindingsAt(1);\n const root = new CstNodeImpl(ctx, nextAddr, firstNode.matchLength);\n root.leadingSpaces = firstNode;\n return root as CstNode;\n }\n\n /** @internal */\n private _fillInputBuffer(ptr: number, length: number): number {\n const encoder = new TextEncoder();\n const {memory} = (this._instance as any).exports;\n const buf = new Uint8Array(memory.buffer, ptr, length);\n const {read, written} = encoder.encodeInto(this._input, buf);\n assert(read === this._input.length, 'Input was not fully read');\n return written;\n }\n\n getRightmostFailurePosition(): number {\n return (this._instance as any).exports.rightmostFailurePos.value;\n }\n}\n\ninterface MatchContext {\n ruleNames: string[];\n view: DataView;\n input: string;\n}\n\nexport type CstNode = NonterminalNode | TerminalNode | ListNode | OptNode | SeqNode;\nexport type CstNodeChildren = readonly CstNode[];\n\nexport interface CstNodeBase {\n ctorName: string;\n source: {startIdx: number; endIdx: number};\n sourceString: string;\n matchLength: number;\n\n isNonterminal(): this is NonterminalNode;\n isTerminal(): this is TerminalNode;\n isOptional(): this is OptNode;\n isSeq(): this is SeqNode;\n isList(): this is ListNode;\n}\n\nexport interface NonterminalNode<TChildren extends CstNodeChildren = CstNodeChildren>\n extends CstNodeBase {\n type: typeof CstNodeType.NONTERMINAL;\n ctorName: string;\n leadingSpaces?: NonterminalNode;\n children: TChildren;\n\n isSyntactic(): boolean;\n isLexical(): boolean;\n}\n\nexport interface TerminalNode extends CstNodeBase {\n type: typeof CstNodeType.TERMINAL;\n ctorName: '_terminal';\n leadingSpaces?: NonterminalNode;\n children: readonly [];\n value: string;\n}\n\nexport interface ListNode<TNode extends CstNode = CstNode> extends CstNodeBase {\n type: typeof CstNodeType.LIST;\n ctorName: '_list';\n children: readonly TNode[];\n collect: <R>(cb: (...children: CstNode[]) => R) => R[];\n}\n\nexport interface OptNode<TChild extends CstNode = CstNode> extends CstNodeBase {\n type: typeof CstNodeType.OPT;\n ctorName: '_opt';\n children: [] | [TChild];\n\n // If the child is a SeqNode, the `consume` callback receives its unpacked children.\n // Otherwise, it receives the child node itself.\n ifPresent<R>(\n consume: TChild extends SeqNode<infer T> ? (...children: T) => R : (child: TChild) => R,\n orElse?: () => R\n ): R;\n ifPresent<R>(\n consume: TChild extends SeqNode<infer T> ? (...children: T) => R : (child: TChild) => R\n ): R | undefined;\n isPresent(): boolean;\n isEmpty(): boolean;\n}\n\nexport interface SeqNode<TChildren extends CstNodeChildren = CstNodeChildren>\n extends CstNodeBase {\n type: typeof CstNodeType.SEQ;\n ctorName: '_seq';\n children: TChildren;\n unpack: <R>(cb: (...children: TChildren) => R) => R;\n}\n\nclass CstNodeImpl implements CstNodeBase {\n _ctx!: MatchContext;\n _children?: CstNodeChildren = undefined;\n _base: number;\n startIdx: number;\n leadingSpaces?: NonterminalNode = undefined;\n source: {startIdx: number; endIdx: number};\n\n constructor(ctx: MatchContext, ptr: number, startIdx: number) {\n // Non-enumerable properties\n Object.defineProperties(this, {\n _ctx: {value: ctx},\n _children: {writable: true},\n });\n this._base = ptr;\n this.startIdx = startIdx;\n this.source = {\n startIdx,\n endIdx: startIdx + this.sourceString.length,\n };\n if (this.matchRecordType === MatchRecordType.TERMINAL || this.count === 0) {\n this._children = EMPTY_CHILDREN;\n }\n }\n\n get type(): CstNodeType {\n switch (this._typeAndDetails & MATCH_RECORD_TYPE_MASK) {\n case MatchRecordType.NONTERMINAL:\n return CstNodeType.NONTERMINAL;\n case MatchRecordType.TERMINAL:\n return CstNodeType.TERMINAL;\n case MatchRecordType.ITER_FLAG:\n return CstNodeType.LIST;\n default:\n throw new Error('unreachable');\n }\n }\n\n private get matchRecordType(): MatchRecordType {\n return (this._typeAndDetails & MATCH_RECORD_TYPE_MASK) as MatchRecordType;\n }\n\n isNonterminal(): this is NonterminalNode {\n return this.type === CstNodeType.NONTERMINAL;\n }\n\n isTerminal(): this is TerminalNode {\n return this.type === CstNodeType.TERMINAL;\n }\n\n isList(): this is ListNode {\n return this.type === CstNodeType.LIST;\n }\n\n isOptional(): this is OptNode {\n return this.type === CstNodeType.OPT;\n }\n\n isSeq(): this is SeqNode {\n return this.type === CstNodeType.SEQ;\n }\n\n get ctorName(): string {\n switch (this.type) {\n case CstNodeType.NONTERMINAL: {\n const {ruleNames, view} = this._ctx;\n const ruleId = view.getInt32(this._base + 8, true) >>> 2;\n return ruleNames[ruleId].split('<')[0];\n }\n case CstNodeType.TERMINAL:\n return '_terminal';\n case CstNodeType.LIST:\n return '_list';\n case CstNodeType.OPT:\n return '_opt';\n case CstNodeType.SEQ:\n return '_seq';\n }\n }\n\n get count(): number {\n return this._ctx.view.getUint32(this._base, true);\n }\n\n get matchLength(): number {\n return this._ctx.view.getUint32(this._base + 4, true);\n }\n\n get _typeAndDetails(): number {\n return this._ctx.view.getInt32(this._base + 8, true);\n }\n\n get arity(): number {\n return this._typeAndDetails >>> 2;\n }\n\n get children(): CstNodeChildren {\n if (!this._children) {\n this._children = this._computeChildren().map((n): CstNode => {\n const {matchRecordType} = n;\n if (matchRecordType === MatchRecordType.OPTIONAL) {\n const child: CstNode | undefined =\n n.children.length <= 1\n ? n.children[0]\n : new SeqNodeImpl(n.children, n.source, n.sourceString);\n return new OptNodeImpl(child, n.source, n.sourceString);\n } else if (matchRecordType === MatchRecordType.ITER_FLAG) {\n if (n.arity <= 1) {\n return new ListNodeImpl(n.children, n.source, n.sourceString);\n }\n const arr: CstNode[] = [];\n let startIdx = n.startIdx;\n for (let i = 0; i < n.children.length; i += n.arity) {\n // FIXME: We don't need any of this nonsense if we actually build the SeqNodes at parse time.\n const seqChildren = n.children.slice(i, i + n.arity);\n const endIdx = checkNotNull(seqChildren.at(-1)).source.endIdx;\n const sourceString = n._ctx.input.slice(startIdx, endIdx);\n arr.push(new SeqNodeImpl(seqChildren, {startIdx, endIdx}, sourceString));\n startIdx = endIdx;\n }\n assert(startIdx === n.source.endIdx);\n return new ListNodeImpl(arr, n.source, n.sourceString);\n }\n return n as CstNode; // FIXME\n });\n }\n return this._children;\n }\n\n _computeChildren(): CstNodeImpl[] {\n const children: CstNodeImpl[] = [];\n const {ruleNames, view, input} = this._ctx;\n let spaces: NonterminalNode | undefined;\n let {startIdx} = this;\n for (let i = 0; i < this.count; i++) {\n const slotOffset = this._base + 16 + i * 4;\n const ptr = view.getUint32(slotOffset, true);\n // TODO: Avoid allocating $spaces nodes altogether?\n const node = new CstNodeImpl(this._ctx, ptr, startIdx);\n if (\n node.matchRecordType === MatchRecordType.NONTERMINAL &&\n node.ctorName === '$spaces'\n ) {\n assert(!spaces, 'Multiple $spaces nodes found');\n spaces = node as NonterminalNode; // FIXME\n } else {\n if (spaces) {\n node.leadingSpaces = spaces;\n spaces = undefined;\n }\n children.push(node);\n }\n startIdx += node.matchLength;\n }\n assert(spaces === undefined, 'Unclaimed $spaces!');\n return children;\n }\n\n get sourceString(): string {\n return this._ctx.input.slice(this.startIdx, this.startIdx + this.matchLength);\n }\n\n isSyntactic(): boolean {\n assert(this.isNonterminal(), 'Not a nonterminal');\n const firstChar = this.ctorName[0];\n return firstChar === firstChar.toUpperCase();\n }\n\n isLexical(): boolean {\n assert(this.isNonterminal(), 'Not a nonterminal');\n return !this.isSyntactic();\n }\n\n toString(): string {\n const ctorName = this.isTerminal() ? '_terminal' : this.isSeq() ? '_iter' : this.ctorName;\n const {sourceString, startIdx} = this;\n return `CstNode {ctorName: ${ctorName}, sourceString: ${sourceString}, startIdx: ${startIdx} }`;\n }\n}\n\nabstract class WrapperNode implements CstNodeBase {\n abstract ctorName: string;\n source: {startIdx: number; endIdx: number};\n sourceString: string;\n\n constructor(source: {startIdx: number; endIdx: number}, sourceString: string) {\n this.source = source;\n this.sourceString = sourceString;\n }\n\n get matchLength(): number {\n return this.sourceString.length;\n }\n\n isNonterminal(): this is NonterminalNode {\n return false;\n }\n isTerminal(): this is TerminalNode {\n return false;\n }\n isOptional(): this is OptNode {\n return false;\n }\n isSeq(): this is SeqNode {\n return false;\n }\n isList(): this is ListNode {\n return false;\n }\n}\n\nclass SeqNodeImpl<TChildren extends CstNodeChildren = CstNodeChildren>\n extends WrapperNode\n implements SeqNode<TChildren>\n{\n type: typeof CstNodeType.SEQ = CstNodeType.SEQ;\n ctorName = '_seq' as const;\n children: TChildren;\n\n constructor(\n children: TChildren,\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = children;\n }\n\n override isSeq(): this is SeqNode {\n return true;\n }\n\n unpack<R>(cb: (...args: TChildren) => R): R {\n assert(\n cb.length === this.children.length,\n `bad arity: expected ${this.children.length}, got ${cb.length}`\n );\n return cb.call(null, ...this.children); // FIXME\n }\n}\n\nclass ListNodeImpl<TNode extends CstNode = CstNode>\n extends WrapperNode\n implements ListNode<TNode>\n{\n type: typeof CstNodeType.LIST = CstNodeType.LIST;\n ctorName = '_list' as const;\n children: readonly TNode[];\n\n constructor(\n children: readonly TNode[],\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = children;\n }\n\n override isList(): this is ListNode {\n return true;\n }\n\n collect<R>(cb: (...args: CstNode[]) => R): R[] {\n return this.children.map(c => {\n return c?.isSeq() ? c.unpack(cb) : cb(c);\n });\n }\n}\n\nclass OptNodeImpl<TNode extends CstNode = CstNode>\n extends WrapperNode\n implements OptNode<TNode>\n{\n type: typeof CstNodeType.OPT = CstNodeType.OPT;\n ctorName = '_opt' as const;\n children: [] | [TNode];\n\n constructor(\n child: TNode | undefined,\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = child ? [child] : [];\n }\n\n override isOptional(): this is OptNode {\n return true;\n }\n\n ifPresent<R>(\n consume: TNode extends SeqNode<infer T> ? (...children: T) => R : (child: TNode) => R,\n orElse?: () => R\n ): R | undefined {\n const child = this.children[0];\n if (child) {\n return child.isSeq()\n ? child.unpack(consume as (...children: any[]) => R)\n : (consume as (child: TNode) => R)(child);\n }\n if (orElse) return orElse();\n }\n\n isPresent(): boolean {\n return this.children.length > 0;\n }\n\n isEmpty(): boolean {\n return this.children.length === 0;\n }\n}\n\nexport abstract class MatchResult {\n // Note: This is different from the JS implementation, which has:\n // matcher: Matcher;\n // …instead.\n grammar: Grammar;\n startExpr: string;\n /** @internal */\n _ctx: MatchContext;\n /** @internal */\n _succeeded: boolean;\n /** @internal */\n _attached = true;\n /** @internal */\n _managed = false;\n /** @internal */\n _heapWatermark = 0;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n ) {\n this.grammar = grammar;\n this.startExpr = startExpr;\n this._ctx = ctx;\n this._succeeded = succeeded;\n }\n\n get input(): string {\n return (this.grammar as any)._input;\n }\n\n // `using` accesses [Symbol.dispose] at declaration time to get the\n // disposal method. We use this as the signal that the result is managed.\n get [Symbol.dispose](): () => void {\n this.grammar._manage(this);\n return () => this.dispose();\n }\n\n dispose(): void {\n throw new Error('MatchResult is not attached to any grammar');\n }\n\n succeeded(): this is SucceededMatchResult {\n return this._succeeded;\n }\n\n failed(): this is FailedMatchResult {\n return !this._succeeded;\n }\n\n toString(): string {\n return this.failed()\n ? '[match failed at position ' + this.getRightmostFailurePosition() + ']'\n : '[match succeeded]';\n }\n\n use<T>(cb: (r: this) => T): T {\n this.grammar._manage(this);\n try {\n return cb(this);\n } finally {\n this.dispose();\n }\n }\n}\n\nfunction createMatchResult(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n): MatchResult {\n return succeeded\n ? new SucceededMatchResult(grammar, startExpr, ctx, succeeded)\n : new FailedMatchResult(\n grammar,\n startExpr,\n ctx,\n succeeded,\n grammar.getRightmostFailurePosition()\n );\n}\n\nexport class SucceededMatchResult extends MatchResult {\n /** @internal */\n _cst: CstNode;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n ) {\n super(grammar, startExpr, ctx, succeeded);\n this._cst = grammar._getCstRoot(ctx);\n }\n\n getCstRoot(): CstNode {\n return this._cst;\n }\n}\n\nexport class FailedMatchResult extends MatchResult {\n /** @internal */\n _rightmostFailurePosition: number;\n /** @internal */\n private _rightmostFailures: Failure[] | null = null;\n /** @internal */\n private _failureDescriptions: string[] | null = null;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean,\n rightmostFailurePosition: number\n ) {\n super(grammar, startExpr, ctx, succeeded);\n this._rightmostFailurePosition = rightmostFailurePosition;\n }\n\n /** @internal */\n private _assertAttached(property: string) {\n if (!this._attached) {\n throw new Error(\n `Cannot access '${property}' after MatchResult has been disposed. ` +\n `Access failure information before calling dispose(), or use result.use().`\n );\n }\n }\n\n getRightmostFailurePosition(): number {\n return this._rightmostFailurePosition;\n }\n\n getRightmostFailures(): Failure[] {\n if (this._rightmostFailures === null) {\n this._assertAttached('getRightmostFailures()');\n const {exports} = (this.grammar as any)._instance;\n const ruleIds = (this.grammar as any)._ruleIds;\n const ruleNames = (this.grammar as any)._ruleNames;\n exports.recordFailures(ruleIds.get(ruleNames[0]));\n\n // Use a Map to deduplicate by description while preserving fluffy status.\n // A failure is only fluffy if ALL occurrences are fluffy.\n const failureMap = new Map<string, boolean>();\n const len = exports.getRecordedFailuresLength();\n for (let i = 0; i < len; i++) {\n const id = exports.recordedFailuresAt(i);\n const desc = this.grammar.getFailureDescription(id);\n const fluffy = exports.isFluffy(i);\n if (failureMap.has(desc)) {\n // Only keep fluffy=true if both are fluffy\n failureMap.set(desc, failureMap.get(desc)! && fluffy);\n } else {\n failureMap.set(desc, fluffy);\n }\n }\n\n this._rightmostFailures = Array.from(failureMap.entries()).map(\n ([desc, fluffy]) => new Failure(desc, fluffy)\n );\n }\n return this._rightmostFailures;\n }\n\n // Get the non-fluffy failure descriptions.\n /** @internal */\n private _getFailureDescriptions(): string[] {\n if (this._failureDescriptions === null) {\n this._failureDescriptions = this.getRightmostFailures()\n .filter(f => !f.isFluffy())\n .map(f => f.toString());\n }\n return this._failureDescriptions;\n }\n\n // Return a string summarizing the expected contents of the input stream when\n // the match failure occurred.\n getExpectedText(): string {\n assert(!this._succeeded, 'cannot get expected text of a successful MatchResult');\n const descriptions = this._getFailureDescriptions();\n switch (descriptions.length) {\n case 0:\n return '';\n case 1:\n return descriptions[0];\n case 2:\n return descriptions[0] + ' or ' + descriptions[1];\n default:\n // For 3+ items: \"a, b, or c\"\n return (\n descriptions.slice(0, -1).join(', ') +\n ', or ' +\n descriptions[descriptions.length - 1]\n );\n }\n }\n\n getInterval(): Interval {\n const pos = this.getRightmostFailurePosition();\n return new Interval(this.input, pos, pos);\n }\n\n get message(): string {\n const detail = 'Expected ' + this.getExpectedText();\n return getLineAndColumnMessage(this.input, this.getRightmostFailurePosition()) + detail;\n }\n\n get shortMessage(): string {\n const detail = 'expected ' + this.getExpectedText();\n const errorInfo = getLineAndColumn(this.input, this.getRightmostFailurePosition());\n return 'Line ' + errorInfo.lineNum + ', col ' + errorInfo.colNum + ': ' + detail;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../src/assert.ts","../src/extras.ts","../src/miniohm.ts"],"sourcesContent":["export function assert(cond: boolean, message = 'Assertion failed'): asserts cond {\n if (!cond) throw new Error(message);\n}\n\nexport function checkNotNull<T>(x: T, msg = 'unexpected null value'): NonNullable<T> {\n assert(x != null, msg);\n return x as NonNullable<T>;\n}\n","// Self-contained copies of getLineAndColumn / getLineAndColumnMessage,\n// originally from packages/ohm-js/src/util.js. Inlined here so the runtime\n// package has zero dependency on the legacy engine.\n\nfunction repeatStr(str: string, n: number): string {\n return new Array(n + 1).join(str);\n}\n\nfunction padLeft(str: string, len: number, ch = ' '): string {\n if (str.length < len) {\n return repeatStr(ch, len - str.length) + str;\n }\n return str;\n}\n\nfunction padNumbersToEqualLength(arr: number[]): string[] {\n let maxLen = 0;\n const strings = arr.map(n => {\n const str = n.toString();\n maxLen = Math.max(maxLen, str.length);\n return str;\n });\n return strings.map(s => padLeft(s, maxLen));\n}\n\nfunction strcpy(dest: string, src: string, offset: number): string {\n const origDestLen = dest.length;\n const start = dest.slice(0, offset);\n const end = dest.slice(offset + src.length);\n return (start + src + end).substr(0, origDestLen);\n}\n\ninterface LineAndColumnInfo {\n offset: number;\n lineNum: number;\n colNum: number;\n line: string;\n prevLine: string | null;\n nextLine: string | null;\n toString(...ranges: [number, number][]): string;\n}\n\nfunction lineAndColumnToMessage(\n this: LineAndColumnInfo,\n ...ranges: [number, number][]\n): string {\n const lineAndCol = this;\n const {offset} = lineAndCol;\n\n let result = '';\n result += 'Line ' + lineAndCol.lineNum + ', col ' + lineAndCol.colNum + ':\\n';\n\n const lineNumbers = padNumbersToEqualLength([\n lineAndCol.prevLine == null ? 0 : lineAndCol.lineNum - 1,\n lineAndCol.lineNum,\n lineAndCol.nextLine == null ? 0 : lineAndCol.lineNum + 1,\n ]);\n\n const appendLine = (num: number, content: string, prefix: string) => {\n result += prefix + lineNumbers[num] + ' | ' + content + '\\n';\n };\n\n if (lineAndCol.prevLine != null) {\n appendLine(0, lineAndCol.prevLine, ' ');\n }\n appendLine(1, lineAndCol.line, '> ');\n\n const lineLen = lineAndCol.line.length;\n let indicationLine = repeatStr(' ', lineLen + 1);\n for (let i = 0; i < ranges.length; ++i) {\n let startIdx = ranges[i][0];\n let endIdx = ranges[i][1];\n if (!(startIdx >= 0 && startIdx <= endIdx)) {\n throw new Error('range start must be >= 0 and <= end');\n }\n\n const lineStartOffset = offset - lineAndCol.colNum + 1;\n startIdx = Math.max(0, startIdx - lineStartOffset);\n endIdx = Math.min(endIdx - lineStartOffset, lineLen);\n\n indicationLine = strcpy(indicationLine, repeatStr('~', endIdx - startIdx), startIdx);\n }\n const gutterWidth = 2 + lineNumbers[1].length + 3;\n result += repeatStr(' ', gutterWidth);\n indicationLine = strcpy(indicationLine, '^', lineAndCol.colNum - 1);\n result += indicationLine.replace(/ +$/, '') + '\\n';\n\n if (lineAndCol.nextLine != null) {\n appendLine(2, lineAndCol.nextLine, ' ');\n }\n return result;\n}\n\nexport function getLineAndColumn(str: string, offset: number): LineAndColumnInfo {\n let lineNum = 1;\n let colNum = 1;\n\n let currOffset = 0;\n let lineStartOffset = 0;\n\n let nextLine: string | null = null;\n let prevLine: string | null = null;\n let prevLineStartOffset = -1;\n\n while (currOffset < offset) {\n const c = str.charAt(currOffset++);\n if (c === '\\n') {\n lineNum++;\n colNum = 1;\n prevLineStartOffset = lineStartOffset;\n lineStartOffset = currOffset;\n } else if (c !== '\\r') {\n colNum++;\n }\n }\n\n // Find the end of the target line.\n let lineEndOffset = str.indexOf('\\n', lineStartOffset);\n if (lineEndOffset === -1) {\n lineEndOffset = str.length;\n } else {\n // Get the next line.\n const nextLineEndOffset = str.indexOf('\\n', lineEndOffset + 1);\n nextLine =\n nextLineEndOffset === -1\n ? str.slice(lineEndOffset)\n : str.slice(lineEndOffset, nextLineEndOffset);\n // Strip leading and trailing EOL char(s).\n nextLine = nextLine.replace(/^\\r?\\n/, '').replace(/\\r$/, '');\n }\n\n // Get the previous line.\n if (prevLineStartOffset >= 0) {\n // Strip trailing EOL char(s).\n prevLine = str.slice(prevLineStartOffset, lineStartOffset).replace(/\\r?\\n$/, '');\n }\n\n // Get the target line, stripping a trailing carriage return if necessary.\n const line = str.slice(lineStartOffset, lineEndOffset).replace(/\\r$/, '');\n\n return {\n offset,\n lineNum,\n colNum,\n line,\n prevLine,\n nextLine,\n toString: lineAndColumnToMessage,\n };\n}\n\nexport function getLineAndColumnMessage(\n str: string,\n offset: number,\n ...ranges: [number, number][]\n): string {\n return getLineAndColumn(str, offset).toString(...ranges);\n}\n","import {assert, checkNotNull} from './assert.ts';\nimport {getLineAndColumn, getLineAndColumnMessage} from './extras.ts';\n\nconst MATCH_RECORD_TYPE_MASK = 0b11;\n\n// A MatchRecord is the representation of a CstNode in Wasm linear memory.\nconst MatchRecordType = {\n NONTERMINAL: 0,\n TERMINAL: 1,\n ITER_FLAG: 2,\n OPTIONAL: 3,\n} as const;\n\n// A _CST node_ is the user-facing representation, built from a match record.\nexport const CstNodeType = {\n NONTERMINAL: 0,\n TERMINAL: 1,\n LIST: 2,\n OPT: 3,\n SEQ: 4,\n} as const;\n\n// Define types with the same name as the values above. This gives us roughly the\n// same functionality as a TypeScript enum, but works with erasableSyntaxOnly.\ntype MatchRecordType = (typeof MatchRecordType)[keyof typeof MatchRecordType];\nexport type CstNodeType = (typeof CstNodeType)[keyof typeof CstNodeType];\n\nconst EMPTY_CHILDREN: ReadonlyArray<CstNode> = Object.freeze([]);\n\nconst compileOptions = {\n builtins: ['js-string'],\n};\n\n// Bit flags for Unicode categories, based on the order that they appear in\n// https://www.unicode.org/Public/16.0.0/ucd/extracted/DerivedGeneralCategory.txt\n\nconst UnicodeCategoryNames = [\n 'Cn', // Unassigned\n 'Lu', // Uppercase_Letter\n 'Ll', // Lowercase_Letter\n 'Lt', // Titlecase_Letter\n 'Lm', // Modifier_Letter\n 'Lo', // Other_Letter\n];\n\nconst utf8 = new TextDecoder('utf-8');\nconst utf16le = new TextDecoder('utf-16le');\n\n// Minimal implementation of Interval (for FailedMatchResult)\nexport class Interval {\n startIdx: number;\n endIdx: number;\n /** @internal */\n private _sourceString: string;\n\n constructor(sourceString: string, startIdx: number, endIdx: number) {\n this._sourceString = sourceString;\n this.startIdx = startIdx;\n this.endIdx = endIdx;\n }\n\n get sourceString(): string {\n return this._sourceString;\n }\n\n get contents(): string {\n return this._sourceString.slice(this.startIdx, this.endIdx);\n }\n}\n\nexport class Failure {\n /** @internal */\n private _description: string;\n /** @internal */\n private _fluffy: boolean;\n\n constructor(description: string, fluffy: boolean) {\n this._description = description;\n this._fluffy = fluffy;\n }\n\n isFluffy(): boolean {\n return this._fluffy;\n }\n\n toString(): string {\n return this._description;\n }\n}\n\nfunction regexFromCategoryBitmap(bitmap: number): RegExp {\n const cats: string[] = [];\n for (let i = 0; i < 32; i++) {\n const mask = 1 << i;\n if (bitmap & mask) cats.push(UnicodeCategoryNames[i]);\n }\n return new RegExp(\n cats.map(cat => `\\\\p{${cat}}`).join('|'),\n 'uy' // u: unicode, y: sticky\n );\n}\n\nfunction parseStringTable(module: WebAssembly.Module, sectionName: string): string[] {\n const sections = WebAssembly.Module.customSections(module, sectionName);\n assert(\n sections.length === 1,\n `Expected one ${sectionName} section, found ${sections.length}`\n );\n\n const data = new Uint8Array(sections[0]);\n const dataView = new DataView(data.buffer);\n let offset = 0;\n\n const parseU32 = (): number => {\n // Quick 'n dirty ULeb128 parsing, assuming no more than 2 bytes.\n const b1 = dataView.getUint8(offset++);\n let value = b1 & 0x7f;\n if (b1 & 0x80) {\n const b2 = dataView.getUint8(offset++);\n assert((b2 & 0x80) === 0, 'Expected max two bytes');\n value |= (b2 & 0x7f) << 7;\n }\n return value;\n };\n\n const numEntries = parseU32();\n const ans: string[] = [];\n for (let i = 0; i < numEntries; i++) {\n const stringLen = parseU32();\n const bytes = data.slice(offset, offset + stringLen);\n offset += stringLen;\n const name = utf8.decode(bytes);\n ans.push(name);\n }\n return ans;\n}\n\nexport class Grammar {\n name = '';\n\n /** @internal */\n private _instance?: WebAssembly.Instance = undefined;\n /** @internal */\n private _imports = {\n // System-level AssemblyScript imports.\n env: {\n abort: (msgPtr: number, filePtr: number, line: number, column: number) => {\n const msg = this._readASString(msgPtr);\n const file = this._readASString(filePtr);\n throw new Error(`Wasm abort: ${msg} at ${file}:${line}:${column}`);\n },\n },\n // For imports from ohmRuntime.ts.\n ohmRuntime: {\n printI32(val: number) {\n // eslint-disable-next-line no-console\n console.log(val);\n },\n isRuleSyntactic: (ruleId: number) => {\n // TODO: Precompute this for all rules, and encode it in the module?\n const name = this._ruleNames[ruleId];\n assert(!!name);\n return name[0] === name[0].toUpperCase();\n },\n fillInputBuffer: this._fillInputBuffer.bind(this),\n matchUnicodeChar: (catBitmap: number) => {\n const {input, pos} = (this._instance as any).exports;\n const re = regexFromCategoryBitmap(catBitmap);\n re.lastIndex = pos;\n const arr = re.exec(input.value);\n if (arr) {\n pos.value += arr[0].length;\n }\n return !!arr;\n },\n matchCaseInsensitive: (() => {\n const cache: RegExp[] = [];\n return (stringIdx: number) => {\n const {input, pos} = (this._instance as any).exports;\n let re = cache[stringIdx];\n if (!re) {\n // The pattern is pre-escaped at compile time.\n re = cache[stringIdx] = new RegExp(this._strings[stringIdx], 'iy');\n }\n re.lastIndex = pos.value;\n const arr = re.exec(input.value);\n if (arr) {\n pos.value += arr[0].length;\n }\n return !!arr;\n };\n })(),\n },\n // Include a polyfill for js-string builtins for engines that don't\n // support that feature (e.g., Safari).\n 'wasm:js-string': {\n length(str: string): number {\n return str.length;\n },\n charCodeAt(str: string, idx: number): number {\n // NOTE: `index` is interpreted as a signed 32-bit integer when converted to\n // a JS value using standard conversions. Reinterpret as unsigned here.\n idx >>>= 0;\n assert(idx < str.length, 'string index out of bounds');\n return str.charCodeAt(idx);\n },\n },\n };\n /** @internal */\n private _ruleIds = new Map<string, number>();\n /** @internal */\n private _ruleNames: string[] = [];\n /** @internal */\n private _input = '';\n\n /** @internal */\n public _strings: string[] = [];\n\n /*\n * Wasm heap memory management\n * ===========================\n *\n * The Wasm module uses a bump-pointer allocator (AssemblyScript's \"stub\"\n * runtime). Each match() call allocates a memo table and CST nodes on\n * the Wasm heap. There is no way to free individual allocations — you\n * can only reset the bump pointer.\n *\n * To allow incremental freeing, we exploit two facts:\n *\n * 1. MatchResult disposal is LIFO — you must dispose the most recent\n * result first (enforced by an assert in _dispose).\n *\n * 2. Allocations for match N are always contiguous and sit above\n * match N-1's allocations on the heap.\n *\n * Before each match, we snapshot the bump pointer (`exports.__offset`)\n * as a \"watermark\" and store it on the MatchResult. On dispose, we\n * reset the bump pointer to that watermark, freeing exactly that\n * match's allocations while keeping earlier results intact.\n *\n * When the last result is disposed, its watermark equals the initial\n * heap offset, so the entire heap is reclaimed — equivalent to the\n * old resetHeap() approach, but without the all-or-nothing limitation.\n */\n\n /** @internal */\n private _resultStack: MatchResult[] = [];\n\n /**\n * Create a new Grammar object.\n * If `bytes` is specified, the WebAssembly module will be synchronously\n * compiled and instantiated. Use `instantiate` or `instantiateStreaming`\n * to instantiate asynchronously.\n */\n constructor(bytes?: BufferSource) {\n if (bytes) {\n // @ts-expect-error: TS2554: Expected 1 arguments, but got 2.\n const mod = new WebAssembly.Module(bytes, compileOptions);\n this._init(mod, new WebAssembly.Instance(mod, this._imports));\n }\n }\n\n /** @internal */\n private _init(module: WebAssembly.Module, instance: WebAssembly.Instance) {\n this._instance = instance;\n this._extractStrings(module);\n this.name = this._getGrammarName(module);\n return this;\n }\n\n /** @internal */\n _manage(result: MatchResult): void {\n result._managed = true;\n }\n\n /** @internal */\n _dispose(result: MatchResult): void {\n assert(\n this._resultStack.at(-1) === result,\n `You can only dispose() the most recent MatchResult`\n );\n this._resultStack.pop();\n // Reset the bump-pointer allocator to the watermark recorded before this\n // match. Because disposal is LIFO, this frees exactly this match's\n // allocations (memo table + CST nodes) while keeping earlier ones intact.\n (this._instance as any).exports.__offset.value = result._heapWatermark;\n result._attached = false;\n result._ctx.view = new DataView(new ArrayBuffer(0));\n }\n\n static async instantiate(source: BufferSource): Promise<Grammar> {\n return new Grammar()._instantiate(source);\n }\n\n static async instantiateStreaming(source: Response | Promise<Response>): Promise<Grammar> {\n return new Grammar()._instantiateStreaming(source);\n }\n\n /** @internal */\n async _instantiate(source: BufferSource, debugImports: any = {}): Promise<Grammar> {\n const {module, instance} = await WebAssembly.instantiate(\n source,\n {\n ...this._imports,\n debug: debugImports,\n },\n // @ts-expect-error: Expected 1-2 arguments, but got 3.\n compileOptions\n );\n return this._init(module, instance);\n }\n\n /** @internal */\n async _instantiateStreaming(\n source: Response | Promise<Response>,\n debugImports: any = {}\n ): Promise<Grammar> {\n const {module, instance} = await WebAssembly.instantiateStreaming(\n source,\n {\n ...this._imports,\n debug: debugImports,\n },\n // @ts-expect-error: TS2554: Expected 1-2 arguments, but got 3.\n compileOptions\n );\n return this._init(module, instance);\n }\n\n /** @internal */\n private _getGrammarName(module: WebAssembly.Module): string {\n const sections = WebAssembly.Module.customSections(module, 'name');\n assert(sections.length === 1, `Expected one name section, found ${sections.length}`);\n const data = new Uint8Array(sections[0]);\n return utf8.decode(data);\n }\n\n /** @internal */\n private _extractStrings(module: WebAssembly.Module): void {\n assert(this._ruleNames.length === 0);\n assert(this._ruleIds.size === 0);\n for (const ruleName of parseStringTable(module, 'ruleNames')) {\n this._ruleIds.set(ruleName, this._ruleIds.size);\n this._ruleNames.push(ruleName);\n }\n for (const str of parseStringTable(module, 'strings')) {\n this._strings.push(str);\n }\n }\n\n match<T>(input: string, ruleName?: string): MatchResult {\n assert(\n this._resultStack.every(r => r._managed),\n 'Cannot match while there are unmanaged MatchResults. ' +\n 'Use `using` or `.use()` to manage the MatchResult lifecycle.'\n );\n this._input = input;\n if (typeof process !== 'undefined' && process.env.OHM_DEBUG === '1') debugger; // eslint-disable-line no-debugger\n const exports = (this._instance as any).exports;\n const ruleId = checkNotNull(\n this._ruleIds.get(ruleName || this._ruleNames[0]),\n `unknown rule: '${ruleName}'`\n );\n const heapWatermark = exports.__offset.value;\n const succeeded = exports.match(input, ruleId);\n const buffer = exports.memory.buffer;\n\n // If the Wasm match triggered memory.grow() (e.g. for the memo table or\n // CST nodes), the old ArrayBuffer is detached. Refresh the DataView in\n // all existing match contexts so that their CstNodes can still read data.\n for (const r of this._resultStack) {\n if (r._ctx.view.buffer !== buffer) {\n r._ctx.view = new DataView(buffer);\n }\n }\n\n const ctx: MatchContext = {\n ruleNames: this._ruleNames,\n view: new DataView(buffer),\n input: exports.input.value,\n };\n const result = createMatchResult(this, ruleName || this._ruleNames[0], ctx, !!succeeded);\n result._heapWatermark = heapWatermark;\n result.dispose = this._dispose.bind(this, result);\n this._resultStack.push(result);\n return result;\n }\n\n /** @internal */\n recordFailures(): number[] {\n const {exports} = this._instance as any;\n exports.recordFailures(this._ruleIds.get(this._ruleNames[0]));\n const ans: number[] = [];\n for (let i = 0; i < exports.getRecordedFailuresLength(); i++) {\n if (!exports.isFluffy(i)) {\n // Filter out fluffy failures\n ans.push(exports.recordedFailuresAt(i));\n }\n }\n // Deduplicate\n return [...new Set(ans)];\n }\n\n getFailureDescription(id: number): string {\n return this._strings[id];\n }\n\n getMemorySizeBytes(): number {\n return (this._instance as any).exports.memory.buffer.byteLength;\n }\n\n /** @internal Read an AssemblyScript string from Wasm linear memory. */\n private _readASString(ptr: number): string {\n if (!ptr || !this._instance) return '(unknown)';\n try {\n const buffer = (this._instance as any).exports.memory.buffer;\n // AS managed object layout: rtSize (byte length) is at ptr - 4.\n const byteLen = new DataView(buffer).getUint32(ptr - 4, true);\n return utf16le.decode(new Uint8Array(buffer, ptr, byteLen));\n } catch {\n return `(ptr=${ptr})`;\n }\n }\n\n /** @internal */\n _getCstRoot(ctx?: MatchContext): CstNode {\n const {exports} = this._instance as any;\n ctx ??= {\n ruleNames: this._ruleNames,\n view: new DataView(exports.memory.buffer),\n input: exports.input.value,\n };\n const firstNode = new CstNodeImpl(ctx, exports.bindingsAt(0), 0);\n assert(firstNode.isNonterminal());\n if (firstNode.ctorName !== '$spaces') {\n return firstNode;\n }\n assert(exports.getBindingsLength() > 1 && firstNode.ctorName === '$spaces');\n const nextAddr = exports.bindingsAt(1);\n const root = new CstNodeImpl(ctx, nextAddr, firstNode.matchLength);\n root.leadingSpaces = firstNode;\n return root as CstNode;\n }\n\n /** @internal */\n private _fillInputBuffer(ptr: number, length: number): number {\n const encoder = new TextEncoder();\n const {memory} = (this._instance as any).exports;\n const buf = new Uint8Array(memory.buffer, ptr, length);\n const {read, written} = encoder.encodeInto(this._input, buf);\n assert(read === this._input.length, 'Input was not fully read');\n return written;\n }\n\n getRightmostFailurePosition(): number {\n return (this._instance as any).exports.rightmostFailurePos.value;\n }\n}\n\ninterface MatchContext {\n ruleNames: string[];\n view: DataView;\n input: string;\n}\n\nexport type CstNode = NonterminalNode | TerminalNode | ListNode | OptNode | SeqNode;\nexport type CstNodeChildren = readonly CstNode[];\n\nexport interface CstNodeBase {\n ctorName: string;\n source: {startIdx: number; endIdx: number};\n sourceString: string;\n matchLength: number;\n\n isNonterminal(): this is NonterminalNode;\n isTerminal(): this is TerminalNode;\n isOptional(): this is OptNode;\n isSeq(): this is SeqNode;\n isList(): this is ListNode;\n}\n\nexport interface NonterminalNode<TChildren extends CstNodeChildren = CstNodeChildren>\n extends CstNodeBase {\n type: typeof CstNodeType.NONTERMINAL;\n ctorName: string;\n leadingSpaces?: NonterminalNode;\n children: TChildren;\n\n isSyntactic(): boolean;\n isLexical(): boolean;\n}\n\nexport interface TerminalNode extends CstNodeBase {\n type: typeof CstNodeType.TERMINAL;\n ctorName: '_terminal';\n leadingSpaces?: NonterminalNode;\n children: readonly [];\n value: string;\n}\n\nexport interface ListNode<TNode extends CstNode = CstNode> extends CstNodeBase {\n type: typeof CstNodeType.LIST;\n ctorName: '_list';\n children: readonly TNode[];\n collect: <R>(cb: (...children: CstNode[]) => R) => R[];\n}\n\nexport interface OptNode<TChild extends CstNode = CstNode> extends CstNodeBase {\n type: typeof CstNodeType.OPT;\n ctorName: '_opt';\n children: [] | [TChild];\n\n // If the child is a SeqNode, the `consume` callback receives its unpacked children.\n // Otherwise, it receives the child node itself.\n ifPresent<R>(\n consume: TChild extends SeqNode<infer T> ? (...children: T) => R : (child: TChild) => R,\n orElse?: () => R\n ): R;\n ifPresent<R>(\n consume: TChild extends SeqNode<infer T> ? (...children: T) => R : (child: TChild) => R\n ): R | undefined;\n isPresent(): boolean;\n isEmpty(): boolean;\n}\n\nexport interface SeqNode<TChildren extends CstNodeChildren = CstNodeChildren>\n extends CstNodeBase {\n type: typeof CstNodeType.SEQ;\n ctorName: '_seq';\n children: TChildren;\n unpack: <R>(cb: (...children: TChildren) => R) => R;\n}\n\nclass CstNodeImpl implements CstNodeBase {\n _ctx!: MatchContext;\n _children?: CstNodeChildren = undefined;\n _base: number;\n startIdx: number;\n leadingSpaces?: NonterminalNode = undefined;\n source: {startIdx: number; endIdx: number};\n\n constructor(ctx: MatchContext, ptr: number, startIdx: number) {\n // Non-enumerable properties\n Object.defineProperties(this, {\n _ctx: {value: ctx},\n _children: {writable: true},\n });\n this._base = ptr;\n this.startIdx = startIdx;\n this.source = {\n startIdx,\n endIdx: startIdx + this.sourceString.length,\n };\n if (this.matchRecordType === MatchRecordType.TERMINAL || this.count === 0) {\n this._children = EMPTY_CHILDREN;\n }\n }\n\n get type(): CstNodeType {\n switch (this._typeAndDetails & MATCH_RECORD_TYPE_MASK) {\n case MatchRecordType.NONTERMINAL:\n return CstNodeType.NONTERMINAL;\n case MatchRecordType.TERMINAL:\n return CstNodeType.TERMINAL;\n case MatchRecordType.ITER_FLAG:\n return CstNodeType.LIST;\n default:\n throw new Error('unreachable');\n }\n }\n\n private get matchRecordType(): MatchRecordType {\n return (this._typeAndDetails & MATCH_RECORD_TYPE_MASK) as MatchRecordType;\n }\n\n isNonterminal(): this is NonterminalNode {\n return this.type === CstNodeType.NONTERMINAL;\n }\n\n isTerminal(): this is TerminalNode {\n return this.type === CstNodeType.TERMINAL;\n }\n\n isList(): this is ListNode {\n return this.type === CstNodeType.LIST;\n }\n\n isOptional(): this is OptNode {\n return this.type === CstNodeType.OPT;\n }\n\n isSeq(): this is SeqNode {\n return this.type === CstNodeType.SEQ;\n }\n\n get ctorName(): string {\n switch (this.type) {\n case CstNodeType.NONTERMINAL: {\n const {ruleNames, view} = this._ctx;\n const ruleId = view.getInt32(this._base + 8, true) >>> 2;\n return ruleNames[ruleId].split('<')[0];\n }\n case CstNodeType.TERMINAL:\n return '_terminal';\n case CstNodeType.LIST:\n return '_list';\n case CstNodeType.OPT:\n return '_opt';\n case CstNodeType.SEQ:\n return '_seq';\n }\n }\n\n get count(): number {\n return this._ctx.view.getUint32(this._base, true);\n }\n\n get matchLength(): number {\n return this._ctx.view.getUint32(this._base + 4, true);\n }\n\n get _typeAndDetails(): number {\n return this._ctx.view.getInt32(this._base + 8, true);\n }\n\n get arity(): number {\n return this._typeAndDetails >>> 2;\n }\n\n get children(): CstNodeChildren {\n if (!this._children) {\n this._children = this._computeChildren().map((n): CstNode => {\n const {matchRecordType} = n;\n if (matchRecordType === MatchRecordType.OPTIONAL) {\n const child: CstNode | undefined =\n n.children.length <= 1\n ? n.children[0]\n : new SeqNodeImpl(n.children, n.source, n.sourceString);\n return new OptNodeImpl(child, n.source, n.sourceString);\n } else if (matchRecordType === MatchRecordType.ITER_FLAG) {\n if (n.arity <= 1) {\n return new ListNodeImpl(n.children, n.source, n.sourceString);\n }\n const arr: CstNode[] = [];\n let startIdx = n.startIdx;\n for (let i = 0; i < n.children.length; i += n.arity) {\n // FIXME: We don't need any of this nonsense if we actually build the SeqNodes at parse time.\n const seqChildren = n.children.slice(i, i + n.arity);\n const endIdx = checkNotNull(seqChildren.at(-1)).source.endIdx;\n const sourceString = n._ctx.input.slice(startIdx, endIdx);\n arr.push(new SeqNodeImpl(seqChildren, {startIdx, endIdx}, sourceString));\n startIdx = endIdx;\n }\n assert(startIdx === n.source.endIdx);\n return new ListNodeImpl(arr, n.source, n.sourceString);\n }\n return n as CstNode; // FIXME\n });\n }\n return this._children;\n }\n\n _computeChildren(): CstNodeImpl[] {\n const children: CstNodeImpl[] = [];\n const {ruleNames, view, input} = this._ctx;\n let spaces: NonterminalNode | undefined;\n let {startIdx} = this;\n for (let i = 0; i < this.count; i++) {\n const slotOffset = this._base + 16 + i * 4;\n const ptr = view.getUint32(slotOffset, true);\n // TODO: Avoid allocating $spaces nodes altogether?\n const node = new CstNodeImpl(this._ctx, ptr, startIdx);\n if (\n node.matchRecordType === MatchRecordType.NONTERMINAL &&\n node.ctorName === '$spaces'\n ) {\n assert(!spaces, 'Multiple $spaces nodes found');\n spaces = node as NonterminalNode; // FIXME\n } else {\n if (spaces) {\n node.leadingSpaces = spaces;\n spaces = undefined;\n }\n children.push(node);\n }\n startIdx += node.matchLength;\n }\n assert(spaces === undefined, 'Unclaimed $spaces!');\n return children;\n }\n\n get sourceString(): string {\n return this._ctx.input.slice(this.startIdx, this.startIdx + this.matchLength);\n }\n\n isSyntactic(): boolean {\n assert(this.isNonterminal(), 'Not a nonterminal');\n const firstChar = this.ctorName[0];\n return firstChar === firstChar.toUpperCase();\n }\n\n isLexical(): boolean {\n assert(this.isNonterminal(), 'Not a nonterminal');\n return !this.isSyntactic();\n }\n\n toString(): string {\n const ctorName = this.isTerminal() ? '_terminal' : this.isSeq() ? '_iter' : this.ctorName;\n const {sourceString, startIdx} = this;\n return `CstNode {ctorName: ${ctorName}, sourceString: ${sourceString}, startIdx: ${startIdx} }`;\n }\n}\n\nabstract class WrapperNode implements CstNodeBase {\n abstract ctorName: string;\n source: {startIdx: number; endIdx: number};\n sourceString: string;\n\n constructor(source: {startIdx: number; endIdx: number}, sourceString: string) {\n this.source = source;\n this.sourceString = sourceString;\n }\n\n get matchLength(): number {\n return this.sourceString.length;\n }\n\n isNonterminal(): this is NonterminalNode {\n return false;\n }\n isTerminal(): this is TerminalNode {\n return false;\n }\n isOptional(): this is OptNode {\n return false;\n }\n isSeq(): this is SeqNode {\n return false;\n }\n isList(): this is ListNode {\n return false;\n }\n}\n\nclass SeqNodeImpl<TChildren extends CstNodeChildren = CstNodeChildren>\n extends WrapperNode\n implements SeqNode<TChildren>\n{\n type: typeof CstNodeType.SEQ = CstNodeType.SEQ;\n ctorName = '_seq' as const;\n children: TChildren;\n\n constructor(\n children: TChildren,\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = children;\n }\n\n override isSeq(): this is SeqNode {\n return true;\n }\n\n unpack<R>(cb: (...args: TChildren) => R): R {\n assert(\n cb.length === this.children.length,\n `bad arity: expected ${this.children.length}, got ${cb.length}`\n );\n return cb.call(null, ...this.children); // FIXME\n }\n}\n\nclass ListNodeImpl<TNode extends CstNode = CstNode>\n extends WrapperNode\n implements ListNode<TNode>\n{\n type: typeof CstNodeType.LIST = CstNodeType.LIST;\n ctorName = '_list' as const;\n children: readonly TNode[];\n\n constructor(\n children: readonly TNode[],\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = children;\n }\n\n override isList(): this is ListNode {\n return true;\n }\n\n collect<R>(cb: (...args: CstNode[]) => R): R[] {\n return this.children.map(c => {\n return c?.isSeq() ? c.unpack(cb) : cb(c);\n });\n }\n}\n\nclass OptNodeImpl<TNode extends CstNode = CstNode>\n extends WrapperNode\n implements OptNode<TNode>\n{\n type: typeof CstNodeType.OPT = CstNodeType.OPT;\n ctorName = '_opt' as const;\n children: [] | [TNode];\n\n constructor(\n child: TNode | undefined,\n source: {startIdx: number; endIdx: number},\n sourceString: string\n ) {\n super(source, sourceString);\n this.children = child ? [child] : [];\n }\n\n override isOptional(): this is OptNode {\n return true;\n }\n\n ifPresent<R>(\n consume: TNode extends SeqNode<infer T> ? (...children: T) => R : (child: TNode) => R,\n orElse?: () => R\n ): R | undefined {\n const child = this.children[0];\n if (child) {\n return child.isSeq()\n ? child.unpack(consume as (...children: any[]) => R)\n : (consume as (child: TNode) => R)(child);\n }\n if (orElse) return orElse();\n }\n\n isPresent(): boolean {\n return this.children.length > 0;\n }\n\n isEmpty(): boolean {\n return this.children.length === 0;\n }\n}\n\nexport abstract class MatchResult {\n // Note: This is different from the JS implementation, which has:\n // matcher: Matcher;\n // …instead.\n grammar: Grammar;\n startExpr: string;\n /** @internal */\n _ctx: MatchContext;\n /** @internal */\n _succeeded: boolean;\n /** @internal */\n _attached = true;\n /** @internal */\n _managed = false;\n /** @internal */\n _heapWatermark = 0;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n ) {\n this.grammar = grammar;\n this.startExpr = startExpr;\n this._ctx = ctx;\n this._succeeded = succeeded;\n }\n\n get input(): string {\n return (this.grammar as any)._input;\n }\n\n // `using` accesses [Symbol.dispose] at declaration time to get the\n // disposal method. We use this as the signal that the result is managed.\n get [Symbol.dispose](): () => void {\n this.grammar._manage(this);\n return () => this.dispose();\n }\n\n dispose(): void {\n throw new Error('MatchResult is not attached to any grammar');\n }\n\n succeeded(): this is SucceededMatchResult {\n return this._succeeded;\n }\n\n failed(): this is FailedMatchResult {\n return !this._succeeded;\n }\n\n toString(): string {\n return this.failed()\n ? '[match failed at position ' + this.getRightmostFailurePosition() + ']'\n : '[match succeeded]';\n }\n\n use<T>(cb: (r: this) => T): T {\n this.grammar._manage(this);\n try {\n return cb(this);\n } finally {\n this.dispose();\n }\n }\n}\n\nfunction createMatchResult(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n): MatchResult {\n return succeeded\n ? new SucceededMatchResult(grammar, startExpr, ctx, succeeded)\n : new FailedMatchResult(\n grammar,\n startExpr,\n ctx,\n succeeded,\n grammar.getRightmostFailurePosition()\n );\n}\n\nexport class SucceededMatchResult extends MatchResult {\n /** @internal */\n _cst: CstNode;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean\n ) {\n super(grammar, startExpr, ctx, succeeded);\n this._cst = grammar._getCstRoot(ctx);\n }\n\n getCstRoot(): CstNode {\n return this._cst;\n }\n}\n\nexport class FailedMatchResult extends MatchResult {\n /** @internal */\n _rightmostFailurePosition: number;\n /** @internal */\n private _rightmostFailures: Failure[] | null = null;\n /** @internal */\n private _failureDescriptions: string[] | null = null;\n\n /** @internal */\n protected constructor(\n grammar: Grammar,\n startExpr: string,\n ctx: MatchContext,\n succeeded: boolean,\n rightmostFailurePosition: number\n ) {\n super(grammar, startExpr, ctx, succeeded);\n this._rightmostFailurePosition = rightmostFailurePosition;\n }\n\n /** @internal */\n private _assertAttached(property: string) {\n if (!this._attached) {\n throw new Error(\n `Cannot access '${property}' after MatchResult has been disposed. ` +\n `Access failure information before calling dispose(), or use result.use().`\n );\n }\n }\n\n getRightmostFailurePosition(): number {\n return this._rightmostFailurePosition;\n }\n\n getRightmostFailures(): Failure[] {\n if (this._rightmostFailures === null) {\n this._assertAttached('getRightmostFailures()');\n const {exports} = (this.grammar as any)._instance;\n const ruleIds = (this.grammar as any)._ruleIds;\n const ruleNames = (this.grammar as any)._ruleNames;\n exports.recordFailures(ruleIds.get(ruleNames[0]));\n\n // Use a Map to deduplicate by description while preserving fluffy status.\n // A failure is only fluffy if ALL occurrences are fluffy.\n const failureMap = new Map<string, boolean>();\n const len = exports.getRecordedFailuresLength();\n for (let i = 0; i < len; i++) {\n const id = exports.recordedFailuresAt(i);\n const desc = this.grammar.getFailureDescription(id);\n const fluffy = exports.isFluffy(i);\n if (failureMap.has(desc)) {\n // Only keep fluffy=true if both are fluffy\n failureMap.set(desc, failureMap.get(desc)! && fluffy);\n } else {\n failureMap.set(desc, fluffy);\n }\n }\n\n this._rightmostFailures = Array.from(failureMap.entries()).map(\n ([desc, fluffy]) => new Failure(desc, fluffy)\n );\n }\n return this._rightmostFailures;\n }\n\n // Get the non-fluffy failure descriptions.\n /** @internal */\n private _getFailureDescriptions(): string[] {\n if (this._failureDescriptions === null) {\n this._failureDescriptions = this.getRightmostFailures()\n .filter(f => !f.isFluffy())\n .map(f => f.toString());\n }\n return this._failureDescriptions;\n }\n\n // Return a string summarizing the expected contents of the input stream when\n // the match failure occurred.\n getExpectedText(): string {\n assert(!this._succeeded, 'cannot get expected text of a successful MatchResult');\n const descriptions = this._getFailureDescriptions();\n switch (descriptions.length) {\n case 0:\n return '';\n case 1:\n return descriptions[0];\n case 2:\n return descriptions[0] + ' or ' + descriptions[1];\n default:\n // For 3+ items: \"a, b, or c\"\n return (\n descriptions.slice(0, -1).join(', ') +\n ', or ' +\n descriptions[descriptions.length - 1]\n );\n }\n }\n\n getInterval(): Interval {\n const pos = this.getRightmostFailurePosition();\n return new Interval(this.input, pos, pos);\n }\n\n get message(): string {\n const detail = 'Expected ' + this.getExpectedText();\n return getLineAndColumnMessage(this.input, this.getRightmostFailurePosition()) + detail;\n }\n\n get shortMessage(): string {\n const detail = 'expected ' + this.getExpectedText();\n const errorInfo = getLineAndColumn(this.input, this.getRightmostFailurePosition());\n return 'Line ' + errorInfo.lineNum + ', col ' + errorInfo.colNum + ': ' + detail;\n }\n}\n"],"mappings":"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"}
|