grammar-composer 0.1.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.md +7 -0
- package/README.md +387 -0
- package/dist/Exports.d.ts +1 -0
- package/dist/Exports.js +2 -0
- package/dist/Exports.js.map +1 -0
- package/dist/Grammar.d.ts +62 -0
- package/dist/Grammar.js +376 -0
- package/dist/Grammar.js.map +1 -0
- package/dist/GrammarComposer.d.ts +61 -0
- package/dist/GrammarComposer.js +383 -0
- package/dist/GrammarComposer.js.map +1 -0
- package/dist/Grammars/JsonGrammar.d.ts +16 -0
- package/dist/Grammars/JsonGrammar.js +74 -0
- package/dist/Grammars/JsonGrammar.js.map +1 -0
- package/dist/Grammars/XmlGrammar.d.ts +13 -0
- package/dist/Grammars/XmlGrammar.js +74 -0
- package/dist/Grammars/XmlGrammar.js.map +1 -0
- package/dist/ParserTest.d.ts +1 -0
- package/dist/ParserTest.js +37 -0
- package/dist/ParserTest.js.map +1 -0
- package/dist/Test.d.ts +1 -0
- package/dist/Test.js +74 -0
- package/dist/Test.js.map +1 -0
- package/dist/TestData.d.ts +5 -0
- package/dist/TestData.js +466 -0
- package/dist/TestData.js.map +1 -0
- package/dist/TopDownParser.d.ts +13 -0
- package/dist/TopDownParser.js +229 -0
- package/dist/TopDownParser.js.map +1 -0
- package/dist/data/TestData.d.ts +5 -0
- package/dist/data/TestData.js +466 -0
- package/dist/data/TestData.js.map +1 -0
- package/dist/test-data/TestData.d.ts +5 -0
- package/dist/test-data/TestData.js +466 -0
- package/dist/test-data/TestData.js.map +1 -0
- package/dist/test-grammars/JsonGrammar.d.ts +17 -0
- package/dist/test-grammars/JsonGrammar.js +74 -0
- package/dist/test-grammars/JsonGrammar.js.map +1 -0
- package/dist/test-grammars/XmlGrammar.d.ts +14 -0
- package/dist/test-grammars/XmlGrammar.js +74 -0
- package/dist/test-grammars/XmlGrammar.js.map +1 -0
- package/dist/utilities/Timer.d.ts +13 -0
- package/dist/utilities/Timer.js +70 -0
- package/dist/utilities/Timer.js.map +1 -0
- package/dist/utilities/utilities.d.ts +8 -0
- package/dist/utilities/utilities.js +26 -0
- package/dist/utilities/utilities.js.map +1 -0
- package/package.json +40 -0
- package/src/GrammarComposer.ts +541 -0
- package/src/Test.ts +101 -0
- package/src/TopDownParser.ts +304 -0
- package/src/test-data/TestData.ts +470 -0
- package/src/test-grammars/JsonGrammar.ts +118 -0
- package/src/test-grammars/XmlGrammar.ts +141 -0
- package/src/utilities/Timer.ts +95 -0
- package/src/utilities/Utilities.ts +33 -0
- package/tsconfig.json +105 -0
package/dist/Grammar.js
ADDED
|
@@ -0,0 +1,376 @@
|
|
|
1
|
+
import { buildRegExp, inputStart, isPatternOptional } from 'regexp-composer';
|
|
2
|
+
import { isArray, isBoolean, isFunction, isString } from "./utilities/Utilities.js";
|
|
3
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
4
|
+
// Grammar builder functions:
|
|
5
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
6
|
+
export function buildGrammar(obj, startProductionName) {
|
|
7
|
+
if (isFunction(obj)) {
|
|
8
|
+
obj = new obj();
|
|
9
|
+
}
|
|
10
|
+
const nameLookup = new Map();
|
|
11
|
+
const nonterminalLookup = new Map();
|
|
12
|
+
const optionalNonterminalLookup = new Map();
|
|
13
|
+
for (const key in obj) {
|
|
14
|
+
const objectProperty = obj[key];
|
|
15
|
+
nameLookup.set(objectProperty, key);
|
|
16
|
+
if (!isFunction(objectProperty)) {
|
|
17
|
+
continue;
|
|
18
|
+
}
|
|
19
|
+
const productionContent = objectProperty();
|
|
20
|
+
const normalizedProduction = productionToGrammarElement(productionContent);
|
|
21
|
+
const newNonterminal = nonterminal(key, normalizedProduction);
|
|
22
|
+
const newOptionalNonterminal = { ...newNonterminal, optional: true };
|
|
23
|
+
nonterminalLookup.set(objectProperty, newNonterminal);
|
|
24
|
+
optionalNonterminalLookup.set(objectProperty, newOptionalNonterminal);
|
|
25
|
+
}
|
|
26
|
+
let uniqueIdCounter = 0;
|
|
27
|
+
const uniqueIdSource = () => uniqueIdCounter++;
|
|
28
|
+
for (const [func, nonterminal] of nonterminalLookup) {
|
|
29
|
+
const preparedContent = prepareGrammarElement(nonterminal.content, nameLookup, nonterminalLookup, optionalNonterminalLookup, uniqueIdSource);
|
|
30
|
+
nonterminal.content = preparedContent;
|
|
31
|
+
const optionalNonterminal = optionalNonterminalLookup.get(func);
|
|
32
|
+
optionalNonterminal.content = preparedContent;
|
|
33
|
+
}
|
|
34
|
+
let startNonterminal = nonterminalLookup.get(obj[startProductionName]);
|
|
35
|
+
if (!startNonterminal) {
|
|
36
|
+
throw new Error(`Couldn't find a start production named '${startProductionName}'.`);
|
|
37
|
+
}
|
|
38
|
+
detectAndAnnotateOptionalNodes(startNonterminal);
|
|
39
|
+
detectAndErrorOnLeftRecursion(startNonterminal);
|
|
40
|
+
const nonterminals = {};
|
|
41
|
+
for (const [key, nonterminal] of nonterminalLookup) {
|
|
42
|
+
nonterminals[nameLookup.get(key)] = nonterminal;
|
|
43
|
+
}
|
|
44
|
+
return {
|
|
45
|
+
rootElement: nonterminals[startProductionName],
|
|
46
|
+
productions: nonterminals,
|
|
47
|
+
maxElementId: uniqueIdCounter
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
function prepareGrammarElement(rootElement, nameLookup, nonterminalLookup, optionalNonterminalLookup, getUniqueId) {
|
|
51
|
+
function prepare(element) {
|
|
52
|
+
switch (element.type) {
|
|
53
|
+
case 'StringTerminal':
|
|
54
|
+
case 'Nonterminal': {
|
|
55
|
+
if (element.uniqueId === undefined) {
|
|
56
|
+
element.uniqueId = getUniqueId();
|
|
57
|
+
}
|
|
58
|
+
return element;
|
|
59
|
+
}
|
|
60
|
+
case 'PatternTerminal': {
|
|
61
|
+
return {
|
|
62
|
+
...element,
|
|
63
|
+
name: nameLookup.get(element) ?? '',
|
|
64
|
+
uniqueId: getUniqueId()
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
case 'Repetition': {
|
|
68
|
+
return {
|
|
69
|
+
...element,
|
|
70
|
+
content: prepare(element.content),
|
|
71
|
+
uniqueId: getUniqueId()
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
case 'Sequence':
|
|
75
|
+
case 'Choice': {
|
|
76
|
+
return {
|
|
77
|
+
...element,
|
|
78
|
+
members: element.members.map(element => prepare(element)),
|
|
79
|
+
uniqueId: getUniqueId()
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
case 'NonterminalReference': {
|
|
83
|
+
const reference = element.reference;
|
|
84
|
+
let nonterminal;
|
|
85
|
+
if (element.optional) {
|
|
86
|
+
nonterminal = optionalNonterminalLookup.get(reference);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
nonterminal = nonterminalLookup.get(reference);
|
|
90
|
+
}
|
|
91
|
+
if (!nonterminal) {
|
|
92
|
+
throw new Error(`Couldn't resolve function reference in grammar element: ${JSON.stringify(element)}`);
|
|
93
|
+
}
|
|
94
|
+
if (nonterminal.uniqueId === undefined) {
|
|
95
|
+
nonterminal.uniqueId = getUniqueId();
|
|
96
|
+
}
|
|
97
|
+
return nonterminal;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return prepare(rootElement);
|
|
102
|
+
}
|
|
103
|
+
function detectAndAnnotateOptionalNodes(rootNode) {
|
|
104
|
+
const visitedNodes = new Set();
|
|
105
|
+
const resolvedNodes = new Map();
|
|
106
|
+
const unresolvedNodes = new Map();
|
|
107
|
+
function processDepthFirst(node) {
|
|
108
|
+
if (visitedNodes.has(node)) {
|
|
109
|
+
return resolvedNodes.get(node);
|
|
110
|
+
}
|
|
111
|
+
visitedNodes.add(node);
|
|
112
|
+
switch (node.type) {
|
|
113
|
+
case 'StringTerminal':
|
|
114
|
+
case 'PatternTerminal': {
|
|
115
|
+
resolvedNodes.set(node, node.optional);
|
|
116
|
+
return node.optional;
|
|
117
|
+
}
|
|
118
|
+
case 'Nonterminal':
|
|
119
|
+
case 'Repetition': {
|
|
120
|
+
const result = processDepthFirst(node.content);
|
|
121
|
+
if (node.optional) {
|
|
122
|
+
resolvedNodes.set(node, true);
|
|
123
|
+
return true;
|
|
124
|
+
}
|
|
125
|
+
else if (isBoolean(result)) {
|
|
126
|
+
resolvedNodes.set(node, result);
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
unresolvedNodes.set(node, new Set([node.content]));
|
|
131
|
+
return undefined;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
case 'Sequence':
|
|
135
|
+
case 'Choice': {
|
|
136
|
+
const dependencies = new Set();
|
|
137
|
+
let allResolvedElementsAreOptional = true;
|
|
138
|
+
for (const element of node.members) {
|
|
139
|
+
const result = processDepthFirst(element);
|
|
140
|
+
if (isBoolean(result)) {
|
|
141
|
+
if (result == false) {
|
|
142
|
+
allResolvedElementsAreOptional = false;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
dependencies.add(element);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (node.optional == true) {
|
|
150
|
+
resolvedNodes.set(node, true);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
else if (dependencies.size == 0 || !allResolvedElementsAreOptional) {
|
|
154
|
+
resolvedNodes.set(node, allResolvedElementsAreOptional);
|
|
155
|
+
return allResolvedElementsAreOptional;
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
unresolvedNodes.set(node, dependencies);
|
|
159
|
+
return undefined;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
// Process depth first to resolve the easy cases, for productions that contain
|
|
166
|
+
// no cyclic references:
|
|
167
|
+
processDepthFirst(rootNode);
|
|
168
|
+
// Now the remainder consists of nodes containing cyclic references that have not yet been resolved.
|
|
169
|
+
// Use a form of iterative elimination and substitution to resolve them:
|
|
170
|
+
while (unresolvedNodes.size > 0) {
|
|
171
|
+
// This variable tracks whether at least one dependency was resolved, in any node.
|
|
172
|
+
// If it stays false, it means that no improvement was made during the iteration,
|
|
173
|
+
// and we should exit the loop.
|
|
174
|
+
let atLastOneDependencyResolvedInAnyNode = false;
|
|
175
|
+
// Scan the unresolved nodes to locate any new resolved dependencies
|
|
176
|
+
for (const [node, dependencies] of unresolvedNodes) {
|
|
177
|
+
let nonOptionalDependencyFound = false;
|
|
178
|
+
// Iterate over all unresolved dependencies for the node
|
|
179
|
+
for (const dependency of dependencies) {
|
|
180
|
+
// Check if the dependency has been resolved
|
|
181
|
+
const value = resolvedNodes.get(dependency);
|
|
182
|
+
if (value !== undefined) {
|
|
183
|
+
// If it did, record that some dependencies were resolved
|
|
184
|
+
atLastOneDependencyResolvedInAnyNode = true;
|
|
185
|
+
if (value === false) {
|
|
186
|
+
// If the value was false, then the entire target node must not be optional
|
|
187
|
+
nonOptionalDependencyFound = true;
|
|
188
|
+
break;
|
|
189
|
+
}
|
|
190
|
+
else {
|
|
191
|
+
// If the result was true, remove the dependency from the set
|
|
192
|
+
dependencies.delete(dependency);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// If either a non-optional dependency was found, or all dependencies were resolved,
|
|
197
|
+
// resolve the target node:
|
|
198
|
+
if (nonOptionalDependencyFound || dependencies.size === 0) {
|
|
199
|
+
const isOptional = !nonOptionalDependencyFound;
|
|
200
|
+
resolvedNodes.set(node, isOptional);
|
|
201
|
+
unresolvedNodes.delete(node);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
// If not even one dependency was eliminated for any node,
|
|
205
|
+
// it means that only mutually cyclic nodes are left unresolved, so exit the loop.
|
|
206
|
+
if (!atLastOneDependencyResolvedInAnyNode) {
|
|
207
|
+
break;
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
// All remaining unresolved nodes must now be optional,
|
|
211
|
+
// since they are all mutually cyclic and all their non-cyclic grammar elements are known to be optional.
|
|
212
|
+
for (const node of unresolvedNodes.keys()) {
|
|
213
|
+
resolvedNodes.set(node, true);
|
|
214
|
+
unresolvedNodes.delete(node);
|
|
215
|
+
}
|
|
216
|
+
// Finally set the 'optional' property of all nodes based on the detected values.
|
|
217
|
+
for (const [node, isOptional] of resolvedNodes) {
|
|
218
|
+
node.optional = isOptional;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
export function detectAndErrorOnLeftRecursion(rootNode) {
|
|
222
|
+
const currentlyIteratedNodes = new Set();
|
|
223
|
+
function detect(node) {
|
|
224
|
+
if (currentlyIteratedNodes.has(node)) {
|
|
225
|
+
if (node.type === 'Nonterminal') {
|
|
226
|
+
throw new Error(`Detected left recursion for nonterminal '${node.name}'.`);
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
throw new Error(`Detected left recursion for node: ${JSON.stringify(node, undefined, 4)}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
currentlyIteratedNodes.add(node);
|
|
233
|
+
switch (node.type) {
|
|
234
|
+
case 'Nonterminal':
|
|
235
|
+
case 'Repetition': {
|
|
236
|
+
detect(node.content);
|
|
237
|
+
break;
|
|
238
|
+
}
|
|
239
|
+
case 'Sequence': {
|
|
240
|
+
for (const member of node.members) {
|
|
241
|
+
detect(member);
|
|
242
|
+
if (!member.optional) {
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case 'Choice': {
|
|
249
|
+
for (const member of node.members) {
|
|
250
|
+
detect(member);
|
|
251
|
+
}
|
|
252
|
+
break;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
currentlyIteratedNodes.delete(node);
|
|
256
|
+
}
|
|
257
|
+
detect(rootNode);
|
|
258
|
+
}
|
|
259
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
260
|
+
// Builder interface functions:
|
|
261
|
+
/////////////////////////////////////////////////////////////////////////////////////////////////
|
|
262
|
+
export function oneOrMore(content) {
|
|
263
|
+
return {
|
|
264
|
+
type: 'Repetition',
|
|
265
|
+
content: productionToGrammarElement(content),
|
|
266
|
+
optional: false
|
|
267
|
+
};
|
|
268
|
+
}
|
|
269
|
+
export function zeroOrMore(content) {
|
|
270
|
+
return {
|
|
271
|
+
type: 'Repetition',
|
|
272
|
+
content: productionToGrammarElement(content),
|
|
273
|
+
optional: true
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
export function anyOf(...members) {
|
|
277
|
+
if (members.length == 0) {
|
|
278
|
+
throw new Error(`'anyOf' requires at least one member.`);
|
|
279
|
+
}
|
|
280
|
+
const normalizedMembers = members.map(member => productionToGrammarElement(member));
|
|
281
|
+
return {
|
|
282
|
+
type: 'Choice',
|
|
283
|
+
members: normalizedMembers,
|
|
284
|
+
optional: false,
|
|
285
|
+
exhaustive: false
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
export function bestOf(...members) {
|
|
289
|
+
if (members.length == 0) {
|
|
290
|
+
throw new Error(`'bestOf' requires at least one member.`);
|
|
291
|
+
}
|
|
292
|
+
const normalizedMembers = members.map(member => productionToGrammarElement(member));
|
|
293
|
+
return {
|
|
294
|
+
type: 'Choice',
|
|
295
|
+
members: normalizedMembers,
|
|
296
|
+
optional: false,
|
|
297
|
+
exhaustive: true
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
export function possibly(content) {
|
|
301
|
+
return { ...productionToGrammarElement(content), optional: true };
|
|
302
|
+
}
|
|
303
|
+
export function cached(content) {
|
|
304
|
+
return { ...productionToGrammarElement(content), cached: true };
|
|
305
|
+
}
|
|
306
|
+
export function uncached(content) {
|
|
307
|
+
return { ...productionToGrammarElement(content), cached: false };
|
|
308
|
+
}
|
|
309
|
+
export function pattern(pattern) {
|
|
310
|
+
if (isArray(pattern)) {
|
|
311
|
+
pattern = [inputStart, ...pattern];
|
|
312
|
+
}
|
|
313
|
+
else {
|
|
314
|
+
pattern = [inputStart, pattern];
|
|
315
|
+
}
|
|
316
|
+
const regExp = buildRegExp(pattern);
|
|
317
|
+
const optional = isPatternOptional(pattern);
|
|
318
|
+
return {
|
|
319
|
+
type: 'PatternTerminal',
|
|
320
|
+
name: '[Pattern]',
|
|
321
|
+
pattern,
|
|
322
|
+
regExp,
|
|
323
|
+
optional,
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
function stringTerminal(content) {
|
|
327
|
+
if (content.length < 1) {
|
|
328
|
+
throw new Error(`A string terminal must have a length of at least 1 character`);
|
|
329
|
+
}
|
|
330
|
+
return {
|
|
331
|
+
type: 'StringTerminal',
|
|
332
|
+
content,
|
|
333
|
+
optional: false
|
|
334
|
+
};
|
|
335
|
+
}
|
|
336
|
+
function nonterminal(name, content) {
|
|
337
|
+
if (name.length < 1) {
|
|
338
|
+
throw new Error(`A nonterminal name must include at least 1 character.`);
|
|
339
|
+
}
|
|
340
|
+
return {
|
|
341
|
+
type: 'Nonterminal',
|
|
342
|
+
name,
|
|
343
|
+
content,
|
|
344
|
+
optional: false,
|
|
345
|
+
};
|
|
346
|
+
}
|
|
347
|
+
function sequence(members) {
|
|
348
|
+
return {
|
|
349
|
+
type: 'Sequence',
|
|
350
|
+
members,
|
|
351
|
+
optional: false
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
function unresolvedReference(reference) {
|
|
355
|
+
return {
|
|
356
|
+
type: 'NonterminalReference',
|
|
357
|
+
reference,
|
|
358
|
+
optional: false
|
|
359
|
+
};
|
|
360
|
+
}
|
|
361
|
+
function productionToGrammarElement(production) {
|
|
362
|
+
if (isString(production)) {
|
|
363
|
+
return stringTerminal(production);
|
|
364
|
+
}
|
|
365
|
+
else if (isArray(production)) {
|
|
366
|
+
const normalizedMembers = production.map(element => productionToGrammarElement(element));
|
|
367
|
+
return sequence(normalizedMembers);
|
|
368
|
+
}
|
|
369
|
+
else if (isFunction(production)) {
|
|
370
|
+
return unresolvedReference(production);
|
|
371
|
+
}
|
|
372
|
+
else {
|
|
373
|
+
return production;
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
//# sourceMappingURL=Grammar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Grammar.js","sourceRoot":"","sources":["../src/Grammar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { Pattern } from 'regexp-composer';
|
|
2
|
+
export * from './TopDownParser.js';
|
|
3
|
+
export declare function buildGrammar<T extends {
|
|
4
|
+
[key: string]: any;
|
|
5
|
+
}>(obj: T | (new () => T), startProductionName: keyof T): Grammar<T>;
|
|
6
|
+
export declare function zeroOrMore(content: Production): Repetition;
|
|
7
|
+
export declare function oneOrMore(content: Production): Repetition;
|
|
8
|
+
export declare function anyOf(...members: Production[]): Choice;
|
|
9
|
+
export declare function bestOf(...members: Production[]): Choice;
|
|
10
|
+
export declare function possibly<T extends Production>(content: Production): T;
|
|
11
|
+
export declare function pattern(pattern: Pattern): PatternTerminal;
|
|
12
|
+
export declare function cached<T extends Production>(content: Production): T;
|
|
13
|
+
export declare function uncached<T extends Production>(content: Production): T;
|
|
14
|
+
export interface Grammar<T> {
|
|
15
|
+
rootElement: Nonterminal;
|
|
16
|
+
productions: {
|
|
17
|
+
[key in keyof T]: any;
|
|
18
|
+
};
|
|
19
|
+
maxElementId: number;
|
|
20
|
+
}
|
|
21
|
+
export type Production = string | GrammarElement | (() => Production) | Production[];
|
|
22
|
+
export type GrammarElement = StringTerminal | PatternTerminal | Nonterminal | Sequence | Repetition | Choice | NonterminalReference;
|
|
23
|
+
interface GrammarElementBase {
|
|
24
|
+
type: string;
|
|
25
|
+
optional: boolean;
|
|
26
|
+
uniqueId?: number;
|
|
27
|
+
cached?: boolean;
|
|
28
|
+
}
|
|
29
|
+
export type Terminal = StringTerminal | PatternTerminal;
|
|
30
|
+
export interface StringTerminal extends GrammarElementBase {
|
|
31
|
+
type: 'StringTerminal';
|
|
32
|
+
content: string;
|
|
33
|
+
}
|
|
34
|
+
export interface PatternTerminal extends GrammarElementBase {
|
|
35
|
+
type: 'PatternTerminal';
|
|
36
|
+
name: string;
|
|
37
|
+
pattern: Pattern | Pattern[];
|
|
38
|
+
regExp: RegExp;
|
|
39
|
+
}
|
|
40
|
+
export interface Nonterminal extends GrammarElementBase {
|
|
41
|
+
type: 'Nonterminal';
|
|
42
|
+
name: string;
|
|
43
|
+
content: GrammarElement;
|
|
44
|
+
}
|
|
45
|
+
export interface Sequence extends GrammarElementBase {
|
|
46
|
+
type: 'Sequence';
|
|
47
|
+
members: GrammarElement[];
|
|
48
|
+
}
|
|
49
|
+
export interface Repetition extends GrammarElementBase {
|
|
50
|
+
type: 'Repetition';
|
|
51
|
+
content: GrammarElement;
|
|
52
|
+
}
|
|
53
|
+
export interface Choice extends GrammarElementBase {
|
|
54
|
+
type: 'Choice';
|
|
55
|
+
members: GrammarElement[];
|
|
56
|
+
exhaustive: boolean;
|
|
57
|
+
}
|
|
58
|
+
export interface NonterminalReference extends GrammarElementBase {
|
|
59
|
+
type: 'NonterminalReference';
|
|
60
|
+
reference: Function;
|
|
61
|
+
}
|