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.
@@ -10,7 +10,9 @@ export declare class ExpressionPattern implements Pattern {
10
10
  private _firstIndex;
11
11
  private _originalPatterns;
12
12
  private _patterns;
13
- private _unaryPatterns;
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clarity-pattern-parser",
3
- "version": "10.3.2",
3
+ "version": "10.3.3",
4
4
  "description": "Parsing Library for Typescript and Javascript.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.esm.js",
@@ -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 _unaryPatterns: Pattern[];
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._unaryPatterns;
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._unaryPatterns = [];
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._unaryPatterns.length === 0) {
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._isBinary(pattern)) {
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._unaryPatterns.push(clone);
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 > 1;
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 lastUnaryNode: Node | null = null;
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
- for (let i = 0; i < this._unaryPatterns.length; i++) {
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
- const pattern = this._unaryPatterns[i];
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
- lastUnaryNode = node;
331
+ lastAtomNode = node;
274
332
 
275
333
  break;
276
334
  } else {
277
- lastUnaryNode = null;
335
+ lastAtomNode = null;
278
336
  cursor.resolveError();
279
337
  }
280
338
  }
281
339
 
282
- if (lastUnaryNode == null) {
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 && lastUnaryNode != null) {
290
- lastBinaryNode.appendChild(lastUnaryNode);
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 && lastUnaryNode != null) {
306
- lastBinaryNode.appendChild(lastUnaryNode);
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 ? lastUnaryNode as Node : lastBinaryNode.findRoot();
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
- const recursiveNode = createNode(name, [lastUnaryNode, ...node.children]);
317
- recursiveNode.normalize(lastUnaryNode.startIndex);
318
- lastUnaryNode = recursiveNode;
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(lastUnaryNode);
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 lastUnaryNode;
351
- } else if (lastUnaryNode != null) {
352
- lastBinaryNode.appendChild(lastUnaryNode);
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 && lastUnaryNode != null && delimiterNode != null) {
359
- const node = createNode(name, [lastUnaryNode, delimiterNode]);
426
+ if (lastBinaryNode == null && lastAtomNode != null && delimiterNode != null) {
427
+ const node = createNode(name, [lastAtomNode, delimiterNode]);
360
428
  lastBinaryNode = node;
361
- } else if (lastBinaryNode != null && lastUnaryNode != null && delimiterNode != 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, [lastUnaryNode, delimiterNode]);
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(lastUnaryNode);
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(lastUnaryNode);
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, [lastUnaryNode, delimiterNode]);
470
+ const node = createNode(name, [lastAtomNode, delimiterNode]);
403
471
  lastBinaryNode = node;
404
472
  }
405
473
 
406
474
  } else {
407
- const node = createNode(name, [lastUnaryNode, delimiterNode]);
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 lastUnaryNode;
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 lastUnaryNode;
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._unaryPatterns.map(p => p.getTokens()).flat();
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._unaryPatterns.map(p => p.getPatterns()).flat();
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);