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.
@@ -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.4",
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,14 @@ 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
+ 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._unaryPatterns.push(clone);
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 > 1;
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 lastUnaryNode: Node | null = null;
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
- for (let i = 0; i < this._unaryPatterns.length; i++) {
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
- const pattern = this._unaryPatterns[i];
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
- lastUnaryNode = node;
332
+ lastAtomNode = node;
274
333
 
275
334
  break;
276
335
  } else {
277
- lastUnaryNode = null;
336
+ lastAtomNode = null;
278
337
  cursor.resolveError();
279
338
  }
280
339
  }
281
340
 
282
- if (lastUnaryNode == null) {
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 && lastUnaryNode != null) {
290
- lastBinaryNode.appendChild(lastUnaryNode);
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 && lastUnaryNode != null) {
306
- lastBinaryNode.appendChild(lastUnaryNode);
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 ? lastUnaryNode as Node : lastBinaryNode.findRoot();
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
- const recursiveNode = createNode(name, [lastUnaryNode, ...node.children]);
317
- recursiveNode.normalize(lastUnaryNode.startIndex);
318
- lastUnaryNode = recursiveNode;
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(lastUnaryNode);
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 lastUnaryNode;
351
- } else if (lastUnaryNode != null) {
352
- lastBinaryNode.appendChild(lastUnaryNode);
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 && lastUnaryNode != null && delimiterNode != null) {
359
- const node = createNode(name, [lastUnaryNode, delimiterNode]);
427
+ if (lastBinaryNode == null && lastAtomNode != null && delimiterNode != null) {
428
+ const node = createNode(name, [lastAtomNode, delimiterNode]);
360
429
  lastBinaryNode = node;
361
- } else if (lastBinaryNode != null && lastUnaryNode != null && delimiterNode != 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, [lastUnaryNode, delimiterNode]);
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(lastUnaryNode);
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(lastUnaryNode);
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, [lastUnaryNode, delimiterNode]);
471
+ const node = createNode(name, [lastAtomNode, delimiterNode]);
403
472
  lastBinaryNode = node;
404
473
  }
405
474
 
406
475
  } else {
407
- const node = createNode(name, [lastUnaryNode, delimiterNode]);
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 lastUnaryNode;
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 lastUnaryNode;
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._unaryPatterns.map(p => p.getTokens()).flat();
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._unaryPatterns.map(p => p.getPatterns()).flat();
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);