ohm-js 18.0.0-beta.8 → 18.0.0-beta.9

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 CHANGED
@@ -120,7 +120,6 @@ const CstNodeType = {
120
120
  SEQ: 4
121
121
  };
122
122
  const EMPTY_CHILDREN = Object.freeze([]);
123
- const compileOptions = { builtins: ["js-string"] };
124
123
  const UnicodeCategoryNames = [
125
124
  "Cn",
126
125
  "Lu",
@@ -211,42 +210,27 @@ var Grammar = class Grammar {
211
210
  printI32(val) {
212
211
  console.log(val);
213
212
  },
214
- isRuleSyntactic: (ruleId) => {
215
- const name = this._ruleNames[ruleId];
216
- assert(!!name);
217
- return name[0] === name[0].toUpperCase();
218
- },
219
213
  fillInputBuffer: this._fillInputBuffer.bind(this),
220
214
  matchUnicodeChar: (catBitmap) => {
221
- const { input, pos } = this._instance.exports;
215
+ const { pos } = this._instance.exports;
222
216
  const re = regexFromCategoryBitmap(catBitmap);
223
217
  re.lastIndex = pos;
224
- const arr = re.exec(input.value);
218
+ const arr = re.exec(this._input);
225
219
  if (arr) pos.value += arr[0].length;
226
220
  return !!arr;
227
221
  },
228
222
  matchCaseInsensitive: (() => {
229
223
  const cache = [];
230
224
  return (stringIdx) => {
231
- const { input, pos } = this._instance.exports;
225
+ const { pos } = this._instance.exports;
232
226
  let re = cache[stringIdx];
233
227
  if (!re) re = cache[stringIdx] = new RegExp(this._strings[stringIdx], "iy");
234
228
  re.lastIndex = pos.value;
235
- const arr = re.exec(input.value);
229
+ const arr = re.exec(this._input);
236
230
  if (arr) pos.value += arr[0].length;
237
231
  return !!arr;
238
232
  };
239
233
  })()
240
- },
241
- "wasm:js-string": {
242
- length(str) {
243
- return str.length;
244
- },
245
- charCodeAt(str, idx) {
246
- idx >>>= 0;
247
- assert(idx < str.length, "string index out of bounds");
248
- return str.charCodeAt(idx);
249
- }
250
234
  }
251
235
  };
252
236
  /** @internal */
@@ -267,7 +251,7 @@ var Grammar = class Grammar {
267
251
  */
268
252
  constructor(bytes) {
269
253
  if (bytes) {
270
- const mod = new WebAssembly.Module(bytes, compileOptions);
254
+ const mod = new WebAssembly.Module(bytes);
271
255
  this._init(mod, new WebAssembly.Instance(mod, this._imports));
272
256
  }
273
257
  }
@@ -301,7 +285,7 @@ var Grammar = class Grammar {
301
285
  const { module, instance } = await WebAssembly.instantiate(source, {
302
286
  ...this._imports,
303
287
  debug: debugImports
304
- }, compileOptions);
288
+ });
305
289
  return this._init(module, instance);
306
290
  }
307
291
  /** @internal */
@@ -309,7 +293,7 @@ var Grammar = class Grammar {
309
293
  const { module, instance } = await WebAssembly.instantiateStreaming(source, {
310
294
  ...this._imports,
311
295
  debug: debugImports
312
- }, compileOptions);
296
+ });
313
297
  return this._init(module, instance);
314
298
  }
315
299
  /** @internal */
