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,383 @@
1
+ import { buildRegExp, inputStart, isPatternOptional } from 'regexp-composer';
2
+ import { isArray, isBoolean, isFunction, isString } from "./utilities/Utilities.js";
3
+ export * from './TopDownParser.js';
4
+ /////////////////////////////////////////////////////////////////////////////////////////////////
5
+ // Grammar builder method
6
+ /////////////////////////////////////////////////////////////////////////////////////////////////
7
+ export function buildGrammar(obj, startProductionName) {
8
+ if (isFunction(obj)) {
9
+ obj = new obj();
10
+ }
11
+ const nameLookup = new Map();
12
+ const nonterminalLookup = new Map();
13
+ const optionalNonterminalLookup = new Map();
14
+ for (const key in obj) {
15
+ const objectProperty = obj[key];
16
+ nameLookup.set(objectProperty, key);
17
+ if (!isFunction(objectProperty)) {
18
+ continue;
19
+ }
20
+ const productionContent = objectProperty();
21
+ const normalizedProduction = productionToGrammarElement(productionContent);
22
+ const newNonterminal = nonterminal(key, normalizedProduction);
23
+ const newOptionalNonterminal = { ...newNonterminal, optional: true };
24
+ nonterminalLookup.set(objectProperty, newNonterminal);
25
+ optionalNonterminalLookup.set(objectProperty, newOptionalNonterminal);
26
+ }
27
+ let uniqueIdCounter = 0;
28
+ const uniqueIdSource = () => uniqueIdCounter++;
29
+ for (const [func, nonterminal] of nonterminalLookup) {
30
+ const preparedContent = prepareGrammarElement(nonterminal.content, nameLookup, nonterminalLookup, optionalNonterminalLookup, uniqueIdSource);
31
+ nonterminal.content = preparedContent;
32
+ const optionalNonterminal = optionalNonterminalLookup.get(func);
33
+ optionalNonterminal.content = preparedContent;
34
+ }
35
+ let startNonterminal = nonterminalLookup.get(obj[startProductionName]);
36
+ if (!startNonterminal) {
37
+ throw new Error(`Couldn't find a start production named '${startProductionName}'.`);
38
+ }
39
+ detectAndAnnotateOptionalNodes(startNonterminal);
40
+ detectAndErrorOnLeftRecursion(startNonterminal);
41
+ const nonterminals = {};
42
+ for (const [key, nonterminal] of nonterminalLookup) {
43
+ nonterminals[nameLookup.get(key)] = nonterminal;
44
+ }
45
+ return {
46
+ rootElement: nonterminals[startProductionName],
47
+ productions: nonterminals,
48
+ maxElementId: uniqueIdCounter
49
+ };
50
+ }
51
+ function prepareGrammarElement(rootElement, nameLookup, nonterminalLookup, optionalNonterminalLookup, getUniqueId) {
52
+ function prepare(element) {
53
+ switch (element.type) {
54
+ case 'StringTerminal':
55
+ case 'Nonterminal': {
56
+ if (element.uniqueId === undefined) {
57
+ element.uniqueId = getUniqueId();
58
+ }
59
+ return element;
60
+ }
61
+ case 'PatternTerminal': {
62
+ return {
63
+ ...element,
64
+ name: nameLookup.get(element) ?? '',
65
+ uniqueId: getUniqueId()
66
+ };
67
+ }
68
+ case 'Repetition': {
69
+ return {
70
+ ...element,
71
+ content: prepare(element.content),
72
+ uniqueId: getUniqueId()
73
+ };
74
+ }
75
+ case 'Sequence':
76
+ case 'Choice': {
77
+ return {
78
+ ...element,
79
+ members: element.members.map(element => prepare(element)),
80
+ uniqueId: getUniqueId()
81
+ };
82
+ }
83
+ case 'NonterminalReference': {
84
+ const reference = element.reference;
85
+ let nonterminal;
86
+ if (element.optional) {
87
+ nonterminal = optionalNonterminalLookup.get(reference);
88
+ }
89
+ else {
90
+ nonterminal = nonterminalLookup.get(reference);
91
+ }
92
+ if (!nonterminal) {
93
+ throw new Error(`Couldn't resolve function reference in grammar element: ${JSON.stringify(element)}`);
94
+ }
95
+ if (nonterminal.uniqueId === undefined) {
96
+ nonterminal.uniqueId = getUniqueId();
97
+ }
98
+ return nonterminal;
99
+ }
100
+ }
101
+ }
102
+ return prepare(rootElement);
103
+ }
104
+ /////////////////////////////////////////////////////////////////////////////////////////////////
105
+ // Internal static analysis methods
106
+ /////////////////////////////////////////////////////////////////////////////////////////////////
107
+ function detectAndAnnotateOptionalNodes(rootNode) {
108
+ const visitedNodes = new Set();
109
+ const resolvedNodes = new Map();
110
+ const unresolvedNodes = new Map();
111
+ function processDepthFirst(node) {
112
+ if (visitedNodes.has(node)) {
113
+ return resolvedNodes.get(node);
114
+ }
115
+ visitedNodes.add(node);
116
+ switch (node.type) {
117
+ case 'StringTerminal':
118
+ case 'PatternTerminal': {
119
+ resolvedNodes.set(node, node.optional);
120
+ return node.optional;
121
+ }
122
+ case 'Nonterminal':
123
+ case 'Repetition': {
124
+ const result = processDepthFirst(node.content);
125
+ if (node.optional) {
126
+ resolvedNodes.set(node, true);
127
+ return true;
128
+ }
129
+ else if (isBoolean(result)) {
130
+ resolvedNodes.set(node, result);
131
+ return result;
132
+ }
133
+ else {
134
+ unresolvedNodes.set(node, new Set([node.content]));
135
+ return undefined;
136
+ }
137
+ }
138
+ case 'Sequence':
139
+ case 'Choice': {
140
+ const dependencies = new Set();
141
+ let allResolvedElementsAreOptional = true;
142
+ for (const element of node.members) {
143
+ const result = processDepthFirst(element);
144
+ if (isBoolean(result)) {
145
+ if (result == false) {
146
+ allResolvedElementsAreOptional = false;
147
+ }
148
+ }
149
+ else {
150
+ dependencies.add(element);
151
+ }
152
+ }
153
+ if (node.optional == true) {
154
+ resolvedNodes.set(node, true);
155
+ return true;
156
+ }
157
+ else if (dependencies.size == 0 || !allResolvedElementsAreOptional) {
158
+ resolvedNodes.set(node, allResolvedElementsAreOptional);
159
+ return allResolvedElementsAreOptional;
160
+ }
161
+ else {
162
+ unresolvedNodes.set(node, dependencies);
163
+ return undefined;
164
+ }
165
+ }
166
+ }
167
+ return undefined;
168
+ }
169
+ // Process depth first to resolve the easy cases, for productions that contain
170
+ // no cyclic references:
171
+ processDepthFirst(rootNode);
172
+ // Now the remainder consists of nodes containing cyclic references that have not yet been resolved.
173
+ // Use a form of iterative elimination and substitution to resolve them:
174
+ while (unresolvedNodes.size > 0) {
175
+ // This variable tracks whether at least one dependency was resolved, in any node.
176
+ // If it stays false, it means that no improvement was made during the iteration,
177
+ // and we should exit the loop.
178
+ let atLastOneDependencyResolvedInAnyNode = false;
179
+ // Scan the unresolved nodes to locate any new resolved dependencies
180
+ for (const [node, dependencies] of unresolvedNodes) {
181
+ let nonOptionalDependencyFound = false;
182
+ // Iterate over all unresolved dependencies for the node
183
+ for (const dependency of dependencies) {
184
+ // Check if the dependency has been resolved
185
+ const value = resolvedNodes.get(dependency);
186
+ if (value !== undefined) {
187
+ // If it did, record that some dependencies were resolved
188
+ atLastOneDependencyResolvedInAnyNode = true;
189
+ if (value === false) {
190
+ // If the value was false, then the entire target node must not be optional
191
+ nonOptionalDependencyFound = true;
192
+ break;
193
+ }
194
+ else {
195
+ // If the result was true, remove the dependency from the set
196
+ dependencies.delete(dependency);
197
+ }
198
+ }
199
+ }
200
+ // If either a non-optional dependency was found, or all dependencies were resolved,
201
+ // resolve the target node:
202
+ if (nonOptionalDependencyFound || dependencies.size === 0) {
203
+ const isOptional = !nonOptionalDependencyFound;
204
+ resolvedNodes.set(node, isOptional);
205
+ unresolvedNodes.delete(node);
206
+ }
207
+ }
208
+ // If not even one dependency was eliminated for any node,
209
+ // it means that only mutually cyclic nodes are left unresolved, so exit the loop.
210
+ if (!atLastOneDependencyResolvedInAnyNode) {
211
+ break;
212
+ }
213
+ }
214
+ // All remaining unresolved nodes must now be optional,
215
+ // since they are all mutually cyclic and all their non-cyclic grammar elements are known to be optional.
216
+ for (const node of unresolvedNodes.keys()) {
217
+ resolvedNodes.set(node, true);
218
+ unresolvedNodes.delete(node);
219
+ }
220
+ // Finally set the 'optional' property of all nodes based on the detected values.
221
+ for (const [node, isOptional] of resolvedNodes) {
222
+ node.optional = isOptional;
223
+ }
224
+ }
225
+ function detectAndErrorOnLeftRecursion(rootNode) {
226
+ const currentlyIteratedNodes = new Set();
227
+ function detect(node) {
228
+ if (currentlyIteratedNodes.has(node)) {
229
+ if (node.type === 'Nonterminal') {
230
+ throw new Error(`Detected left recursion for nonterminal '${node.name}'.`);
231
+ }
232
+ else {
233
+ throw new Error(`Detected left recursion for node: ${JSON.stringify(node, undefined, 4)}`);
234
+ }
235
+ }
236
+ currentlyIteratedNodes.add(node);
237
+ switch (node.type) {
238
+ case 'Nonterminal':
239
+ case 'Repetition': {
240
+ detect(node.content);
241
+ break;
242
+ }
243
+ case 'Sequence': {
244
+ for (const member of node.members) {
245
+ detect(member);
246
+ if (!member.optional) {
247
+ break;
248
+ }
249
+ }
250
+ break;
251
+ }
252
+ case 'Choice': {
253
+ for (const member of node.members) {
254
+ detect(member);
255
+ }
256
+ break;
257
+ }
258
+ }
259
+ currentlyIteratedNodes.delete(node);
260
+ }
261
+ detect(rootNode);
262
+ }
263
+ /////////////////////////////////////////////////////////////////////////////////////////////////
264
+ // Exported builder methods
265
+ /////////////////////////////////////////////////////////////////////////////////////////////////
266
+ export function zeroOrMore(content) {
267
+ return {
268
+ type: 'Repetition',
269
+ content: productionToGrammarElement(content),
270
+ optional: true
271
+ };
272
+ }
273
+ export function oneOrMore(content) {
274
+ return {
275
+ type: 'Repetition',
276
+ content: productionToGrammarElement(content),
277
+ optional: false
278
+ };
279
+ }
280
+ export function anyOf(...members) {
281
+ if (members.length == 0) {
282
+ throw new Error(`'anyOf' requires at least one member.`);
283
+ }
284
+ const normalizedMembers = members.map(member => productionToGrammarElement(member));
285
+ return {
286
+ type: 'Choice',
287
+ members: normalizedMembers,
288
+ optional: false,
289
+ exhaustive: false
290
+ };
291
+ }
292
+ export function bestOf(...members) {
293
+ if (members.length == 0) {
294
+ throw new Error(`'bestOf' requires at least one member.`);
295
+ }
296
+ const normalizedMembers = members.map(member => productionToGrammarElement(member));
297
+ return {
298
+ type: 'Choice',
299
+ members: normalizedMembers,
300
+ optional: false,
301
+ exhaustive: true
302
+ };
303
+ }
304
+ export function possibly(content) {
305
+ return { ...productionToGrammarElement(content), optional: true };
306
+ }
307
+ export function pattern(pattern) {
308
+ if (isArray(pattern)) {
309
+ pattern = [inputStart, ...pattern];
310
+ }
311
+ else {
312
+ pattern = [inputStart, pattern];
313
+ }
314
+ const regExp = buildRegExp(pattern);
315
+ const optional = isPatternOptional(pattern);
316
+ return {
317
+ type: 'PatternTerminal',
318
+ name: '[Pattern]',
319
+ pattern,
320
+ regExp,
321
+ optional,
322
+ };
323
+ }
324
+ export function cached(content) {
325
+ return { ...productionToGrammarElement(content), cached: true };
326
+ }
327
+ export function uncached(content) {
328
+ return { ...productionToGrammarElement(content), cached: false };
329
+ }
330
+ /////////////////////////////////////////////////////////////////////////////////////////////////
331
+ // Internal builder methods
332
+ /////////////////////////////////////////////////////////////////////////////////////////////////
333
+ function stringTerminal(content) {
334
+ if (content.length < 1) {
335
+ throw new Error(`A string terminal must have a length of at least 1 character`);
336
+ }
337
+ return {
338
+ type: 'StringTerminal',
339
+ content,
340
+ optional: false
341
+ };
342
+ }
343
+ function nonterminal(name, content) {
344
+ if (name.length < 1) {
345
+ throw new Error(`A nonterminal name must include at least 1 character.`);
346
+ }
347
+ return {
348
+ type: 'Nonterminal',
349
+ name,
350
+ content,
351
+ optional: false,
352
+ };
353
+ }
354
+ function sequence(members) {
355
+ return {
356
+ type: 'Sequence',
357
+ members,
358
+ optional: false
359
+ };
360
+ }
361
+ function unresolvedReference(reference) {
362
+ return {
363
+ type: 'NonterminalReference',
364
+ reference,
365
+ optional: false
366
+ };
367
+ }
368
+ function productionToGrammarElement(production) {
369
+ if (isString(production)) {
370
+ return stringTerminal(production);
371
+ }
372
+ else if (isArray(production)) {
373
+ const normalizedMembers = production.map(element => productionToGrammarElement(element));
374
+ return sequence(normalizedMembers);
375
+ }
376
+ else if (isFunction(production)) {
377
+ return unresolvedReference(production);
378
+ }
379
+ else {
380
+ return production;
381
+ }
382
+ }
383
+ //# sourceMappingURL=GrammarComposer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrammarComposer.js","sourceRoot":"","sources":["../src/GrammarComposer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export declare class JsonGrammar {
2
+ expression: () => import("../Grammar.js").Choice;
3
+ objectExpression: () => import("../Grammar.js").Production[];
4
+ objectPropertyExpression: () => ((() => import("../Grammar.js").Choice) | import("../Grammar.js").PatternTerminal)[];
5
+ arrayExpression: () => import("../Grammar.js").Production[];
6
+ openingCurlyBrace: import("../Grammar.js").PatternTerminal;
7
+ closingCurlyBrace: import("../Grammar.js").PatternTerminal;
8
+ openingSquareBracket: import("../Grammar.js").PatternTerminal;
9
+ closingSquareBracket: import("../Grammar.js").PatternTerminal;
10
+ comma: import("../Grammar.js").PatternTerminal;
11
+ colons: import("../Grammar.js").PatternTerminal;
12
+ stringLiteral: import("../Grammar.js").PatternTerminal;
13
+ numberLiteral: import("../Grammar.js").PatternTerminal;
14
+ booleanLiteral: import("../Grammar.js").PatternTerminal;
15
+ nullLiteral: import("../Grammar.js").PatternTerminal;
16
+ }
@@ -0,0 +1,74 @@
1
+ import { anyOf, pattern, possibly, zeroOrMore } from "../Grammar.js";
2
+ import * as R from 'regexp-composer';
3
+ export class JsonGrammar {
4
+ expression = () => anyOf(this.stringLiteral, this.numberLiteral, this.booleanLiteral, this.nullLiteral, this.objectExpression, this.arrayExpression);
5
+ objectExpression = () => [
6
+ this.openingCurlyBrace,
7
+ possibly([
8
+ this.objectPropertyExpression,
9
+ zeroOrMore([this.comma, this.objectPropertyExpression])
10
+ ]),
11
+ this.closingCurlyBrace,
12
+ ];
13
+ objectPropertyExpression = () => [
14
+ this.stringLiteral,
15
+ this.colons,
16
+ this.expression,
17
+ ];
18
+ arrayExpression = () => [
19
+ this.openingSquareBracket,
20
+ possibly([
21
+ this.expression,
22
+ zeroOrMore([this.comma, this.expression])
23
+ ]),
24
+ this.closingSquareBracket
25
+ ];
26
+ openingCurlyBrace = createPatternWithClearedWhitespace('{');
27
+ closingCurlyBrace = createPatternWithClearedWhitespace('}');
28
+ openingSquareBracket = createPatternWithClearedWhitespace('[');
29
+ closingSquareBracket = createPatternWithClearedWhitespace(']');
30
+ comma = createPatternWithClearedWhitespace(',');
31
+ colons = createPatternWithClearedWhitespace(':');
32
+ stringLiteral = pattern([
33
+ zeroOrMoreWhitespace,
34
+ '"',
35
+ R.matches(R.capture(R.zeroOrMoreNonGreedy(R.anyChar)), {
36
+ ifNotPrecededBy: '\\'
37
+ }),
38
+ '"',
39
+ zeroOrMoreWhitespace,
40
+ ]);
41
+ numberLiteral = pattern([
42
+ zeroOrMoreWhitespace,
43
+ R.capture([
44
+ R.possibly('-'), // Sign
45
+ R.anyOf('0', // Zero only
46
+ [
47
+ R.charRange('1', '9'), // First digit
48
+ R.zeroOrMore(R.digit), // Next digits
49
+ ]),
50
+ R.possibly(['.', R.oneOrMore(R.digit)]), // Decimal value
51
+ R.possibly([R.anyOf('e', 'E'), R.anyOf('+', '-'), R.oneOrMore(R.digit)]), // Exponent
52
+ ]),
53
+ zeroOrMoreWhitespace,
54
+ ]);
55
+ booleanLiteral = pattern([
56
+ zeroOrMoreWhitespace,
57
+ R.capture(R.anyOf('true', 'false')),
58
+ zeroOrMoreWhitespace,
59
+ ]);
60
+ nullLiteral = pattern([
61
+ zeroOrMoreWhitespace,
62
+ 'null',
63
+ zeroOrMoreWhitespace,
64
+ ]);
65
+ }
66
+ function createPatternWithClearedWhitespace(str) {
67
+ return pattern([
68
+ zeroOrMoreWhitespace,
69
+ str,
70
+ zeroOrMoreWhitespace
71
+ ]);
72
+ }
73
+ const zeroOrMoreWhitespace = R.zeroOrMore(R.whitespace);
74
+ //# sourceMappingURL=JsonGrammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JsonGrammar.js","sourceRoot":"","sources":["../../src/grammars/JsonGrammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ export declare class XmlGrammar {
2
+ document: () => import("../Grammar.js").Repetition[];
3
+ textFragment: import("../Grammar.js").PatternTerminal;
4
+ openingTag: () => (import("../Grammar.js").PatternTerminal | import("../Grammar.js").Repetition)[];
5
+ openingTagStart: import("../Grammar.js").PatternTerminal;
6
+ tagEnd: import("../Grammar.js").PatternTerminal;
7
+ attribute: import("../Grammar.js").PatternTerminal;
8
+ closingTag: import("../Grammar.js").PatternTerminal;
9
+ declarationTag: () => (import("../Grammar.js").PatternTerminal | import("../Grammar.js").Repetition)[];
10
+ declarationTagOpening: import("../Grammar.js").PatternTerminal;
11
+ declarationTagAttribute: import("../Grammar.js").PatternTerminal;
12
+ comment: import("../Grammar.js").PatternTerminal;
13
+ }
@@ -0,0 +1,74 @@
1
+ import { anyOf, pattern, zeroOrMore } from "../Grammar.js";
2
+ import * as R from 'regexp-composer';
3
+ export class XmlGrammar {
4
+ document = () => [
5
+ zeroOrMore(anyOf(this.textFragment, this.openingTag, this.closingTag, this.comment, this.declarationTag))
6
+ ];
7
+ textFragment = pattern([
8
+ R.capture(R.oneOrMore(R.notAnyOfChars('<')))
9
+ ]);
10
+ openingTag = () => [
11
+ this.openingTagStart,
12
+ zeroOrMore(this.attribute),
13
+ this.tagEnd
14
+ ];
15
+ openingTagStart = pattern([
16
+ '<',
17
+ R.possibly('?'),
18
+ R.capture(R.oneOrMore(R.notAnyOfChars(R.whitespace, '"', "'", '?', '!', '/', '>'))),
19
+ R.zeroOrMore(R.whitespace),
20
+ ]);
21
+ tagEnd = pattern([
22
+ R.zeroOrMore(R.whitespace),
23
+ R.possibly(R.anyOf('/', '?')),
24
+ '>'
25
+ ]);
26
+ attribute = pattern([
27
+ R.zeroOrMore(R.whitespace),
28
+ R.capture(R.oneOrMore(R.notAnyOfChars(R.whitespace, '=', '"', "'", '?', '/', '>'))),
29
+ R.zeroOrMore(R.whitespace),
30
+ R.possibly([
31
+ '=',
32
+ R.zeroOrMore(R.whitespace),
33
+ quotedString,
34
+ R.zeroOrMore(R.whitespace),
35
+ ])
36
+ ]);
37
+ closingTag = pattern([
38
+ '</',
39
+ R.zeroOrMore(R.whitespace),
40
+ R.capture(R.oneOrMore(R.notAnyOfChars(R.whitespace, '/', '>'))),
41
+ R.zeroOrMore(R.whitespace),
42
+ '>'
43
+ ]);
44
+ declarationTag = () => [
45
+ this.declarationTagOpening,
46
+ zeroOrMore(this.declarationTagAttribute),
47
+ this.tagEnd
48
+ ];
49
+ declarationTagOpening = pattern([
50
+ '<!',
51
+ R.capture(R.oneOrMore(R.notAnyOfChars(R.whitespace, '"', "'", '/', '>'))),
52
+ R.zeroOrMore(R.whitespace)
53
+ ]);
54
+ declarationTagAttribute = pattern([
55
+ R.zeroOrMore(R.whitespace),
56
+ R.anyOf(R.capture(R.oneOrMore(R.notAnyOfChars(R.whitespace, '"', "'", '/', '!', '?', '>'))), quotedString),
57
+ R.zeroOrMore(R.whitespace),
58
+ ]);
59
+ comment = pattern([
60
+ '<!--',
61
+ R.capture(R.zeroOrMoreNonGreedy(R.anyChar)),
62
+ '-->'
63
+ ]);
64
+ }
65
+ const quotedString = R.anyOf([
66
+ '"',
67
+ R.capture(R.zeroOrMore(R.notAnyOfChars('"'))),
68
+ '"'
69
+ ], [
70
+ "'",
71
+ R.capture(R.zeroOrMore(R.notAnyOfChars("'"))),
72
+ "'"
73
+ ]);
74
+ //# sourceMappingURL=XmlGrammar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"XmlGrammar.js","sourceRoot":"","sources":["../../src/grammars/XmlGrammar.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ import { readFile } from 'node:fs/promises';
2
+ import { buildGrammar } from "./GrammarComposer.js";
3
+ import { parseString } from "./TopDownParser.js";
4
+ import { Timer } from "./utilities/Timer.js";
5
+ import { xmlSample3 } from "./test-data/TestData.js";
6
+ import { JsonGrammar } from "./test-grammars/JsonGrammar.js";
7
+ import { XmlGrammar } from './test-grammars/XmlGrammar.js';
8
+ async function testJsonParser() {
9
+ const jsonData = await readFile('./test-data/heteronyms.en.json', { encoding: 'utf-8' });
10
+ const grammar = buildGrammar(JsonGrammar, 'expression');
11
+ function run() {
12
+ const timer = new Timer();
13
+ const result1 = parseString(jsonData, grammar);
14
+ timer.logAndRestart('Parse');
15
+ const result2 = JSON.parse(jsonData);
16
+ timer.logAndRestart('JSON.Parse');
17
+ console.log(JSON.stringify(result2, undefined, 4));
18
+ }
19
+ for (let i = 0; i < 20; i++) {
20
+ run();
21
+ }
22
+ }
23
+ async function testXmlParser() {
24
+ const xmlData = xmlSample3;
25
+ const grammar = buildGrammar(XmlGrammar, 'document');
26
+ function run() {
27
+ const timer = new Timer();
28
+ const result1 = parseString(xmlData, grammar);
29
+ timer.logAndRestart('Parse');
30
+ //console.log(JSON.stringify(result1, undefined, 4))
31
+ }
32
+ for (let i = 0; i < 20; i++) {
33
+ run();
34
+ }
35
+ }
36
+ testJsonParser();
37
+ //# sourceMappingURL=ParserTest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParserTest.js","sourceRoot":"","sources":["../src/ParserTest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAS,YAAY,EAA4C,MAAM,sBAAsB,CAAA;AAEpG,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAChD,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAuC,UAAU,EAAE,MAAM,yBAAyB,CAAA;AACzF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAA;AAG1D,KAAK,UAAU,cAAc;IAC5B,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,gCAAgC,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAA;IAExF,MAAM,OAAO,GAAG,YAAY,CAAC,WAAW,EAAE,YAAY,CAAC,CAAA;IAEvD,SAAS,GAAG;QACX,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;QAC9C,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE5B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QACpC,KAAK,CAAC,aAAa,CAAC,YAAY,CAAC,CAAA;QAEjC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,EAAE,CAAA;IACN,CAAC;AACF,CAAC;AAED,KAAK,UAAU,aAAa;IAC3B,MAAM,OAAO,GAAG,UAAU,CAAA;IAE1B,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAA;IAEpD,SAAS,GAAG;QACX,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAA;QACzB,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;QAC7C,KAAK,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAE5B,oDAAoD;IACrD,CAAC;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,GAAG,EAAE,CAAA;IACN,CAAC;AACF,CAAC;AAGD,cAAc,EAAE,CAAA"}
package/dist/Test.d.ts ADDED
@@ -0,0 +1 @@
1
+ export {};