clarity-pattern-parser 3.0.16 → 4.0.1
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/README.md +0 -191
- package/dist/ast/Node.d.ts +4 -5
- package/dist/index.browser.js +476 -731
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +10 -18
- package/dist/index.esm.js +469 -716
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +476 -731
- package/dist/index.js.map +1 -1
- package/dist/patterns/And.d.ts +24 -0
- package/dist/patterns/Literal.d.ts +19 -0
- package/dist/patterns/LookAhead.d.ts +8 -0
- package/dist/patterns/Not.d.ts +11 -0
- package/dist/patterns/Or.d.ts +22 -0
- package/dist/patterns/Pattern.d.ts +6 -7
- package/dist/patterns/{RecursivePattern.d.ts → Recursive.d.ts} +4 -4
- package/dist/patterns/Reference.d.ts +14 -0
- package/dist/patterns/Regex.d.ts +21 -0
- package/dist/patterns/Repeat.d.ts +20 -0
- package/package.json +1 -1
- package/src/CursorHistory.ts +1 -1
- package/src/TextSuggester.ts +1 -1
- package/src/ast/Node.ts +20 -17
- package/src/ast/Visitor.ts +14 -18
- package/src/index.ts +17 -33
- package/src/patterns/And.ts +178 -0
- package/src/patterns/Literal.ts +91 -0
- package/src/patterns/Not.ts +50 -0
- package/src/patterns/Or.ts +132 -0
- package/src/patterns/Pattern.ts +31 -47
- package/src/patterns/Recursive.ts +92 -0
- package/src/patterns/{ReferencePattern.ts → Reference.ts} +32 -28
- package/src/patterns/Regex.ts +123 -0
- package/src/patterns/Repeat.ts +155 -0
- package/src/tests/{AndValue.test.ts → And.test.ts} +31 -41
- package/src/tests/CursorHistory.test.ts +6 -6
- package/src/tests/Cusor.test.ts +7 -10
- package/src/tests/Literal.test.ts +3 -5
- package/src/tests/LookAhead.test.ts +2 -51
- package/src/tests/Not.test.ts +51 -0
- package/src/tests/Or.test.ts +113 -0
- package/src/tests/Pattern.test.ts +40 -139
- package/src/tests/{RecursivePattern.test.ts → Recursive.test.ts} +10 -8
- package/src/tests/Reference.test.ts +16 -0
- package/src/tests/{RepeatValue.test.ts → Repeat.test.ts} +10 -42
- package/src/tests/TextSuggester.test.ts +30 -28
- package/src/tests/{NodeVisitor.test.ts → Visitor.test.ts} +42 -21
- package/src/tests/cssPatterns/cssValue.ts +2 -2
- package/src/tests/cssPatterns/divider.ts +2 -2
- package/src/tests/cssPatterns/hex.ts +2 -2
- package/src/tests/cssPatterns/method.ts +7 -9
- package/src/tests/cssPatterns/name.ts +2 -2
- package/src/tests/cssPatterns/number.ts +2 -2
- package/src/tests/cssPatterns/optionalSpaces.ts +1 -2
- package/src/tests/cssPatterns/spaces.ts +2 -2
- package/src/tests/cssPatterns/unit.ts +3 -3
- package/src/tests/cssPatterns/value.ts +2 -2
- package/src/tests/cssPatterns/values.ts +2 -2
- package/src/tests/htmlPatterns/element.ts +18 -33
- package/src/tests/javascriptPatterns/boolean.ts +2 -3
- package/src/tests/javascriptPatterns/json.ts +14 -26
- package/src/tests/javascriptPatterns/name.ts +3 -20
- package/src/tests/javascriptPatterns/number.ts +2 -2
- package/src/tests/javascriptPatterns/objectLiteral.ts +9 -16
- package/src/tests/javascriptPatterns/string.ts +26 -24
- package/src/tests/javascriptPatterns/unit.ts +3 -6
- package/src/tests/javascriptPatterns/whitespace.ts +8 -12
- package/src/tests/naturalLanguage/filter.ts +16 -33
- package/src/tests/patterns/sentence.ts +8 -8
- package/dist/Cursor.js +0 -105
- package/dist/Cursor.js.map +0 -1
- package/dist/CursorHistory.js +0 -104
- package/dist/CursorHistory.js.map +0 -1
- package/dist/Permutor.d.ts +0 -13
- package/dist/Permutor.js +0 -52
- package/dist/Permutor.js.map +0 -1
- package/dist/TextSuggester.js +0 -244
- package/dist/TextSuggester.js.map +0 -1
- package/dist/ast/CompositeNode.d.ts +0 -6
- package/dist/ast/CompositeNode.js +0 -17
- package/dist/ast/CompositeNode.js.map +0 -1
- package/dist/ast/Node.js +0 -16
- package/dist/ast/Node.js.map +0 -1
- package/dist/ast/NodeVisitor.d.ts +0 -31
- package/dist/ast/ValueNode.d.ts +0 -6
- package/dist/ast/ValueNode.js +0 -14
- package/dist/ast/ValueNode.js.map +0 -1
- package/dist/ast/Visitor.js +0 -209
- package/dist/ast/Visitor.js.map +0 -1
- package/dist/patterns/ParseError.js +0 -9
- package/dist/patterns/ParseError.js.map +0 -1
- package/dist/patterns/Pattern.js +0 -127
- package/dist/patterns/Pattern.js.map +0 -1
- package/dist/patterns/RecursivePattern.js +0 -65
- package/dist/patterns/RecursivePattern.js.map +0 -1
- package/dist/patterns/composite/AndComposite.d.ts +0 -22
- package/dist/patterns/composite/AndComposite.js +0 -117
- package/dist/patterns/composite/AndComposite.js.map +0 -1
- package/dist/patterns/composite/CompositePattern.d.ts +0 -4
- package/dist/patterns/composite/CompositePattern.js +0 -7
- package/dist/patterns/composite/CompositePattern.js.map +0 -1
- package/dist/patterns/composite/OptionalComposite.d.ts +0 -10
- package/dist/patterns/composite/OptionalComposite.js +0 -29
- package/dist/patterns/composite/OptionalComposite.js.map +0 -1
- package/dist/patterns/composite/OrComposite.d.ts +0 -16
- package/dist/patterns/composite/OrComposite.js +0 -69
- package/dist/patterns/composite/OrComposite.js.map +0 -1
- package/dist/patterns/composite/RepeatComposite.d.ts +0 -21
- package/dist/patterns/composite/RepeatComposite.js +0 -88
- package/dist/patterns/composite/RepeatComposite.js.map +0 -1
- package/dist/patterns/value/AndValue.d.ts +0 -21
- package/dist/patterns/value/AndValue.js +0 -118
- package/dist/patterns/value/AndValue.js.map +0 -1
- package/dist/patterns/value/AnyOfThese.d.ts +0 -18
- package/dist/patterns/value/AnyOfThese.js +0 -59
- package/dist/patterns/value/AnyOfThese.js.map +0 -1
- package/dist/patterns/value/Literal.d.ts +0 -20
- package/dist/patterns/value/Literal.js +0 -63
- package/dist/patterns/value/Literal.js.map +0 -1
- package/dist/patterns/value/NotValue.d.ts +0 -17
- package/dist/patterns/value/NotValue.js +0 -70
- package/dist/patterns/value/NotValue.js.map +0 -1
- package/dist/patterns/value/OptionalValue.d.ts +0 -9
- package/dist/patterns/value/OptionalValue.js +0 -32
- package/dist/patterns/value/OptionalValue.js.map +0 -1
- package/dist/patterns/value/OrValue.d.ts +0 -19
- package/dist/patterns/value/OrValue.js +0 -73
- package/dist/patterns/value/OrValue.js.map +0 -1
- package/dist/patterns/value/RegexValue.d.ts +0 -19
- package/dist/patterns/value/RegexValue.js +0 -69
- package/dist/patterns/value/RegexValue.js.map +0 -1
- package/dist/patterns/value/RepeatValue.d.ts +0 -19
- package/dist/patterns/value/RepeatValue.js +0 -89
- package/dist/patterns/value/RepeatValue.js.map +0 -1
- package/dist/patterns/value/ValuePattern.d.ts +0 -5
- package/dist/patterns/value/ValuePattern.js +0 -7
- package/dist/patterns/value/ValuePattern.js.map +0 -1
- package/src/Permutor.ts +0 -64
- package/src/ast/CompositeNode.ts +0 -26
- package/src/ast/ValueNode.ts +0 -28
- package/src/patterns/RecursivePattern.ts +0 -86
- package/src/patterns/composite/AndComposite.ts +0 -159
- package/src/patterns/composite/CompositePattern.ts +0 -7
- package/src/patterns/composite/OptionalComposite.ts +0 -37
- package/src/patterns/composite/OrComposite.ts +0 -96
- package/src/patterns/composite/RepeatComposite.ts +0 -130
- package/src/patterns/value/AndValue.ts +0 -152
- package/src/patterns/value/AnyOfThese.ts +0 -81
- package/src/patterns/value/Literal.ts +0 -92
- package/src/patterns/value/NotValue.ts +0 -95
- package/src/patterns/value/OptionalValue.ts +0 -39
- package/src/patterns/value/OrValue.ts +0 -103
- package/src/patterns/value/RegexValue.ts +0 -103
- package/src/patterns/value/RepeatValue.ts +0 -131
- package/src/patterns/value/ValuePattern.ts +0 -8
- package/src/tests/AndComposite.test.ts +0 -102
- package/src/tests/AnyOfThese.test.ts +0 -74
- package/src/tests/CompositeNode.test.ts +0 -33
- package/src/tests/NotValue.test.ts +0 -76
- package/src/tests/OptionalValue.test.ts +0 -50
- package/src/tests/OrComposite.test.ts +0 -75
- package/src/tests/OrValue.test.ts +0 -171
- package/src/tests/Permutor.test.ts +0 -30
- package/src/tests/ReferencePattern.test.ts +0 -24
- package/src/tests/RegexValue.test.ts +0 -22
- package/src/tests/RepeatComposite.test.ts +0 -58
- package/src/tests/ValueNode.test.ts +0 -24
- package/src/tests/javascriptPatterns/varStatement.ts +0 -0
- package/src/tests/readmeDemo.test.ts +0 -124
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
import ValuePattern from "./ValuePattern";
|
|
2
|
-
import ValueNode from "../../ast/ValueNode";
|
|
3
|
-
import Cursor from "../../Cursor";
|
|
4
|
-
export default class RepeatValue extends ValuePattern {
|
|
5
|
-
_pattern: ValuePattern;
|
|
6
|
-
_divider: ValuePattern;
|
|
7
|
-
nodes: ValueNode[];
|
|
8
|
-
cursor: Cursor;
|
|
9
|
-
mark: number;
|
|
10
|
-
node: ValueNode | null;
|
|
11
|
-
constructor(name: string, pattern: ValuePattern, divider?: ValuePattern);
|
|
12
|
-
private _assertArguments;
|
|
13
|
-
private _reset;
|
|
14
|
-
parse(cursor: Cursor): ValueNode | null;
|
|
15
|
-
private _tryPattern;
|
|
16
|
-
private _processMatch;
|
|
17
|
-
clone(name?: string): RepeatValue;
|
|
18
|
-
getTokens(): string[];
|
|
19
|
-
}
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import ValuePattern from "./ValuePattern";
|
|
2
|
-
import ValueNode from "../../ast/ValueNode";
|
|
3
|
-
import ParseError from "../ParseError";
|
|
4
|
-
import OptionalValue from "./OptionalValue";
|
|
5
|
-
export default class RepeatValue extends ValuePattern {
|
|
6
|
-
constructor(name, pattern, divider) {
|
|
7
|
-
super("repeat-value", name, divider != null ? [pattern, divider] : [pattern]);
|
|
8
|
-
this.nodes = [];
|
|
9
|
-
this.mark = 0;
|
|
10
|
-
this.node = null;
|
|
11
|
-
this._pattern = this.children[0];
|
|
12
|
-
this._divider = this.children[1];
|
|
13
|
-
this._assertArguments();
|
|
14
|
-
}
|
|
15
|
-
_assertArguments() {
|
|
16
|
-
if (this._pattern instanceof OptionalValue) {
|
|
17
|
-
throw new Error("Invalid Arguments: The pattern cannot be a optional pattern.");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
_reset(cursor) {
|
|
21
|
-
this.nodes = [];
|
|
22
|
-
this.cursor = cursor;
|
|
23
|
-
this.mark = this.cursor.mark();
|
|
24
|
-
}
|
|
25
|
-
parse(cursor) {
|
|
26
|
-
this._reset(cursor);
|
|
27
|
-
this._tryPattern();
|
|
28
|
-
return this.node;
|
|
29
|
-
}
|
|
30
|
-
_tryPattern() {
|
|
31
|
-
while (true) {
|
|
32
|
-
const node = this._pattern.parse(this.cursor);
|
|
33
|
-
if (this.cursor.hasUnresolvedError()) {
|
|
34
|
-
this._processMatch();
|
|
35
|
-
break;
|
|
36
|
-
}
|
|
37
|
-
else {
|
|
38
|
-
this.nodes.push(node);
|
|
39
|
-
if (node.endIndex === this.cursor.lastIndex()) {
|
|
40
|
-
this._processMatch();
|
|
41
|
-
break;
|
|
42
|
-
}
|
|
43
|
-
this.cursor.next();
|
|
44
|
-
if (this._divider != null) {
|
|
45
|
-
const mark = this.cursor.mark();
|
|
46
|
-
const node = this._divider.parse(this.cursor);
|
|
47
|
-
if (this.cursor.hasUnresolvedError()) {
|
|
48
|
-
this.cursor.moveToMark(mark);
|
|
49
|
-
this._processMatch();
|
|
50
|
-
break;
|
|
51
|
-
}
|
|
52
|
-
else {
|
|
53
|
-
this.nodes.push(node);
|
|
54
|
-
if (node.endIndex === this.cursor.lastIndex()) {
|
|
55
|
-
this._processMatch();
|
|
56
|
-
break;
|
|
57
|
-
}
|
|
58
|
-
this.cursor.next();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
_processMatch() {
|
|
65
|
-
const endsOnDivider = this.nodes.length % 2 === 0;
|
|
66
|
-
this.cursor.resolveError();
|
|
67
|
-
if (endsOnDivider) {
|
|
68
|
-
const parseError = new ParseError(`Did not find a repeating match of ${this.name}.`, this.mark, this);
|
|
69
|
-
this.cursor.throwError(parseError);
|
|
70
|
-
this.node = null;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
const value = this.nodes.map((node) => node.value).join("");
|
|
74
|
-
this.node = new ValueNode("repeat-value", this.name, value, this.nodes[0].startIndex, this.nodes[this.nodes.length - 1].endIndex);
|
|
75
|
-
this.cursor.index = this.node.endIndex;
|
|
76
|
-
this.cursor.addMatch(this, this.node);
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
clone(name) {
|
|
80
|
-
if (typeof name !== "string") {
|
|
81
|
-
name = this.name;
|
|
82
|
-
}
|
|
83
|
-
return new RepeatValue(name, this._pattern, this._divider);
|
|
84
|
-
}
|
|
85
|
-
getTokens() {
|
|
86
|
-
return this._pattern.getTokens();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
//# sourceMappingURL=RepeatValue.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"RepeatValue.js","sourceRoot":"","sources":["../../../src/patterns/value/RepeatValue.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ValuePattern.js","sourceRoot":"","sources":["../../../src/patterns/value/ValuePattern.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,YAAY,CAAC;AAEjC,MAAM,CAAC,OAAO,OAAgB,YAAa,SAAQ,OAAO;IACxD,YAAY,IAAY,EAAE,IAAY,EAAE,WAA2B,EAAE;QACnE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC9B,CAAC;CAEF"}
|
package/src/Permutor.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
export default class Permutor {
|
|
2
|
-
public array: Array<Array<string>>;
|
|
3
|
-
public positionToOptions: { [key: string]: string[] };
|
|
4
|
-
|
|
5
|
-
constructor() {
|
|
6
|
-
this.array = [];
|
|
7
|
-
this.positionToOptions = {};
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
permute(array: any) {
|
|
11
|
-
this.array = array;
|
|
12
|
-
this.createPositionMap();
|
|
13
|
-
return this.getPermutations();
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
getPermutations() {
|
|
17
|
-
return this.array[0].reduce((acc: any, value, index) => {
|
|
18
|
-
return acc.concat(this.getOptions(0, index));
|
|
19
|
-
}, []);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
getKey(x: number, y: number) {
|
|
23
|
-
return `${x}|${y}`;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
createPositionMap() {
|
|
27
|
-
this.positionToOptions = {};
|
|
28
|
-
|
|
29
|
-
for (let x = this.array.length - 1; x >= 0; x--) {
|
|
30
|
-
for (let y = 0; y < this.array[x].length; y++) {
|
|
31
|
-
const yValue = this.array[x][y];
|
|
32
|
-
const nextX = x + 1;
|
|
33
|
-
|
|
34
|
-
if (this.array[nextX] != null) {
|
|
35
|
-
const options = this.array[nextX];
|
|
36
|
-
|
|
37
|
-
const value = options
|
|
38
|
-
.map((option, index) => {
|
|
39
|
-
let permutations = this.getOptions(nextX, index);
|
|
40
|
-
|
|
41
|
-
return permutations.map((option) => {
|
|
42
|
-
return `${yValue}${option}`;
|
|
43
|
-
});
|
|
44
|
-
})
|
|
45
|
-
.reduce((acc, value) => {
|
|
46
|
-
return acc.concat(value);
|
|
47
|
-
}, []);
|
|
48
|
-
|
|
49
|
-
this.setOptions(x, y, value);
|
|
50
|
-
} else {
|
|
51
|
-
this.setOptions(x, y, [yValue]);
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
getOptions(x: number, y: number) {
|
|
58
|
-
return this.positionToOptions[this.getKey(x, y)];
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
setOptions(x: number, y: number, value: string[]) {
|
|
62
|
-
this.positionToOptions[this.getKey(x, y)] = value;
|
|
63
|
-
}
|
|
64
|
-
}
|
package/src/ast/CompositeNode.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import Node from "./Node";
|
|
2
|
-
|
|
3
|
-
export default class CompositeNode extends Node {
|
|
4
|
-
constructor(type: string, name: string, startIndex = 0, endIndex = 0) {
|
|
5
|
-
super(type, name, startIndex, endIndex, true);
|
|
6
|
-
}
|
|
7
|
-
|
|
8
|
-
clone() {
|
|
9
|
-
const node = new CompositeNode(
|
|
10
|
-
this.type,
|
|
11
|
-
this.name,
|
|
12
|
-
this.startIndex,
|
|
13
|
-
this.endIndex
|
|
14
|
-
);
|
|
15
|
-
|
|
16
|
-
node.children = this.children.map((child) => {
|
|
17
|
-
return child.clone();
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
return node;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
toString() {
|
|
24
|
-
return this.children.map((child) => child.toString()).join("");
|
|
25
|
-
}
|
|
26
|
-
}
|
package/src/ast/ValueNode.ts
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import Node from "./Node";
|
|
2
|
-
|
|
3
|
-
export default class ValueNode extends Node {
|
|
4
|
-
constructor(
|
|
5
|
-
type: string,
|
|
6
|
-
name: string,
|
|
7
|
-
value: string,
|
|
8
|
-
startIndex = 0,
|
|
9
|
-
endIndex = 0
|
|
10
|
-
) {
|
|
11
|
-
super(type, name, startIndex, endIndex);
|
|
12
|
-
this.value = value;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
clone() {
|
|
16
|
-
return new ValueNode(
|
|
17
|
-
this.type,
|
|
18
|
-
this.name,
|
|
19
|
-
this.value,
|
|
20
|
-
this.startIndex,
|
|
21
|
-
this.endIndex
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
toString() {
|
|
26
|
-
return this.value;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
import Pattern from "./Pattern";
|
|
2
|
-
import ParserError from "./ParseError";
|
|
3
|
-
import Cursor from "../Cursor";
|
|
4
|
-
|
|
5
|
-
export default class RecursivePattern extends Pattern {
|
|
6
|
-
public isRecursing: boolean;
|
|
7
|
-
public pattern: Pattern | null = null;
|
|
8
|
-
|
|
9
|
-
constructor(name: string) {
|
|
10
|
-
super("recursive", name);
|
|
11
|
-
this.isRecursing = false;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
getPattern() {
|
|
15
|
-
return this._climb(this.parent, (pattern: Pattern | null) => {
|
|
16
|
-
if (pattern == null) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
return pattern.name === this.name;
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
_climb(
|
|
24
|
-
pattern: Pattern | null,
|
|
25
|
-
isMatch: (pattern: Pattern | null) => boolean
|
|
26
|
-
): Pattern | null {
|
|
27
|
-
if (isMatch(pattern)) {
|
|
28
|
-
return pattern;
|
|
29
|
-
} else {
|
|
30
|
-
if (pattern && pattern.parent != null) {
|
|
31
|
-
return this._climb(pattern.parent, isMatch);
|
|
32
|
-
}
|
|
33
|
-
return null;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
parse(cursor: Cursor) {
|
|
38
|
-
if (this.pattern == null) {
|
|
39
|
-
const pattern = this.getPattern();
|
|
40
|
-
|
|
41
|
-
if (pattern == null) {
|
|
42
|
-
cursor.throwError(
|
|
43
|
-
new ParserError(
|
|
44
|
-
`Couldn't find parent pattern to recursively parse, with the name ${this.name}.`,
|
|
45
|
-
cursor.index,
|
|
46
|
-
this as Pattern
|
|
47
|
-
)
|
|
48
|
-
);
|
|
49
|
-
return null;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
this.pattern = pattern.clone();
|
|
53
|
-
this.pattern.parent = this as Pattern;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
const node = this.pattern.parse(cursor);
|
|
57
|
-
|
|
58
|
-
if (!cursor.hasUnresolvedError() && node != null) {
|
|
59
|
-
cursor.addMatch(this as Pattern, node);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
return node;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
clone(name?: string): Pattern {
|
|
66
|
-
if (typeof name !== "string") {
|
|
67
|
-
name = this.name;
|
|
68
|
-
}
|
|
69
|
-
return new RecursivePattern(name);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
getTokenValue() {
|
|
73
|
-
return this.getPattern()?.getTokenValue() || null;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
getTokens() {
|
|
77
|
-
if (!this.isRecursing) {
|
|
78
|
-
this.isRecursing = true;
|
|
79
|
-
const tokens = this.getPattern()?.getTokens() || [];
|
|
80
|
-
this.isRecursing = false;
|
|
81
|
-
|
|
82
|
-
return tokens;
|
|
83
|
-
}
|
|
84
|
-
return [];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
@@ -1,159 +0,0 @@
|
|
|
1
|
-
import CompositePattern from "./CompositePattern";
|
|
2
|
-
import CompositeNode from "../../ast/CompositeNode";
|
|
3
|
-
import ParseError from "../../patterns/ParseError";
|
|
4
|
-
import OptionalValue from "../value/OptionalValue";
|
|
5
|
-
import OptionalComposite from "./OptionalComposite";
|
|
6
|
-
import Pattern from "../Pattern";
|
|
7
|
-
import Cursor from "../../Cursor";
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
export default class AndComposite extends CompositePattern {
|
|
11
|
-
public index!: number;
|
|
12
|
-
public nodes!: CompositeNode[];
|
|
13
|
-
public node!: CompositeNode | null;
|
|
14
|
-
public cursor!: Cursor;
|
|
15
|
-
public mark!: number;
|
|
16
|
-
|
|
17
|
-
constructor(name: string, patterns: Pattern[] = []) {
|
|
18
|
-
super("and-composite", name, patterns);
|
|
19
|
-
this._assertArguments();
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
private _assertArguments() {
|
|
23
|
-
if (this._children.length < 2) {
|
|
24
|
-
throw new Error(
|
|
25
|
-
"Invalid Argument: AndValue needs to have more than one value pattern."
|
|
26
|
-
);
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
private _reset(cursor: Cursor) {
|
|
31
|
-
this.index = 0;
|
|
32
|
-
this.nodes = [];
|
|
33
|
-
this.node = null;
|
|
34
|
-
this.cursor = cursor;
|
|
35
|
-
this.mark = this.cursor.mark();
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
parse(cursor: Cursor) {
|
|
39
|
-
this._reset(cursor);
|
|
40
|
-
this._tryPatterns();
|
|
41
|
-
|
|
42
|
-
return this.node;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
private _tryPatterns() {
|
|
46
|
-
while (true) {
|
|
47
|
-
const pattern = this._children[this.index];
|
|
48
|
-
const node = pattern.parse(this.cursor) as CompositeNode;
|
|
49
|
-
|
|
50
|
-
if (this.cursor.hasUnresolvedError()) {
|
|
51
|
-
this.cursor.moveToMark(this.mark);
|
|
52
|
-
break;
|
|
53
|
-
} else {
|
|
54
|
-
this.nodes.push(node);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!this._next()) {
|
|
58
|
-
this._processValue();
|
|
59
|
-
break;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
private _next() {
|
|
65
|
-
if (this._hasMorePatterns()) {
|
|
66
|
-
if (this.cursor.hasNext()) {
|
|
67
|
-
// If the last result was a failed optional, then don't increment the cursor.
|
|
68
|
-
if (this.nodes[this.nodes.length - 1] != null) {
|
|
69
|
-
this.cursor.next();
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
this.index++;
|
|
73
|
-
return true;
|
|
74
|
-
} else if (this.nodes[this.nodes.length - 1] == null) {
|
|
75
|
-
this.index++;
|
|
76
|
-
return true;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
this._assertRestOfPatternsAreOptional();
|
|
80
|
-
return false;
|
|
81
|
-
} else {
|
|
82
|
-
return false;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
private _hasMorePatterns() {
|
|
87
|
-
return this.index + 1 < this._children.length;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
private _assertRestOfPatternsAreOptional() {
|
|
91
|
-
const areTheRestOptional = this.children.every((pattern, index) => {
|
|
92
|
-
return (
|
|
93
|
-
index <= this.index ||
|
|
94
|
-
pattern instanceof OptionalValue ||
|
|
95
|
-
pattern instanceof OptionalComposite
|
|
96
|
-
);
|
|
97
|
-
});
|
|
98
|
-
|
|
99
|
-
if (!areTheRestOptional) {
|
|
100
|
-
const parseError = new ParseError(
|
|
101
|
-
`Could not match ${this.name} before string ran out.`,
|
|
102
|
-
this.index,
|
|
103
|
-
this
|
|
104
|
-
);
|
|
105
|
-
this.cursor.throwError(parseError);
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
private _processValue() {
|
|
110
|
-
if (!this.cursor.hasUnresolvedError()) {
|
|
111
|
-
this.nodes = this.nodes.filter((node) => node != null);
|
|
112
|
-
|
|
113
|
-
const lastNode = this.nodes[this.nodes.length - 1];
|
|
114
|
-
const startIndex = this.mark;
|
|
115
|
-
const endIndex = lastNode.endIndex;
|
|
116
|
-
|
|
117
|
-
this.node = new CompositeNode(
|
|
118
|
-
"and-composite",
|
|
119
|
-
this.name,
|
|
120
|
-
startIndex,
|
|
121
|
-
endIndex
|
|
122
|
-
);
|
|
123
|
-
|
|
124
|
-
this.node.children = this.nodes;
|
|
125
|
-
|
|
126
|
-
this.cursor.index = this.node.endIndex;
|
|
127
|
-
this.cursor.addMatch(this, this.node);
|
|
128
|
-
} else {
|
|
129
|
-
this.node = null;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
clone(name?: string) {
|
|
134
|
-
if (typeof name !== "string") {
|
|
135
|
-
name = this.name;
|
|
136
|
-
}
|
|
137
|
-
return new AndComposite(name, this._children);
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
getTokens() {
|
|
141
|
-
let tokens: string[] = [];
|
|
142
|
-
|
|
143
|
-
for (let x = 0; x < this._children.length; x++) {
|
|
144
|
-
const child = this._children[x];
|
|
145
|
-
|
|
146
|
-
if (
|
|
147
|
-
child instanceof OptionalValue ||
|
|
148
|
-
child instanceof OptionalComposite
|
|
149
|
-
) {
|
|
150
|
-
tokens = tokens.concat(child.getTokens());
|
|
151
|
-
} else {
|
|
152
|
-
tokens = tokens.concat(child.getTokens());
|
|
153
|
-
break;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
|
|
157
|
-
return tokens;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import CompositePattern from "./CompositePattern";
|
|
2
|
-
import Pattern from "../Pattern";
|
|
3
|
-
import Cursor from "../../Cursor";
|
|
4
|
-
|
|
5
|
-
export default class OptionalComposite extends CompositePattern {
|
|
6
|
-
public mark: any;
|
|
7
|
-
|
|
8
|
-
constructor(pattern: Pattern) {
|
|
9
|
-
super("optional-composite", "optional-composite", [pattern]);
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
parse(cursor: Cursor) {
|
|
13
|
-
const mark = cursor.mark();
|
|
14
|
-
this.mark = mark;
|
|
15
|
-
|
|
16
|
-
const node = this.children[0].parse(cursor);
|
|
17
|
-
|
|
18
|
-
if (cursor.hasUnresolvedError()) {
|
|
19
|
-
cursor.resolveError();
|
|
20
|
-
cursor.moveToMark(mark);
|
|
21
|
-
return null;
|
|
22
|
-
} else {
|
|
23
|
-
if (node != null){
|
|
24
|
-
cursor.addMatch(this, node);
|
|
25
|
-
}
|
|
26
|
-
return node;
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
clone() {
|
|
31
|
-
return new OptionalComposite(this.children[0]);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
getTokens() {
|
|
35
|
-
return this._children[0].getTokens();
|
|
36
|
-
}
|
|
37
|
-
}
|
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import CompositePattern from "./CompositePattern";
|
|
2
|
-
import OptionalValue from "../value/OptionalValue";
|
|
3
|
-
import OptionalComposite from "./OptionalComposite";
|
|
4
|
-
import Pattern from "../Pattern";
|
|
5
|
-
import Cursor from "../../Cursor";
|
|
6
|
-
|
|
7
|
-
export default class OrComposite extends CompositePattern {
|
|
8
|
-
public cursor: any;
|
|
9
|
-
public mark: any;
|
|
10
|
-
public index: any;
|
|
11
|
-
public node: any;
|
|
12
|
-
|
|
13
|
-
constructor(name: string, patterns: Pattern[]) {
|
|
14
|
-
super("or-composite", name, patterns);
|
|
15
|
-
this._assertArguments();
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
private _assertArguments() {
|
|
19
|
-
if (this._children.length < 2) {
|
|
20
|
-
throw new Error(
|
|
21
|
-
"Invalid Argument: OrValue needs to have more than one value pattern."
|
|
22
|
-
);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
const hasOptionalChildren = this._children.some(
|
|
26
|
-
(pattern) =>
|
|
27
|
-
pattern instanceof OptionalValue || pattern instanceof OptionalComposite
|
|
28
|
-
);
|
|
29
|
-
|
|
30
|
-
if (hasOptionalChildren) {
|
|
31
|
-
throw new Error("OrComposite cannot have optional values.");
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
private _reset(cursor: Cursor) {
|
|
36
|
-
this.cursor = cursor;
|
|
37
|
-
this.mark = null;
|
|
38
|
-
this.index = 0;
|
|
39
|
-
this.node = null;
|
|
40
|
-
this.mark = cursor.mark();
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
parse(cursor: Cursor) {
|
|
44
|
-
this._reset(cursor);
|
|
45
|
-
this._tryPattern();
|
|
46
|
-
|
|
47
|
-
if (this.node != null) {
|
|
48
|
-
this.cursor.addMatch(this, this.node);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
return this.node;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
private _tryPattern() {
|
|
55
|
-
while (true) {
|
|
56
|
-
const pattern = this._children[this.index];
|
|
57
|
-
|
|
58
|
-
this.node = pattern.parse(this.cursor);
|
|
59
|
-
|
|
60
|
-
if (this.cursor.hasUnresolvedError()) {
|
|
61
|
-
if (this.index + 1 < this._children.length) {
|
|
62
|
-
this.cursor.resolveError();
|
|
63
|
-
this.index++;
|
|
64
|
-
this.cursor.moveToMark(this.mark);
|
|
65
|
-
} else {
|
|
66
|
-
this.node = null;
|
|
67
|
-
break;
|
|
68
|
-
}
|
|
69
|
-
} else {
|
|
70
|
-
this.cursor.index = this.node.endIndex;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
clone(name?: string) {
|
|
77
|
-
if (typeof name !== "string") {
|
|
78
|
-
name = this.name;
|
|
79
|
-
}
|
|
80
|
-
return new OrComposite(name, this._children);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
getTokens() {
|
|
84
|
-
const tokens = this._children.map((c) => c.getTokens());
|
|
85
|
-
|
|
86
|
-
const hasPrimitiveTokens = tokens.every((t) =>
|
|
87
|
-
t.every((value) => typeof value === "string")
|
|
88
|
-
);
|
|
89
|
-
|
|
90
|
-
if (hasPrimitiveTokens && tokens.length > 0) {
|
|
91
|
-
return tokens.reduce((acc, t) => acc.concat(t), []);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return this._children[0].getTokens();
|
|
95
|
-
}
|
|
96
|
-
}
|