clarity-pattern-parser 10.3.2 → 10.3.3
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 +96 -37
- package/dist/index.browser.js.map +1 -1
- package/dist/index.esm.js +96 -37
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +96 -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 +106 -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,13 @@ 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
|
+
|
|
120
|
+
finalPatterns.push(unaryPrefix);
|
|
121
|
+
} else if (this._isBinary(pattern)) {
|
|
112
122
|
const binaryName = this._extractName(pattern);
|
|
113
123
|
const clone = this._extractDelimiter(pattern).clone();
|
|
114
124
|
clone.parent = this;
|
|
@@ -138,7 +148,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
138
148
|
const clone = pattern.clone();
|
|
139
149
|
clone.parent = this;
|
|
140
150
|
|
|
141
|
-
this.
|
|
151
|
+
this._atomPatterns.push(clone);
|
|
142
152
|
finalPatterns.push(clone);
|
|
143
153
|
}
|
|
144
154
|
});
|
|
@@ -178,6 +188,31 @@ export class ExpressionPattern implements Pattern {
|
|
|
178
188
|
return pattern.name;
|
|
179
189
|
}
|
|
180
190
|
|
|
191
|
+
private _isUnary(pattern: Pattern) {
|
|
192
|
+
if (pattern.type === "right-associated" && this._isUnaryPattern(pattern.children[0])) {
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
return this._isUnaryPattern(pattern);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
private _isUnaryPattern(pattern: Pattern) {
|
|
200
|
+
return pattern.type === "sequence" &&
|
|
201
|
+
pattern.children[0].type !== "reference" &&
|
|
202
|
+
pattern.children[0].name !== this.name &&
|
|
203
|
+
pattern.children[1].type === "reference" &&
|
|
204
|
+
pattern.children[1].name === this.name &&
|
|
205
|
+
pattern.children.length === 2;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
private _extractUnaryPrefixPattern(pattern: Pattern) {
|
|
209
|
+
if (pattern.type === "right-associated") {
|
|
210
|
+
return pattern.children[0].children[0];
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
return pattern.children[0];
|
|
214
|
+
}
|
|
215
|
+
|
|
181
216
|
private _isRecursive(pattern: Pattern) {
|
|
182
217
|
if (pattern.type === "right-associated" && this._isRecursivePattern(pattern.children[0])) {
|
|
183
218
|
return true;
|
|
@@ -190,7 +225,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
190
225
|
return pattern.type === "sequence" &&
|
|
191
226
|
pattern.children[0].type === "reference" &&
|
|
192
227
|
pattern.children[0].name === this.name &&
|
|
193
|
-
pattern.children.length >
|
|
228
|
+
pattern.children.length > 2;
|
|
194
229
|
}
|
|
195
230
|
|
|
196
231
|
private _extractRecursiveTail(pattern: Pattern) {
|
|
@@ -255,7 +290,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
255
290
|
return null;
|
|
256
291
|
}
|
|
257
292
|
|
|
258
|
-
let
|
|
293
|
+
let lastAtomNode: Node | null = null;
|
|
259
294
|
let lastBinaryNode: Node | null = null;
|
|
260
295
|
let onIndex = cursor.index;
|
|
261
296
|
|
|
@@ -263,31 +298,57 @@ export class ExpressionPattern implements Pattern {
|
|
|
263
298
|
cursor.resolveError();
|
|
264
299
|
onIndex = cursor.index;
|
|
265
300
|
|
|
266
|
-
|
|
301
|
+
let prefix: Node | null = null;
|
|
302
|
+
let prefixName = "";
|
|
303
|
+
for (let i = 0; i < this._unaryPrefixPatterns.length; i++) {
|
|
267
304
|
cursor.moveTo(onIndex);
|
|
305
|
+
const pattern = this._unaryPrefixPatterns[i];
|
|
306
|
+
const node = pattern.parse(cursor);
|
|
307
|
+
|
|
308
|
+
if (node != null) {
|
|
309
|
+
prefix = node;
|
|
310
|
+
prefixName = this._unaryPrefixNames[i];
|
|
311
|
+
|
|
312
|
+
if (cursor.hasNext()) {
|
|
313
|
+
cursor.next();
|
|
314
|
+
} else {
|
|
315
|
+
break outer;
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
break;
|
|
319
|
+
} else {
|
|
320
|
+
cursor.resolveError();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
268
323
|
|
|
269
|
-
|
|
324
|
+
onIndex = cursor.index;
|
|
325
|
+
for (let i = 0; i < this._atomPatterns.length; i++) {
|
|
326
|
+
cursor.moveTo(onIndex);
|
|
327
|
+
const pattern = this._atomPatterns[i];
|
|
270
328
|
const node = pattern.parse(cursor);
|
|
271
329
|
|
|
272
330
|
if (node != null) {
|
|
273
|
-
|
|
331
|
+
lastAtomNode = node;
|
|
274
332
|
|
|
275
333
|
break;
|
|
276
334
|
} else {
|
|
277
|
-
|
|
335
|
+
lastAtomNode = null;
|
|
278
336
|
cursor.resolveError();
|
|
279
337
|
}
|
|
280
338
|
}
|
|
281
339
|
|
|
282
|
-
if (
|
|
340
|
+
if (lastAtomNode == null) {
|
|
283
341
|
break;
|
|
284
342
|
}
|
|
285
343
|
|
|
286
344
|
if (cursor.hasNext()) {
|
|
287
345
|
cursor.next();
|
|
288
346
|
} else {
|
|
289
|
-
if (lastBinaryNode != null &&
|
|
290
|
-
|
|
347
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
348
|
+
if (prefix != null) {
|
|
349
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
350
|
+
}
|
|
351
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
291
352
|
}
|
|
292
353
|
break;
|
|
293
354
|
}
|
|
@@ -302,26 +363,33 @@ export class ExpressionPattern implements Pattern {
|
|
|
302
363
|
const name = this._recursiveNames[i];
|
|
303
364
|
|
|
304
365
|
if (this._endsInRecursion[i]) {
|
|
305
|
-
if (lastBinaryNode != null &&
|
|
306
|
-
|
|
366
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
367
|
+
if (prefix != null) {
|
|
368
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
369
|
+
}
|
|
370
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
307
371
|
}
|
|
308
372
|
|
|
309
|
-
const frontExpression = lastBinaryNode == null ?
|
|
373
|
+
const frontExpression = lastBinaryNode == null ? lastAtomNode as Node : lastBinaryNode.findRoot();
|
|
310
374
|
const recursiveNode = createNode(name, [frontExpression, ...node.children]);
|
|
311
375
|
|
|
312
376
|
recursiveNode.normalize(this._firstIndex);
|
|
313
377
|
|
|
314
378
|
return recursiveNode;
|
|
315
379
|
} else {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
380
|
+
if (prefix != null) {
|
|
381
|
+
lastAtomNode = createNode(prefixName, [prefix, lastAtomNode]);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
const recursiveNode = createNode(name, [lastAtomNode, ...node.children]);
|
|
385
|
+
recursiveNode.normalize(lastAtomNode.startIndex);
|
|
386
|
+
lastAtomNode = recursiveNode;
|
|
319
387
|
|
|
320
388
|
if (cursor.hasNext()) {
|
|
321
389
|
cursor.next();
|
|
322
390
|
} else {
|
|
323
|
-
if (lastBinaryNode != null) {
|
|
324
|
-
lastBinaryNode.appendChild(
|
|
391
|
+
if (lastBinaryNode != null && lastAtomNode != null) {
|
|
392
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
325
393
|
}
|
|
326
394
|
break outer;
|
|
327
395
|
}
|
|
@@ -347,24 +415,24 @@ export class ExpressionPattern implements Pattern {
|
|
|
347
415
|
if (delimiterNode == null) {
|
|
348
416
|
if (i === this._binaryPatterns.length - 1) {
|
|
349
417
|
if (lastBinaryNode == null) {
|
|
350
|
-
return
|
|
351
|
-
} else if (
|
|
352
|
-
lastBinaryNode.appendChild(
|
|
418
|
+
return lastAtomNode;
|
|
419
|
+
} else if (lastAtomNode != null) {
|
|
420
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
353
421
|
}
|
|
354
422
|
}
|
|
355
423
|
continue;
|
|
356
424
|
}
|
|
357
425
|
|
|
358
|
-
if (lastBinaryNode == null &&
|
|
359
|
-
const node = createNode(name, [
|
|
426
|
+
if (lastBinaryNode == null && lastAtomNode != null && delimiterNode != null) {
|
|
427
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
360
428
|
lastBinaryNode = node;
|
|
361
|
-
} else if (lastBinaryNode != null &&
|
|
429
|
+
} else if (lastBinaryNode != null && lastAtomNode != null && delimiterNode != null) {
|
|
362
430
|
const precedence = this._precedenceMap[name];
|
|
363
431
|
const lastPrecendece = lastBinaryNode == null ? 0 : this._precedenceMap[lastBinaryNode.name] == null ? -1 : this._precedenceMap[lastBinaryNode.name];
|
|
364
432
|
const association = this._binaryAssociation[i];
|
|
365
433
|
|
|
366
434
|
if (precedence === lastPrecendece && association === Association.right) {
|
|
367
|
-
const node = createNode(name, [
|
|
435
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
368
436
|
lastBinaryNode.appendChild(node);
|
|
369
437
|
|
|
370
438
|
lastBinaryNode = node;
|
|
@@ -372,7 +440,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
372
440
|
const node = createNode(name, []);
|
|
373
441
|
|
|
374
442
|
lastBinaryNode.replaceWith(node);
|
|
375
|
-
lastBinaryNode.appendChild(
|
|
443
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
376
444
|
|
|
377
445
|
node.append(lastBinaryNode, delimiterNode);
|
|
378
446
|
lastBinaryNode = node;
|
|
@@ -390,7 +458,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
390
458
|
ancestor = ancestor.parent;
|
|
391
459
|
}
|
|
392
460
|
|
|
393
|
-
lastBinaryNode.appendChild(
|
|
461
|
+
lastBinaryNode.appendChild(lastAtomNode);
|
|
394
462
|
|
|
395
463
|
if (root != null) {
|
|
396
464
|
const node = createNode(name, []);
|
|
@@ -399,12 +467,12 @@ export class ExpressionPattern implements Pattern {
|
|
|
399
467
|
|
|
400
468
|
lastBinaryNode = node;
|
|
401
469
|
} else {
|
|
402
|
-
const node = createNode(name, [
|
|
470
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
403
471
|
lastBinaryNode = node;
|
|
404
472
|
}
|
|
405
473
|
|
|
406
474
|
} else {
|
|
407
|
-
const node = createNode(name, [
|
|
475
|
+
const node = createNode(name, [lastAtomNode, delimiterNode]);
|
|
408
476
|
lastBinaryNode.appendChild(node);
|
|
409
477
|
|
|
410
478
|
lastBinaryNode = node;
|
|
@@ -427,14 +495,14 @@ export class ExpressionPattern implements Pattern {
|
|
|
427
495
|
}
|
|
428
496
|
|
|
429
497
|
if (lastBinaryNode == null) {
|
|
430
|
-
return
|
|
498
|
+
return lastAtomNode;
|
|
431
499
|
} else {
|
|
432
500
|
const root = lastBinaryNode.findAncestor(n => n.parent == null) as Node || lastBinaryNode;
|
|
433
501
|
if (lastBinaryNode.children.length < 3) {
|
|
434
502
|
lastBinaryNode.remove();
|
|
435
503
|
|
|
436
504
|
if (lastBinaryNode === root) {
|
|
437
|
-
return
|
|
505
|
+
return lastAtomNode;
|
|
438
506
|
}
|
|
439
507
|
}
|
|
440
508
|
|
|
@@ -497,7 +565,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
497
565
|
}
|
|
498
566
|
|
|
499
567
|
if (this.binaryPatterns.indexOf(childReference)) {
|
|
500
|
-
const unaryTokens = this.
|
|
568
|
+
const unaryTokens = this._atomPatterns.map(p => p.getTokens()).flat();
|
|
501
569
|
|
|
502
570
|
if (this._parent != null) {
|
|
503
571
|
const nextTokens = this._parent.getTokensAfter(this);
|
|
@@ -535,7 +603,7 @@ export class ExpressionPattern implements Pattern {
|
|
|
535
603
|
}
|
|
536
604
|
|
|
537
605
|
if (this.binaryPatterns.indexOf(childReference)) {
|
|
538
|
-
const unaryPatterns = this.
|
|
606
|
+
const unaryPatterns = this._atomPatterns.map(p => p.getPatterns()).flat();
|
|
539
607
|
|
|
540
608
|
if (this._parent != null) {
|
|
541
609
|
const nextPatterns = this._parent.getPatternsAfter(this);
|