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.
Files changed (57) hide show
  1. package/LICENSE.md +7 -0
  2. package/README.md +387 -0
  3. package/dist/Exports.d.ts +1 -0
  4. package/dist/Exports.js +2 -0
  5. package/dist/Exports.js.map +1 -0
  6. package/dist/Grammar.d.ts +62 -0
  7. package/dist/Grammar.js +376 -0
  8. package/dist/Grammar.js.map +1 -0
  9. package/dist/GrammarComposer.d.ts +61 -0
  10. package/dist/GrammarComposer.js +383 -0
  11. package/dist/GrammarComposer.js.map +1 -0
  12. package/dist/Grammars/JsonGrammar.d.ts +16 -0
  13. package/dist/Grammars/JsonGrammar.js +74 -0
  14. package/dist/Grammars/JsonGrammar.js.map +1 -0
  15. package/dist/Grammars/XmlGrammar.d.ts +13 -0
  16. package/dist/Grammars/XmlGrammar.js +74 -0
  17. package/dist/Grammars/XmlGrammar.js.map +1 -0
  18. package/dist/ParserTest.d.ts +1 -0
  19. package/dist/ParserTest.js +37 -0
  20. package/dist/ParserTest.js.map +1 -0
  21. package/dist/Test.d.ts +1 -0
  22. package/dist/Test.js +74 -0
  23. package/dist/Test.js.map +1 -0
  24. package/dist/TestData.d.ts +5 -0
  25. package/dist/TestData.js +466 -0
  26. package/dist/TestData.js.map +1 -0
  27. package/dist/TopDownParser.d.ts +13 -0
  28. package/dist/TopDownParser.js +229 -0
  29. package/dist/TopDownParser.js.map +1 -0
  30. package/dist/data/TestData.d.ts +5 -0
  31. package/dist/data/TestData.js +466 -0
  32. package/dist/data/TestData.js.map +1 -0
  33. package/dist/test-data/TestData.d.ts +5 -0
  34. package/dist/test-data/TestData.js +466 -0
  35. package/dist/test-data/TestData.js.map +1 -0
  36. package/dist/test-grammars/JsonGrammar.d.ts +17 -0
  37. package/dist/test-grammars/JsonGrammar.js +74 -0
  38. package/dist/test-grammars/JsonGrammar.js.map +1 -0
  39. package/dist/test-grammars/XmlGrammar.d.ts +14 -0
  40. package/dist/test-grammars/XmlGrammar.js +74 -0
  41. package/dist/test-grammars/XmlGrammar.js.map +1 -0
  42. package/dist/utilities/Timer.d.ts +13 -0
  43. package/dist/utilities/Timer.js +70 -0
  44. package/dist/utilities/Timer.js.map +1 -0
  45. package/dist/utilities/utilities.d.ts +8 -0
  46. package/dist/utilities/utilities.js +26 -0
  47. package/dist/utilities/utilities.js.map +1 -0
  48. package/package.json +40 -0
  49. package/src/GrammarComposer.ts +541 -0
  50. package/src/Test.ts +101 -0
  51. package/src/TopDownParser.ts +304 -0
  52. package/src/test-data/TestData.ts +470 -0
  53. package/src/test-grammars/JsonGrammar.ts +118 -0
  54. package/src/test-grammars/XmlGrammar.ts +141 -0
  55. package/src/utilities/Timer.ts +95 -0
  56. package/src/utilities/Utilities.ts +33 -0
  57. package/tsconfig.json +105 -0
@@ -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
+ }