@tabnas/abnf 0.2.0
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/LICENSE +21 -0
- package/README.md +50 -0
- package/bin/tabnas-abnf +2 -0
- package/dist/abnf.d.ts +6 -0
- package/dist/abnf.js +36 -0
- package/dist/abnf.js.map +1 -0
- package/dist/bin/tabnas-abnf-cli.d.ts +1 -0
- package/dist/bin/tabnas-abnf-cli.js +223 -0
- package/dist/bin/tabnas-abnf-cli.js.map +1 -0
- package/dist/compile.d.ts +26 -0
- package/dist/compile.js +341 -0
- package/dist/compile.js.map +1 -0
- package/dist/converter.d.ts +84 -0
- package/dist/converter.js +2106 -0
- package/dist/converter.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +53 -0
package/dist/compile.js
ADDED
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/* Copyright (c) 2026 Richard Rodger and other contributors, MIT License */
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.AbnfActionError = exports.AbnfCompileError = void 0;
|
|
5
|
+
exports.toRecognitionSpec = toRecognitionSpec;
|
|
6
|
+
exports.toPureSpec = toPureSpec;
|
|
7
|
+
exports.toJsonic = toJsonic;
|
|
8
|
+
exports.attachActions = attachActions;
|
|
9
|
+
exports.attachActionSlots = attachActionSlots;
|
|
10
|
+
exports.markListing = markListing;
|
|
11
|
+
exports.abnfCompile = abnfCompile;
|
|
12
|
+
const parser_1 = require("@tabnas/parser");
|
|
13
|
+
const converter_1 = require("./converter");
|
|
14
|
+
// Hook fields whose string value is a `@`-ref into `spec.ref`. These
|
|
15
|
+
// are the AST-building actions compilation mode drops.
|
|
16
|
+
const REF_FIELDS = new Set(['a', 'bo', 'bc']);
|
|
17
|
+
// Tree-building `$`-builtins (emitted with `builtins: true`). Pure
|
|
18
|
+
// recognition mode drops these too; their per-alt config lives under
|
|
19
|
+
// `k.node$` / `k.capture$`.
|
|
20
|
+
const TREE_BUILTINS = new Set(['@node$', '@capture$', '@bubble$']);
|
|
21
|
+
const TREE_CONFIG_KEYS = ['node$', 'capture$'];
|
|
22
|
+
class AbnfCompileError extends Error {
|
|
23
|
+
constructor(message, rules) {
|
|
24
|
+
super(message);
|
|
25
|
+
this.name = 'AbnfCompileError';
|
|
26
|
+
this.rules = rules;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.AbnfCompileError = AbnfCompileError;
|
|
30
|
+
// Deep clone that preserves RegExp instances (match-token matchers)
|
|
31
|
+
// and drops every function-valued property.
|
|
32
|
+
function cloneData(v) {
|
|
33
|
+
if (v instanceof RegExp)
|
|
34
|
+
return v;
|
|
35
|
+
if (Array.isArray(v))
|
|
36
|
+
return v.map(cloneData);
|
|
37
|
+
if (v && 'object' === typeof v) {
|
|
38
|
+
const o = {};
|
|
39
|
+
for (const k of Object.keys(v)) {
|
|
40
|
+
if ('function' === typeof v[k])
|
|
41
|
+
continue;
|
|
42
|
+
o[k] = cloneData(v[k]);
|
|
43
|
+
}
|
|
44
|
+
return o;
|
|
45
|
+
}
|
|
46
|
+
return v;
|
|
47
|
+
}
|
|
48
|
+
// Like `cloneData`, but also drops the AST-building hooks: `a`/`bo`/`bc`
|
|
49
|
+
// fields that point at a dropped action (a `spec.ref` closure or a tree
|
|
50
|
+
// `$`-builtin), and the now-orphaned `k.node$` / `k.capture$` config.
|
|
51
|
+
// Control builtins (`@probe…$`) and structural fields are preserved.
|
|
52
|
+
function cloneRecognition(v, isDropped) {
|
|
53
|
+
if (v instanceof RegExp)
|
|
54
|
+
return v;
|
|
55
|
+
if (Array.isArray(v))
|
|
56
|
+
return v.map((x) => cloneRecognition(x, isDropped));
|
|
57
|
+
if (v && 'object' === typeof v) {
|
|
58
|
+
const o = {};
|
|
59
|
+
for (const k of Object.keys(v)) {
|
|
60
|
+
const x = v[k];
|
|
61
|
+
if ('function' === typeof x)
|
|
62
|
+
continue;
|
|
63
|
+
if (REF_FIELDS.has(k) && 'string' === typeof x && isDropped(x))
|
|
64
|
+
continue;
|
|
65
|
+
if ('k' === k && x && 'object' === typeof x) {
|
|
66
|
+
const kc = cloneRecognition(x, isDropped);
|
|
67
|
+
for (const tk of TREE_CONFIG_KEYS)
|
|
68
|
+
delete kc[tk];
|
|
69
|
+
if (0 === Object.keys(kc).length)
|
|
70
|
+
continue;
|
|
71
|
+
o[k] = kc;
|
|
72
|
+
continue;
|
|
73
|
+
}
|
|
74
|
+
o[k] = cloneRecognition(x, isDropped);
|
|
75
|
+
}
|
|
76
|
+
return o;
|
|
77
|
+
}
|
|
78
|
+
return v;
|
|
79
|
+
}
|
|
80
|
+
// Find rules that reference the ref map from a field *other than* the
|
|
81
|
+
// droppable AST hooks — i.e. control functions (probe `c:` guards and
|
|
82
|
+
// dispatch actions). Their presence means the grammar can't be
|
|
83
|
+
// represented purely structurally yet.
|
|
84
|
+
function controlRefRules(spec, isRef) {
|
|
85
|
+
const offenders = new Set();
|
|
86
|
+
const scan = (o, rule) => {
|
|
87
|
+
if (Array.isArray(o)) {
|
|
88
|
+
o.forEach((x) => scan(x, rule));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
if (!o || 'object' !== typeof o)
|
|
92
|
+
return;
|
|
93
|
+
for (const k of Object.keys(o)) {
|
|
94
|
+
const x = o[k];
|
|
95
|
+
if (!REF_FIELDS.has(k) && 'string' === typeof x && isRef(x)) {
|
|
96
|
+
offenders.add(rule);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
scan(x, rule);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
};
|
|
103
|
+
const rules = spec.rule ?? {};
|
|
104
|
+
for (const name of Object.keys(rules))
|
|
105
|
+
scan(rules[name], name);
|
|
106
|
+
return [...offenders].sort();
|
|
107
|
+
}
|
|
108
|
+
// Strip a converted spec down to a function-free recognition grammar.
|
|
109
|
+
// Throws `AbnfCompileError` for grammars whose control logic is still
|
|
110
|
+
// closures (i.e. a probe dispatcher converted without `builtins`).
|
|
111
|
+
function toRecognitionSpec(spec) {
|
|
112
|
+
const ref = spec.ref ?? {};
|
|
113
|
+
const isRef = (s) => Object.prototype.hasOwnProperty.call(ref, s);
|
|
114
|
+
const offenders = controlRefRules(spec, isRef);
|
|
115
|
+
if (offenders.length > 0) {
|
|
116
|
+
throw new AbnfCompileError('abnf: grammar needs control functions (probe / unbounded ' +
|
|
117
|
+
'lookahead) and cannot be emitted as a pure recognition grammar; ' +
|
|
118
|
+
'recompile with `builtins: true`. Offending rule(s): ' +
|
|
119
|
+
offenders.join(', '), offenders);
|
|
120
|
+
}
|
|
121
|
+
const isDropped = (s) => isRef(s) || TREE_BUILTINS.has(s);
|
|
122
|
+
const out = cloneRecognition({ options: spec.options, rule: spec.rule }, isDropped);
|
|
123
|
+
// Declare the builtin config-schema version so the engine can refuse a
|
|
124
|
+
// grammar that needs a newer schema than it implements.
|
|
125
|
+
out.v = parser_1.BUILTIN_SCHEMA_VERSION;
|
|
126
|
+
return out;
|
|
127
|
+
}
|
|
128
|
+
// Reduce a spec to a pure-data, function-free grammar that *keeps* the
|
|
129
|
+
// AST-building `$`-builtins (so the deserialized grammar builds the
|
|
130
|
+
// full `{rule,src,kids}` tree). Requires `builtins: true` conversion —
|
|
131
|
+
// throws if any closures remain in `spec.ref`.
|
|
132
|
+
function toPureSpec(spec) {
|
|
133
|
+
const ref = spec.ref ?? {};
|
|
134
|
+
const closures = Object.keys(ref);
|
|
135
|
+
if (closures.length > 0) {
|
|
136
|
+
throw new AbnfCompileError('abnf: spec still contains closures; convert with `builtins: true` ' +
|
|
137
|
+
'for pure-data output. Stray ref(s): ' + closures.slice(0, 3).join(', '), []);
|
|
138
|
+
}
|
|
139
|
+
const out = cloneData({ options: spec.options, rule: spec.rule });
|
|
140
|
+
out.v = parser_1.BUILTIN_SCHEMA_VERSION;
|
|
141
|
+
return out;
|
|
142
|
+
}
|
|
143
|
+
const IDENT = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
144
|
+
// Serialise a (function-free) value as jsonic text. Relaxed by
|
|
145
|
+
// default: bare identifier keys, single-quoted strings, newline-
|
|
146
|
+
// separated entries. `strict: true` emits valid JSON (double quotes,
|
|
147
|
+
// comma-separated) for round-trip verification. RegExp instances are
|
|
148
|
+
// emitted as `@/source/flags` strings (jsonic's `resolveFuncRefs`
|
|
149
|
+
// reconstructs them on load).
|
|
150
|
+
function toJsonic(value, opts = {}) {
|
|
151
|
+
const strict = !!opts.strict;
|
|
152
|
+
const ind = opts.indent ?? 2;
|
|
153
|
+
const sep = strict ? ',\n' : '\n';
|
|
154
|
+
const pad = (n) => ' '.repeat(ind * n);
|
|
155
|
+
const quote = (s, ch) => ch + s
|
|
156
|
+
.replace(/\\/g, '\\\\')
|
|
157
|
+
.replace(new RegExp(ch, 'g'), '\\' + ch)
|
|
158
|
+
.replace(/\n/g, '\\n') + ch;
|
|
159
|
+
const dq = (s) => quote(s, '"');
|
|
160
|
+
const str = (s) => strict ? dq(s) : quote(s, "'");
|
|
161
|
+
const key = (k) => (!strict && IDENT.test(k)) ? k : dq(k);
|
|
162
|
+
const ser = (v, depth) => {
|
|
163
|
+
if (null === v || undefined === v)
|
|
164
|
+
return 'null';
|
|
165
|
+
if (v instanceof RegExp) {
|
|
166
|
+
// `@~/…/` carries the `eager$` matcher flag through serialisation;
|
|
167
|
+
// plain `@/…/` for ordinary regexes.
|
|
168
|
+
const sentinel = v.eager$ ? '@~/' : '@/';
|
|
169
|
+
return str(sentinel + v.source + '/' + v.flags);
|
|
170
|
+
}
|
|
171
|
+
const t = typeof v;
|
|
172
|
+
if ('number' === t || 'boolean' === t)
|
|
173
|
+
return String(v);
|
|
174
|
+
if ('string' === t)
|
|
175
|
+
return str(v);
|
|
176
|
+
if (Array.isArray(v)) {
|
|
177
|
+
if (0 === v.length)
|
|
178
|
+
return '[]';
|
|
179
|
+
const items = v.map((x) => pad(depth + 1) + ser(x, depth + 1));
|
|
180
|
+
return '[\n' + items.join(sep) + '\n' + pad(depth) + ']';
|
|
181
|
+
}
|
|
182
|
+
if ('object' === t) {
|
|
183
|
+
const keys = Object.keys(v);
|
|
184
|
+
if (0 === keys.length)
|
|
185
|
+
return '{}';
|
|
186
|
+
const items = keys.map((k) => pad(depth + 1) + key(k) + ': ' + ser(v[k], depth + 1));
|
|
187
|
+
return '{\n' + items.join(sep) + '\n' + pad(depth) + '}';
|
|
188
|
+
}
|
|
189
|
+
return 'null';
|
|
190
|
+
};
|
|
191
|
+
return ser(value, 0);
|
|
192
|
+
}
|
|
193
|
+
// ---- User semantic actions (the `m`-mark feature) -----------------
|
|
194
|
+
class AbnfActionError extends Error {
|
|
195
|
+
constructor(message) {
|
|
196
|
+
super(message);
|
|
197
|
+
this.name = 'AbnfActionError';
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
exports.AbnfActionError = AbnfActionError;
|
|
201
|
+
const PHASES = new Set(['bo', 'ao', 'bc', 'ac']);
|
|
202
|
+
// Compose a previous action (the compiler's own, run first) with the
|
|
203
|
+
// user's, in attachment order — the synthetic wrapper from the design.
|
|
204
|
+
function composeActions(prev, fns) {
|
|
205
|
+
const prevFn = 'function' === typeof prev ? prev : null;
|
|
206
|
+
return (r, ctx, alt) => {
|
|
207
|
+
if (prevFn)
|
|
208
|
+
prevFn(r, ctx, alt);
|
|
209
|
+
for (const fn of fns)
|
|
210
|
+
fn(r, ctx, alt);
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Collapse a function list into a single action (or pass one through).
|
|
214
|
+
function seqActions(fns) {
|
|
215
|
+
return 1 === fns.length ? fns[0] : (r, ctx, alt) => {
|
|
216
|
+
for (const fn of fns)
|
|
217
|
+
fn(r, ctx, alt);
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
// Append an action ref/fn to an alt's `a`, producing the engine's
|
|
221
|
+
// array-`a` form so the alt's own action runs first, then the new one.
|
|
222
|
+
function appendAction(existing, added) {
|
|
223
|
+
if (null == existing)
|
|
224
|
+
return added;
|
|
225
|
+
return Array.isArray(existing) ? [...existing, added] : [existing, added];
|
|
226
|
+
}
|
|
227
|
+
function altListOf(field) {
|
|
228
|
+
return Array.isArray(field) ? field : (field && field.alts) || [];
|
|
229
|
+
}
|
|
230
|
+
// Resolve `@<rule>:<sel>` against the spec; return the matched alts (for
|
|
231
|
+
// o:/c: selectors) or the rule-phase string (for bo/ao/bc/ac).
|
|
232
|
+
function resolveTarget(spec, key) {
|
|
233
|
+
// `$` is reserved for engine builtins (the `@…$` namespace); a user
|
|
234
|
+
// action ref may not contain it. The engine enforces the same on
|
|
235
|
+
// spec.ref keys at load — fail early here with a clearer message.
|
|
236
|
+
if (key.includes('$')) {
|
|
237
|
+
throw new AbnfActionError(`abnf: '$' is reserved for engine builtins; user action ref ` +
|
|
238
|
+
`'${key}' may not contain '$'`);
|
|
239
|
+
}
|
|
240
|
+
const m = /^@([^:]+):(.+)$/.exec(key);
|
|
241
|
+
if (!m) {
|
|
242
|
+
throw new AbnfActionError(`abnf: malformed action ref '${key}' ` +
|
|
243
|
+
`(expected @rule:phase or @rule:o|c:mark)`);
|
|
244
|
+
}
|
|
245
|
+
const rule = m[1];
|
|
246
|
+
const sel = m[2];
|
|
247
|
+
const rules = (spec.rule ?? {});
|
|
248
|
+
if (!rules[rule]) {
|
|
249
|
+
throw new AbnfActionError(`abnf: action ref '${key}' targets unknown rule '${rule}'`);
|
|
250
|
+
}
|
|
251
|
+
if (PHASES.has(sel))
|
|
252
|
+
return { phase: sel };
|
|
253
|
+
const pm = /^([oc]):(.+)$/.exec(sel);
|
|
254
|
+
if (!pm)
|
|
255
|
+
throw new AbnfActionError(`abnf: malformed action ref '${key}'`);
|
|
256
|
+
const phase = 'o' === pm[1] ? 'open' : 'close';
|
|
257
|
+
const mark = pm[2];
|
|
258
|
+
const alts = altListOf(rules[rule][phase]).filter((a) => a && a.m === mark);
|
|
259
|
+
if (0 === alts.length) {
|
|
260
|
+
throw new AbnfActionError(`abnf: action ref '${key}' matches no ${phase} alt with mark ` +
|
|
261
|
+
`'${mark}' in rule '${rule}'`);
|
|
262
|
+
}
|
|
263
|
+
return { alts, rule };
|
|
264
|
+
}
|
|
265
|
+
// Attach user semantic actions to a spec, in place. Keys:
|
|
266
|
+
// `@<rule>:<phase>` (bo/ao/bc/ac) or `@<rule>:o|c:<mark>`. Values: a
|
|
267
|
+
// function or array of functions, run *after* the compiler's own action
|
|
268
|
+
// in attachment order. Works in both closure and `builtins` mode — alt
|
|
269
|
+
// actions are injected as the engine's array-`a` form (the alt's own
|
|
270
|
+
// action, builtin or closure, runs first). Throws `AbnfActionError` for
|
|
271
|
+
// a ref matching no rule / hook / marked alt.
|
|
272
|
+
function attachActions(spec, actions) {
|
|
273
|
+
const ref = (spec.ref = spec.ref ?? {});
|
|
274
|
+
let counter = 0;
|
|
275
|
+
for (const key of Object.keys(actions)) {
|
|
276
|
+
const fns = [].concat(actions[key]);
|
|
277
|
+
const target = resolveTarget(spec, key);
|
|
278
|
+
if ('phase' in target) {
|
|
279
|
+
// Rule-phase hook: reuse the engine's `@<rule>-<phase>` fnref
|
|
280
|
+
// auto-install (fnref builds the key from the rule name, so a
|
|
281
|
+
// hyphenated ABNF rule name stays unambiguous).
|
|
282
|
+
const rule = /^@([^:]+):/.exec(key)[1];
|
|
283
|
+
const fkey = `@${rule}-${target.phase}`;
|
|
284
|
+
ref[fkey] = composeActions(ref[fkey], fns);
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
for (const alt of target.alts) {
|
|
288
|
+
const userRef = `@abnf_user${counter++}`;
|
|
289
|
+
ref[userRef] = seqActions(fns);
|
|
290
|
+
alt.a = appendAction(alt.a, userRef);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
return spec;
|
|
294
|
+
}
|
|
295
|
+
// Declare user-action *slots* on a (pure-data) spec without supplying
|
|
296
|
+
// functions: each `@<rule>:o|c:<mark>` ref name is injected into the
|
|
297
|
+
// matched alt's array-`a`, to be resolved at load time from a
|
|
298
|
+
// user-supplied ref map. Lets a serialized grammar carry user-action
|
|
299
|
+
// hooks that the consumer binds by name. Throws on unknown targets.
|
|
300
|
+
function attachActionSlots(spec, refNames) {
|
|
301
|
+
for (const name of refNames) {
|
|
302
|
+
const target = resolveTarget(spec, name);
|
|
303
|
+
if ('phase' in target) {
|
|
304
|
+
throw new AbnfActionError(`abnf: slot '${name}' is a rule-phase ref; slots are for ` +
|
|
305
|
+
`@rule:o|c:mark alt actions`);
|
|
306
|
+
}
|
|
307
|
+
for (const alt of target.alts)
|
|
308
|
+
alt.a = appendAction(alt.a, name);
|
|
309
|
+
}
|
|
310
|
+
return spec;
|
|
311
|
+
}
|
|
312
|
+
// Human-readable listing of the marks the compiler assigned, for
|
|
313
|
+
// discoverability (CLI `--marks`).
|
|
314
|
+
function markListing(spec) {
|
|
315
|
+
const lines = [];
|
|
316
|
+
const rules = spec.rule ?? {};
|
|
317
|
+
for (const rule of Object.keys(rules)) {
|
|
318
|
+
for (const [ph, sym] of [['open', 'o'], ['close', 'c']]) {
|
|
319
|
+
const f = rules[rule][ph];
|
|
320
|
+
const list = Array.isArray(f) ? f : (f && f.alts) || [];
|
|
321
|
+
for (const a of list) {
|
|
322
|
+
if (a && null != a.m) {
|
|
323
|
+
const what = a.s ? `s:${a.s}` : a.p ? `p:${a.p}` : '(empty)';
|
|
324
|
+
lines.push(`${rule} ${sym}:${a.m} ${what}`);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
return lines.join('\n');
|
|
330
|
+
}
|
|
331
|
+
// Compile ABNF source into a pure-data tabnas grammar as jsonic text.
|
|
332
|
+
// Always converts with `builtins: true` so probe dispatch and tree
|
|
333
|
+
// building serialise as `@…$` builtin refs (no closures).
|
|
334
|
+
function abnfCompile(src, opts = {}) {
|
|
335
|
+
const spec = (0, converter_1.abnf)(src, { start: opts.start, tag: opts.tag, builtins: true, marks: true });
|
|
336
|
+
const out = (false === opts.recognition)
|
|
337
|
+
? toPureSpec(spec)
|
|
338
|
+
: toRecognitionSpec(spec);
|
|
339
|
+
return toJsonic(out, { strict: opts.strict, indent: opts.indent });
|
|
340
|
+
}
|
|
341
|
+
//# sourceMappingURL=compile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"compile.js","sourceRoot":"","sources":["../src/compile.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import type { GrammarSpec, Rule } from '@tabnas/parser';
|
|
2
|
+
export type AbnfConvertOptions = {
|
|
3
|
+
start?: string;
|
|
4
|
+
tag?: string;
|
|
5
|
+
builtins?: boolean;
|
|
6
|
+
marks?: boolean;
|
|
7
|
+
};
|
|
8
|
+
type AbnfElement = {
|
|
9
|
+
kind: 'term';
|
|
10
|
+
literal: string;
|
|
11
|
+
caseSensitive?: boolean;
|
|
12
|
+
} | {
|
|
13
|
+
kind: 'ref';
|
|
14
|
+
name: string;
|
|
15
|
+
} | {
|
|
16
|
+
kind: 'regex';
|
|
17
|
+
pattern: string;
|
|
18
|
+
flags: string;
|
|
19
|
+
} | {
|
|
20
|
+
kind: 'opt';
|
|
21
|
+
inner: AbnfElement;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'star';
|
|
24
|
+
inner: AbnfElement;
|
|
25
|
+
} | {
|
|
26
|
+
kind: 'plus';
|
|
27
|
+
inner: AbnfElement;
|
|
28
|
+
} | {
|
|
29
|
+
kind: 'rep';
|
|
30
|
+
min: number;
|
|
31
|
+
max: number;
|
|
32
|
+
inner: AbnfElement;
|
|
33
|
+
} | {
|
|
34
|
+
kind: 'group';
|
|
35
|
+
alts: AbnfSequence[];
|
|
36
|
+
};
|
|
37
|
+
type AbnfSequence = AbnfElement[];
|
|
38
|
+
type AbnfProduction = {
|
|
39
|
+
name: string;
|
|
40
|
+
alts: AbnfSequence[];
|
|
41
|
+
incremental?: boolean;
|
|
42
|
+
probeDispatch?: ProbeDispatchSpec;
|
|
43
|
+
probeHelper?: {
|
|
44
|
+
vocabElements: AbnfElement[];
|
|
45
|
+
};
|
|
46
|
+
nodeKind?: 'user' | 'core' | 'helper';
|
|
47
|
+
};
|
|
48
|
+
type ProbeDispatchSpec = {
|
|
49
|
+
probeRule: string;
|
|
50
|
+
disambiguator: AbnfElement;
|
|
51
|
+
withBranch: string;
|
|
52
|
+
noBranch: string;
|
|
53
|
+
};
|
|
54
|
+
type AbnfGrammar = {
|
|
55
|
+
productions: AbnfProduction[];
|
|
56
|
+
ambiguities?: AmbiguityReport[];
|
|
57
|
+
};
|
|
58
|
+
type AmbiguityReport = {
|
|
59
|
+
rule: string;
|
|
60
|
+
altIdx: number;
|
|
61
|
+
optIdx: number;
|
|
62
|
+
reason: string;
|
|
63
|
+
resolved: boolean;
|
|
64
|
+
};
|
|
65
|
+
declare const abnfRules: Record<string, {
|
|
66
|
+
bo?: (r: Rule) => void;
|
|
67
|
+
bc?: (r: Rule) => void;
|
|
68
|
+
open?: any[];
|
|
69
|
+
close?: any[];
|
|
70
|
+
}>;
|
|
71
|
+
declare function eliminateLeftRecursion(grammar: AbnfGrammar): AbnfGrammar;
|
|
72
|
+
declare class AbnfParseError extends Error {
|
|
73
|
+
readonly line?: number;
|
|
74
|
+
readonly column?: number;
|
|
75
|
+
readonly cause?: unknown;
|
|
76
|
+
constructor(message: string, location?: {
|
|
77
|
+
line?: number;
|
|
78
|
+
column?: number;
|
|
79
|
+
}, cause?: unknown);
|
|
80
|
+
}
|
|
81
|
+
declare function parseAbnf(src: string): AbnfGrammar;
|
|
82
|
+
declare function emitGrammarSpec(grammar: AbnfGrammar, opts?: AbnfConvertOptions): GrammarSpec;
|
|
83
|
+
declare function abnf(src: string, opts?: AbnfConvertOptions): GrammarSpec;
|
|
84
|
+
export { abnf, parseAbnf, emitGrammarSpec, eliminateLeftRecursion, abnfRules, AbnfParseError, };
|