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.
- package/dist/index.browser.js +22 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.esm.js +22 -0
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +22 -0
- package/dist/index.js.map +1 -1
- package/dist/patterns/Expression.d.ts +3 -0
- package/package.json +1 -1
- package/src/patterns/Expression.ts +28 -0
|
@@ -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
|
@@ -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
|
|