@@ -336,13 +320,13 @@ var Grammar = class Grammar {
336
320
  const exports = this._instance.exports;
337
321
  const ruleId = checkNotNull(this._ruleIds.get(ruleName || this._ruleNames[0]), `unknown rule: '${ruleName}'`);
338
322
  const heapWatermark = exports.__offset.value;
339
- const succeeded = exports.match(input, ruleId);
323
+ const succeeded = exports.match(input.length, ruleId);
340
324
  const buffer = exports.memory.buffer;
341
325
  for (const r of this._resultStack) if (r._ctx.view.buffer !== buffer) r._ctx.view = new DataView(buffer);
342
326
  const ctx = {
343
327
  ruleNames: this._ruleNames,
344
328
  view: new DataView(buffer),
345
- input: exports.input.value
329
+ input
346
330
  };
347
331
  const result = createMatchResult(this, ruleName || this._ruleNames[0], ctx, !!succeeded);
348
332
  result._heapWatermark = heapWatermark;
@@ -353,7 +337,7 @@ var Grammar = class Grammar {
353
337
  /** @internal */
354
338
  recordFailures() {
355
339
  const { exports } = this._instance;
356
- exports.recordFailures(this._ruleIds.get(this._ruleNames[0]));
340
+ exports.recordFailures(this._input.length, this._ruleIds.get(this._ruleNames[0]));
357
341
  const ans = [];
358
342
  for (let i = 0; i < exports.getRecordedFailuresLength(); i++) if (!exports.isFluffy(i)) ans.push(exports.recordedFailuresAt(i));
359
343
  return [...new Set(ans)];
@@ -381,7 +365,7 @@ var Grammar = class Grammar {
381
365
  ctx ??= {
382
366
  ruleNames: this._ruleNames,
383
367
  view: new DataView(exports.memory.buffer),
384
- input: exports.input.value
368
+ input: this._input
385
369
  };
386
370
  const firstNode = new CstNodeImpl(ctx, exports.bindingsAt(0), 0);
387
371
  assert(firstNode.isNonterminal());
@@ -394,12 +378,10 @@ var Grammar = class Grammar {
394
378
  }
395
379
  /** @internal */
396
380
  _fillInputBuffer(ptr, length) {
397
- const encoder = new TextEncoder();
398
381
  const { memory } = this._instance.exports;
399
- const buf = new Uint8Array(memory.buffer, ptr, length);
400
- const { read, written } = encoder.encodeInto(this._input, buf);
401
- assert(read === this._input.length, "Input was not fully read");
402
- return written;
382
+ const buf = new Uint16Array(memory.buffer, ptr, length);
383
+ for (let i = 0; i < length; i++) buf[i] = this._input.charCodeAt(i);
384
+ return length;
403
385
  }
404
386
  getRightmostFailurePosition() {
405
387
  return this._instance.exports.rightmostFailurePos.value;
@@ -712,7 +694,8 @@ var FailedMatchResult = class extends MatchResult {
712
694
  const { exports } = this.grammar._instance;
713
695
  const ruleIds = this.grammar._ruleIds;
714
696
  const ruleNames = this.grammar._ruleNames;
715
- exports.recordFailures(ruleIds.get(ruleNames[0]));
697
+ const inputLength = this.grammar._input.length;
698
+ exports.recordFailures(inputLength, ruleIds.get(ruleNames[0]));
716
699
  const failureMap = /* @__PURE__ */ new Map();
717
700
  const len = exports.getRecordedFailuresLength();
718
701
  for (let i = 0; i < len; i++) {
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 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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"}
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\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 fillInputBuffer: this._fillInputBuffer.bind(this),\n matchUnicodeChar: (catBitmap: number) => {\n const {pos} = (this._instance as any).exports;\n const re = regexFromCategoryBitmap(catBitmap);\n re.lastIndex = pos;\n const arr = re.exec(this._input);\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 {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(this._input);\n if (arr) {\n pos.value += arr[0].length;\n }\n return !!arr;\n };\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 const mod = new WebAssembly.Module(bytes);\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(source, {\n ...this._imports,\n debug: debugImports,\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(source, {\n ...this._imports,\n debug: debugImports,\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.length, 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,\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._input.length, 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: this._input,\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 {memory} = (this._instance as any).exports;\n const buf = new Uint16Array(memory.buffer, ptr, length);\n for (let i = 0; i < length; i++) {\n buf[i] = this._input.charCodeAt(i);\n }\n return length;\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 const inputLength = (this.grammar as any)._input.length;\n exports.recordFailures(inputLength, 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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ohm-js",
3
- "version": "18.0.0-beta.8",
3
+ "version": "18.0.0-beta.9",
4
4
  "description": "Ohm runtime — CST nodes, Grammar, and MatchResult",
5
5
  "keywords": [
6
6
  "parser",