clarity-pattern-parser 11.3.2 → 11.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.
@@ -23,6 +23,7 @@ export declare class Expression implements Pattern {
23
23
  private _shouldStopParsing;
24
24
  private _precedenceTree;
25
25
  private _hasOrganized;
26
+ private _atomsIdToAncestorsMap;
26
27
  get id(): string;
27
28
  get type(): string;
28
29
  get name(): string;
@@ -37,6 +38,7 @@ export declare class Expression implements Pattern {
37
38
  get startedOnIndex(): number;
38
39
  constructor(name: string, patterns: Pattern[]);
39
40
  private _organizePatterns;
41
+ private _cacheAncestors;
40
42
  private _extractName;
41
43
  private _isPrefix;
42
44
  private _extractPrefix;
@@ -53,6 +55,7 @@ export declare class Expression implements Pattern {
53
55
  private _tryToParse;
54
56
  private _tryToMatchPrefix;
55
57
  private _tryToMatchAtom;
58
+ private _isBeyondRecursiveAllowance;
56
59
  private _tryToMatchPostfix;
57
60
  private _tryToMatchBinary;
58
61
  test(text: string, record?: boolean): boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clarity-pattern-parser",
3
- "version": "11.3.2",
3
+ "version": "11.3.4",
4
4
  "description": "Parsing Library for Typescript and Javascript.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.esm.js",
@@ -32,6 +32,7 @@ export class Expression implements Pattern {
32
32
  private _shouldStopParsing: boolean;
33
33
  private _precedenceTree: PrecedenceTree;
34
34
  private _hasOrganized: boolean;
35
+ private _atomsIdToAncestorsMap: Record<string, Pattern[]>
35
36
 
36
37
  get id(): string {
37
38
  return this._id;
@@ -106,6 +107,7 @@ export class Expression implements Pattern {
106
107
  this._hasOrganized = false;
107
108
  this._patterns = [];
108
109
  this._precedenceTree = new PrecedenceTree({}, {});
110
+ this._atomsIdToAncestorsMap = {};
109
111
  }
110
112
 
111
113
  private _organizePatterns(patterns: Pattern[]) {
@@ -163,6 +165,21 @@ export class Expression implements Pattern {
163
165
  return finalPatterns;
164
166
  }
165
167
 
168
+ private _cacheAncestors() {
169
+ for (let atom of this._atomPatterns) {
170
+ const id = atom.id;
171
+ const ancestors: Pattern[] = this._atomsIdToAncestorsMap[id] = [];
172
+
173
+ let pattern: Pattern | null = this.parent;
174
+ while (pattern != null) {
175
+ if (pattern.id === id) {
176
+ ancestors.push(pattern);
177
+ }
178
+ pattern = pattern.parent;
179
+ }
180
+ }
181
+ }
182
+
166
183
  private _extractName(pattern: Pattern) {
167
184
  if (pattern.type === "right-associated") {
168
185
  return pattern.children[0].name;
@@ -262,6 +279,7 @@ export class Expression implements Pattern {
262
279
  if (!this._hasOrganized) {
263
280
  this._hasOrganized = true;
264
281
  this._organizePatterns(this._originalPatterns);
282
+ this._cacheAncestors();
265
283
  }
266
284
  }
267
285
 
@@ -367,6 +385,11 @@ export class Expression implements Pattern {
367
385
  cursor.moveTo(onIndex);
368
386
 
369
387
  const pattern = this._atomPatterns[i];
388
+
389
+ if (this._isBeyondRecursiveAllowance(pattern, onIndex)) {
390
+ continue;
391
+ }
392
+
370
393
  const node = pattern.parse(cursor);
371
394
 
372
395
  if (node != null) {
@@ -386,6 +409,11 @@ export class Expression implements Pattern {
386
409
  }
387
410
  }
388
411
 
412
+ private _isBeyondRecursiveAllowance(atom: Pattern, onIndex: number) {
413
+ const ancestors = this._atomsIdToAncestorsMap[atom.id];
414
+ return ancestors.some(a => a.startedOnIndex === onIndex);
415
+ }
416
+
389
417
  private _tryToMatchPostfix(cursor: Cursor) {
390
418
  let onIndex = cursor.index;
391
419