clarity-pattern-parser 10.3.2 → 10.3.4
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.browser.js +97 -37
- package/dist/index.browser.js.map +1 -1
- package/dist/index.esm.js +97 -37
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +97 -37
- package/dist/index.js.map +1 -1
- package/dist/patterns/ExpressionPattern.d.ts +6 -1
- package/package.json +1 -1
- package/src/patterns/ExpressionPattern.ts +107 -38
|
@@ -10,7 +10,9 @@ export declare class ExpressionPattern implements Pattern {
|
|
|
10
10
|
private _firstIndex;
|
|
11
11
|
private _originalPatterns;
|
|
12
12
|
private _patterns;
|
|
13
|
-
private
|
|
13
|
+
private _atomPatterns;
|
|
14
|
+
private _unaryPrefixPatterns;
|
|
15
|
+
private _unaryPrefixNames;
|
|
14
16
|
private _binaryPatterns;
|
|
15
17
|
private _recursivePatterns;
|
|
16
18
|
private _recursiveNames;
|
|
@@ -36,6 +38,9 @@ export declare class ExpressionPattern implements Pattern {
|
|
|
36
38
|
private _isBinaryPattern;
|
|
37
39
|
private _extractDelimiter;
|
|
38
40
|
private _extractName;
|
|
41
|
+
private _isUnary;
|
|
42
|
+
private _isUnaryPattern;
|
|
43
|
+
private _extractUnaryPrefixPattern;
|
|
39
44
|
private _isRecursive;
|
|
40
45
|
private _isRecursivePattern;
|
|
41
46
|
private _extractRecursiveTail;
|
package/package.json
CHANGED
|
@@ -24,7 +24,9 @@ export class ExpressionPattern implements Pattern {
|
|
|
24
24
|
private _firstIndex: number;
|
|
25
25
|
private _originalPatterns: Pattern[];
|
|
26
26
|
private _patterns: Pattern[];
|
|
27
|
-
private
|
|
27
|
+
private _atomPatterns: Pattern[];
|
|
28
|
+
private _unaryPrefixPatterns: Pattern[];
|
|
29
|
+
private _unaryPrefixNames: string[];
|
|
28
30
|
private _binaryPatterns: Pattern[];
|
|
29
31
|
private _recursivePatterns: Pattern[];
|
|
30
32
|
private _recursiveNames: string[];
|
|
@@ -61,7 +63,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
61
63
|
}
|
|
62
64
|
|
|
63
65
|
get unaryPatterns(): readonly Pattern[] {
|
|
64
|
-
return this.
|
|
66
|
+
return this._atomPatterns;
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
get binaryPatterns(): readonly Pattern[] {
|
|
@@ -86,7 +88,9 @@ export class ExpressionPattern implements Pattern {
|
|
|
86
88
|
this._name = name;
|
|
87
89
|
this._parent = null;
|
|
88
90
|
this._firstIndex = -1;
|
|
89
|
-
this.
|
|
91
|
+
this._atomPatterns = [];
|
|
92
|
+
this._unaryPrefixPatterns = [];
|
|
93
|
+
this._unaryPrefixNames = [];
|
|
90
94
|
this._binaryPatterns = [];
|
|
91
95
|
this._recursivePatterns = [];
|
|
92
96
|
this._recursiveNames = [];
|
|
@@ -98,7 +102,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
98
102
|
this._shouldCompactPatternsMap = {};
|
|
99
103
|
this._patterns = this._organizePatterns(patterns);
|
|
100
104
|
|
|
101
|
-
if (this.
|
|
105
|
+
if (this._atomPatterns.length === 0) {
|
|
102
106
|
throw new Error("Need at least one operand pattern with an 'expression' pattern.");
|
|
103
107
|
}
|
|
104
108
|
}
|
|
@@ -108,7 +112,14 @@ export class ExpressionPattern implements Pattern {
|
|
|
108
112
|
patterns.forEach((pattern) => {
|
|
109
113
|
this._shouldCompactPatternsMap[pattern.name] = pattern.shouldCompactAst;
|
|
110
114
|
|
|
111
|
-
if (this.
|
|
115
|
+
if (this._isUnary(pattern)) {
|
|
116
|
+
const unaryPrefix = this._extractUnaryPrefixPattern(pattern).clone();
|
|
117
|
+
this._unaryPrefixPatterns.push(pattern);
|
|
118
|
+
this._unaryPrefixNames.push(pattern.name);
|
|
119
|
+
unaryPrefix.parent = this;
|
|
120
|
+
|
|
121
|
+
finalPatterns.push(unaryPrefix);
|
|
122
|
+
} else if (this._isBinary(pattern)) {
|
|
112
123
|
const binaryName = this._extractName(pattern);
|
|
113
124
|
const clone = this._extractDelimiter(pattern).clone();
|
|
114
125
|
clone.parent = this;
|
|
@@ -138,7 +149,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
138
149
|
const clone = pattern.clone();
|
|
139
150
|
clone.parent = this;
|
|
140
151
|
|
|
141
|
-
this.
|
|
152
|
+
this._atomPatterns.push(clone);
|
|
142
153
|
finalPatterns.push(clone);
|
|
143
154
|
}
|
|
144
155
|
});
|
|
@@ -178,6 +189,31 @@ export class ExpressionPattern implements Pattern {
|
|
|
178
189
|
return pattern.name;
|
|
179
190
|
}
|
|
180
191
|
|
|
192
|
+
private _isUnary(pattern: Pattern) {
|
|
193
|
+
if (pattern.type === "right-associated" && this._isUnaryPattern(pattern.children[0])) {
|
|
194
|
+
return true;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
return this._isUnaryPattern(pattern);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
private _isUnaryPattern(pattern: Pattern) {
|
|
201
|
+
return pattern.type === "sequence" &&
|
|
202
|
+
pattern.children[0].type !== "reference" &&
|
|
203
|
+
pattern.children[0].name !== this.name &&
|
|
204
|
+
pattern.children[1].type === "reference" &&
|
|
205
|
+
pattern.children[1].name === this.name &&
|
|
206
|
+
pattern.children.length === 2;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private _extractUnaryPrefixPattern(pattern: Pattern) {
|
|
210
|
+
if (pattern.type === "right-associated") {
|
|
211
|
+
return pattern.children[0].children[0];
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
return pattern.children[0];
|
|
215
|
+
}
|
|
216
|
+
|
|
181
217
|
private _isRecursive(pattern: Pattern) {
|
|
182
218
|
if (pattern.type === "right-associated" && this._isRecursivePattern(pattern.children[0])) {
|
|
183
219
|
return true;
|
|
@@ -190,7 +226,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
190
226
|
return pattern.type === "sequence" &&
|
|
191
227
|
pattern.children[0].type === "reference" &&
|
|
192
228
|
pattern.children[0].name === this.name &&
|
|
193
|
-
pattern.children.length >
|
|
229
|
+
pattern.children.length > 2;
|
|
194
230
|
}
|
|
195
231
|
|
|
196
232
|
private _extractRecursiveTail(pattern: Pattern) {
|
|
@@ -255,7 +291,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
255
291
|
return null;
|
|
256
292
|
}
|
|
257
293
|
|
|
258
|
-
let
|
|
294
|
+
let lastAtomNode: Node | null = null;
|
|
259
295
|
let lastBinaryNode: Node | null = null;
|
|
260
296
|
let onIndex = cursor.index;
|
|
261
297
|
|
|
@@ -263,31 +299,57 @@ export class ExpressionPattern implements Pattern {
|
|
|
263
299
|
cursor.resolveError();
|
|
264
300
|
onIndex = cursor.index;
|
|
265
301
|
|
|
266
|
-
|
|
302
|
+
let prefix: Node | null = null;
|
|
303
|
+
let prefixName = "";
|
|
304
|
+
for (let i = 0; i < this._unaryPrefixPatterns.length; i++) {
|
|
267
305
|
cursor.moveTo(onIndex);
|
|
306
|
+
const pattern = this._unaryPrefixPatterns[i];
|
|
307
|
+
const node = pattern.parse(cursor);
|
|
308
|
+
|
|
309
|
+
if (node != null) {
|
|
310
|
+
prefix = node;
|
|
311
|
+
prefixName = this._unaryPrefixNames[i];
|
|
312
|
+
|
|
313
|
+
if (cursor.hasNext()) {
|
|
314
|
+
cursor.next();
|
|
315
|
+
} else {
|
|
316
|
+
break outer;
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
break;
|
|
320
|
+
} else {
|
|
321
|
+
cursor.resolveError();
|
|
322
|
+
}
|
|
323
|
+
}
|
|
268
324
|
|
|
269
|
-
|
|
325
|
+
onIndex = cursor.index;
|
|
326
|
+
for (let i = 0; i < this._atomPatterns.length; i++) {
|
|
327
|
+
cursor.moveTo(onIndex);
|
|
328
|
+
const pattern = this._atomPatterns[i];
|
|
270
329
|
const node = pattern.parse(cursor);
|
|
271
330
|
|
|
272
331
|
if (node != null) {
|
|
273
|
-
|
|
332
|
+
lastAtomNode = node;
|
|
274
333
|
|
|
275
334
|
break;
|
|
276
335
|
} else {
|
|
277
|
-
|
|
336
|
+
lastAtomNode = null;
|
|
278
337
|
cursor.resolveError();
|
|
279
338
|
}
|
|
280
339
|
}
|
|
281
340
|
|
|
282
|
-
if (
|
|
341
|
+
if (lastAtomNode == null) {
|
|
283
342
|
break;
|
|
284
343
|
}
|
|
285
344
|
|
|
286
345
|
if (cursor.hasNext()) {
|
|
287
346
|
cursor.next();
|
|
288
347
|
} else {
|
|
289
|
-
if (lastBinaryNode != null &&
|
|
290
|
-
|
|
348
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
349
|
+
if (prefix != null) {
|
|
350
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
351
|
+
}
|
|
352
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
291
353
|
}
|
|
292
354
|
break;
|
|
293
355
|
}
|
|
@@ -302,26 +364,33 @@ export class ExpressionPattern implements Pattern {
|
|
|
302
364
|
const name = this._recursiveNames[i];
|
|
303
365
|
|
|
304
366
|
if (this._endsInRecursion[i]) {
|
|
305
|
-
if (lastBinaryNode != null &&
|
|
306
|
-
|
|
367
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
368
|
+
if (prefix != null) {
|
|
369
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
370
|
+
}
|
|
371
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
307
372
|
}
|
|
308
373
|
|
|
309
|
-
const frontExpression = lastBinaryNode == null ?
|
|
374
|
+
const frontExpression = lastBinaryNode == null ? lastAtomNode as Node : lastBinaryNode.findRoot();
|
|
310
375
|
const recursiveNode = createNode(name, [frontExpression, ...node.children]);
|
|
311
376
|
|
|
312
377
|
recursiveNode.normalize(this._firstIndex);
|
|
313
378
|
|
|
314
379
|
return recursiveNode;
|
|
315
380
|
} else {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
381
|
+
if (prefix != null) {
|
|
382
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
const recursiveNode = createNode(name, [lastAtomNode, ...node.children]);
|
|
386
|
+
recursiveNode.normalize(lastAtomNode.startIndex);
|
|
387
|
+
lastAtomNode = recursiveNode;
|
|
319
388
|
|
|
320
389
|
if (cursor.hasNext()) {
|
|
321
390
|
cursor.next();
|
|
322
391
|
} else {
|
|
323
|
-
if (lastBinaryNode != null) {
|
|
324
|
-
lastBinaryNode.appendChild(
|
|
392
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
393
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
325
394
|
}
|
|
326
395
|
break outer;
|
|
327
396
|
}
|
|
@@ -347,24 +416,24 @@ export class ExpressionPattern implements Pattern {
|
|
|
347
416
|
if (delimiterNode == null) {
|
|
348
417
|
if (i === this._binaryPatterns.length - 1) {
|
|
349
418
|
if (lastBinaryNode == null) {
|
|
350
|
-
return
|
|
351
|
-
} else if (
|
|
352
|
-
lastBinaryNode.appendChild(
|
|
419
|
+
return lastAtomNode;
|
|
420
|
+
} else if (lastAtomNode != null) {
|
|
421
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
353
422
|
}
|
|
354
423
|
}
|
|
355
424
|
continue;
|
|
356
425
|
}
|
|
357
426
|
|
|
358
|
-
if (lastBinaryNode == null &&
|
|
359
|
-
const node = createNode(name, [
|
|
427
|
+
if (lastBinaryNode == null && lastAtomNode != null && delimiterNode != null) {
|
|
428
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
360
429
|
lastBinaryNode = node;
|
|
361
|
-
} else if (lastBinaryNode != null &&
|
|
430
|
+
} else if (lastBinaryNode != null && lastAtomNode != null && delimiterNode != null) {
|
|
362
431
|
const precedence = this._precedenceMap[name];
|
|
363
432
|
const lastPrecendece = lastBinaryNode == null ? 0 : this._precedenceMap[lastBinaryNode.name] == null ? -1 : this._precedenceMap[lastBinaryNode.name];
|
|
364
433
|
const association = this._binaryAssociation[i];
|
|
365
434
|
|
|
366
435
|
if (precedence === lastPrecendece && association === Association.right) {
|
|
367
|
-
const node = createNode(name, [
|
|
436
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
368
437
|
lastBinaryNode.appendChild(node);
|
|
369
438
|
|
|
370
439
|
lastBinaryNode = node;
|
|
@@ -372,7 +441,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
372
441
|
const node = createNode(name, []);
|
|
373
442
|
|
|
374
443
|
lastBinaryNode.replaceWith(node);
|
|
375
|
-
lastBinaryNode.appendChild(
|
|
444
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
376
445
|
|
|
377
446
|
node.append(lastBinaryNode, delimiterNode);
|
|
378
447
|
lastBinaryNode = node;
|
|
@@ -390,7 +459,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
390
459
|
ancestor = ancestor.parent;
|
|
391
460
|
}
|
|
392
461
|
|
|
393
|
-
lastBinaryNode.appendChild(
|
|
462
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
394
463
|
|
|
395
464
|
if (root != null) {
|
|
396
465
|
const node = createNode(name, []);
|
|
@@ -399,12 +468,12 @@ export class ExpressionPattern implements Pattern {
|
|
|
399
468
|
|
|
400
469
|
lastBinaryNode = node;
|
|
401
470
|
} else {
|
|
402
|
-
const node = createNode(name, [
|
|
471
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
403
472
|
lastBinaryNode = node;
|
|
404
473
|
}
|
|
405
474
|
|
|
406
475
|
} else {
|
|
407
|
-
const node = createNode(name, [
|
|
476
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
408
477
|
lastBinaryNode.appendChild(node);
|
|
409
478
|
|
|
410
479
|
lastBinaryNode = node;
|
|
@@ -427,14 +496,14 @@ export class ExpressionPattern implements Pattern {
|
|
|
427
496
|
}
|
|
428
497
|
|
|
429
498
|
if (lastBinaryNode == null) {
|
|
430
|
-
return
|
|
499
|
+
return lastAtomNode;
|
|
431
500
|
} else {
|
|
432
501
|
const root = lastBinaryNode.findAncestor(n => n.parent == null) as Node || lastBinaryNode;
|
|
433
502
|
if (lastBinaryNode.children.length < 3) {
|
|
434
503
|
lastBinaryNode.remove();
|
|
435
504
|
|
|
436
505
|
if (lastBinaryNode === root) {
|
|
437
|
-
return
|
|
506
|
+
return lastAtomNode;
|
|
438
507
|
}
|
|
439
508
|
}
|
|
440
509
|
|
|
@@ -497,7 +566,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
497
566
|
}
|
|
498
567
|
|
|
499
568
|
if (this.binaryPatterns.indexOf(childReference)) {
|
|
500
|
-
const unaryTokens = this.
|
|
569
|
+
const unaryTokens = this._atomPatterns.map(p => p.getTokens()).flat();
|
|
501
570
|
|
|
502
571
|
if (this._parent != null) {
|
|
503
572
|
const nextTokens = this._parent.getTokensAfter(this);
|
|
@@ -535,7 +604,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
535
604
|
}
|
|
536
605
|
|
|
537
606
|
if (this.binaryPatterns.indexOf(childReference)) {
|
|
538
|
-
const unaryPatterns = this.
|
|
607
|
+
const unaryPatterns = this._atomPatterns.map(p => p.getPatterns()).flat();
|
|
539
608
|
|
|
540
609
|
if (this._parent != null) {
|
|
541
610
|
const nextPatterns = this._parent.getPatternsAfter(this);
|