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.
Files changed (169) hide show
  1. package/README.md +0 -191
  2. package/dist/ast/Node.d.ts +4 -5
  3. package/dist/index.browser.js +476 -731
  4. package/dist/index.browser.js.map +1 -1
  5. package/dist/index.d.ts +10 -18
  6. package/dist/index.esm.js +469 -716
  7. package/dist/index.esm.js.map +1 -1
  8. package/dist/index.js +476 -731
  9. package/dist/index.js.map +1 -1
  10. package/dist/patterns/And.d.ts +24 -0
  11. package/dist/patterns/Literal.d.ts +19 -0
  12. package/dist/patterns/LookAhead.d.ts +8 -0
  13. package/dist/patterns/Not.d.ts +11 -0
  14. package/dist/patterns/Or.d.ts +22 -0
  15. package/dist/patterns/Pattern.d.ts +6 -7
  16. package/dist/patterns/{RecursivePattern.d.ts → Recursive.d.ts} +4 -4
  17. package/dist/patterns/Reference.d.ts +14 -0
  18. package/dist/patterns/Regex.d.ts +21 -0
  19. package/dist/patterns/Repeat.d.ts +20 -0
  20. package/package.json +1 -1
  21. package/src/CursorHistory.ts +1 -1
  22. package/src/TextSuggester.ts +1 -1
  23. package/src/ast/Node.ts +20 -17
  24. package/src/ast/Visitor.ts +14 -18
  25. package/src/index.ts +17 -33
  26. package/src/patterns/And.ts +178 -0
  27. package/src/patterns/Literal.ts +91 -0
  28. package/src/patterns/Not.ts +50 -0
  29. package/src/patterns/Or.ts +132 -0
  30. package/src/patterns/Pattern.ts +31 -47
  31. package/src/patterns/Recursive.ts +92 -0
  32. package/src/patterns/{ReferencePattern.ts → Reference.ts} +32 -28
  33. package/src/patterns/Regex.ts +123 -0
  34. package/src/patterns/Repeat.ts +155 -0
  35. package/src/tests/{AndValue.test.ts → And.test.ts} +31 -41
  36. package/src/tests/CursorHistory.test.ts +6 -6
  37. package/src/tests/Cusor.test.ts +7 -10
  38. package/src/tests/Literal.test.ts +3 -5
  39. package/src/tests/LookAhead.test.ts +2 -51
  40. package/src/tests/Not.test.ts +51 -0
  41. package/src/tests/Or.test.ts +113 -0
  42. package/src/tests/Pattern.test.ts +40 -139
  43. package/src/tests/{RecursivePattern.test.ts → Recursive.test.ts} +10 -8
  44. package/src/tests/Reference.test.ts +16 -0
  45. package/src/tests/{RepeatValue.test.ts → Repeat.test.ts} +10 -42
  46. package/src/tests/TextSuggester.test.ts +30 -28
  47. package/src/tests/{NodeVisitor.test.ts → Visitor.test.ts} +42 -21
  48. package/src/tests/cssPatterns/cssValue.ts +2 -2
  49. package/src/tests/cssPatterns/divider.ts +2 -2
  50. package/src/tests/cssPatterns/hex.ts +2 -2
  51. package/src/tests/cssPatterns/method.ts +7 -9
  52. package/src/tests/cssPatterns/name.ts +2 -2
  53. package/src/tests/cssPatterns/number.ts +2 -2
  54. package/src/tests/cssPatterns/optionalSpaces.ts +1 -2
  55. package/src/tests/cssPatterns/spaces.ts +2 -2
  56. package/src/tests/cssPatterns/unit.ts +3 -3
  57. package/src/tests/cssPatterns/value.ts +2 -2
  58. package/src/tests/cssPatterns/values.ts +2 -2
  59. package/src/tests/htmlPatterns/element.ts +18 -33
  60. package/src/tests/javascriptPatterns/boolean.ts +2 -3
  61. package/src/tests/javascriptPatterns/json.ts +14 -26
  62. package/src/tests/javascriptPatterns/name.ts +3 -20
  63. package/src/tests/javascriptPatterns/number.ts +2 -2
  64. package/src/tests/javascriptPatterns/objectLiteral.ts +9 -16
  65. package/src/tests/javascriptPatterns/string.ts +26 -24
  66. package/src/tests/javascriptPatterns/unit.ts +3 -6
  67. package/src/tests/javascriptPatterns/whitespace.ts +8 -12
  68. package/src/tests/naturalLanguage/filter.ts +16 -33
  69. package/src/tests/patterns/sentence.ts +8 -8
  70. package/dist/Cursor.js +0 -105
  71. package/dist/Cursor.js.map +0 -1
  72. package/dist/CursorHistory.js +0 -104
  73. package/dist/CursorHistory.js.map +0 -1
  74. package/dist/Permutor.d.ts +0 -13
  75. package/dist/Permutor.js +0 -52
  76. package/dist/Permutor.js.map +0 -1
  77. package/dist/TextSuggester.js +0 -244
  78. package/dist/TextSuggester.js.map +0 -1
  79. package/dist/ast/CompositeNode.d.ts +0 -6
  80. package/dist/ast/CompositeNode.js +0 -17
  81. package/dist/ast/CompositeNode.js.map +0 -1
  82. package/dist/ast/Node.js +0 -16
  83. package/dist/ast/Node.js.map +0 -1
  84. package/dist/ast/NodeVisitor.d.ts +0 -31
  85. package/dist/ast/ValueNode.d.ts +0 -6
  86. package/dist/ast/ValueNode.js +0 -14
  87. package/dist/ast/ValueNode.js.map +0 -1
  88. package/dist/ast/Visitor.js +0 -209
  89. package/dist/ast/Visitor.js.map +0 -1
  90. package/dist/patterns/ParseError.js +0 -9
  91. package/dist/patterns/ParseError.js.map +0 -1
  92. package/dist/patterns/Pattern.js +0 -127
  93. package/dist/patterns/Pattern.js.map +0 -1
  94. package/dist/patterns/RecursivePattern.js +0 -65
  95. package/dist/patterns/RecursivePattern.js.map +0 -1
  96. package/dist/patterns/composite/AndComposite.d.ts +0 -22
  97. package/dist/patterns/composite/AndComposite.js +0 -117
  98. package/dist/patterns/composite/AndComposite.js.map +0 -1
  99. package/dist/patterns/composite/CompositePattern.d.ts +0 -4
  100. package/dist/patterns/composite/CompositePattern.js +0 -7
  101. package/dist/patterns/composite/CompositePattern.js.map +0 -1
  102. package/dist/patterns/composite/OptionalComposite.d.ts +0 -10
  103. package/dist/patterns/composite/OptionalComposite.js +0 -29
  104. package/dist/patterns/composite/OptionalComposite.js.map +0 -1
  105. package/dist/patterns/composite/OrComposite.d.ts +0 -16
  106. package/dist/patterns/composite/OrComposite.js +0 -69
  107. package/dist/patterns/composite/OrComposite.js.map +0 -1
  108. package/dist/patterns/composite/RepeatComposite.d.ts +0 -21
  109. package/dist/patterns/composite/RepeatComposite.js +0 -88
  110. package/dist/patterns/composite/RepeatComposite.js.map +0 -1
  111. package/dist/patterns/value/AndValue.d.ts +0 -21
  112. package/dist/patterns/value/AndValue.js +0 -118
  113. package/dist/patterns/value/AndValue.js.map +0 -1
  114. package/dist/patterns/value/AnyOfThese.d.ts +0 -18
  115. package/dist/patterns/value/AnyOfThese.js +0 -59
  116. package/dist/patterns/value/AnyOfThese.js.map +0 -1
  117. package/dist/patterns/value/Literal.d.ts +0 -20
  118. package/dist/patterns/value/Literal.js +0 -63
  119. package/dist/patterns/value/Literal.js.map +0 -1
  120. package/dist/patterns/value/NotValue.d.ts +0 -17
  121. package/dist/patterns/value/NotValue.js +0 -70
  122. package/dist/patterns/value/NotValue.js.map +0 -1
  123. package/dist/patterns/value/OptionalValue.d.ts +0 -9
  124. package/dist/patterns/value/OptionalValue.js +0 -32
  125. package/dist/patterns/value/OptionalValue.js.map +0 -1
  126. package/dist/patterns/value/OrValue.d.ts +0 -19
  127. package/dist/patterns/value/OrValue.js +0 -73
  128. package/dist/patterns/value/OrValue.js.map +0 -1
  129. package/dist/patterns/value/RegexValue.d.ts +0 -19
  130. package/dist/patterns/value/RegexValue.js +0 -69
  131. package/dist/patterns/value/RegexValue.js.map +0 -1
  132. package/dist/patterns/value/RepeatValue.d.ts +0 -19
  133. package/dist/patterns/value/RepeatValue.js +0 -89
  134. package/dist/patterns/value/RepeatValue.js.map +0 -1
  135. package/dist/patterns/value/ValuePattern.d.ts +0 -5
  136. package/dist/patterns/value/ValuePattern.js +0 -7
  137. package/dist/patterns/value/ValuePattern.js.map +0 -1
  138. package/src/Permutor.ts +0 -64
  139. package/src/ast/CompositeNode.ts +0 -26
  140. package/src/ast/ValueNode.ts +0 -28
  141. package/src/patterns/RecursivePattern.ts +0 -86
  142. package/src/patterns/composite/AndComposite.ts +0 -159
  143. package/src/patterns/composite/CompositePattern.ts +0 -7
  144. package/src/patterns/composite/OptionalComposite.ts +0 -37
  145. package/src/patterns/composite/OrComposite.ts +0 -96
  146. package/src/patterns/composite/RepeatComposite.ts +0 -130
  147. package/src/patterns/value/AndValue.ts +0 -152
  148. package/src/patterns/value/AnyOfThese.ts +0 -81
  149. package/src/patterns/value/Literal.ts +0 -92
  150. package/src/patterns/value/NotValue.ts +0 -95
  151. package/src/patterns/value/OptionalValue.ts +0 -39
  152. package/src/patterns/value/OrValue.ts +0 -103
  153. package/src/patterns/value/RegexValue.ts +0 -103
  154. package/src/patterns/value/RepeatValue.ts +0 -131
  155. package/src/patterns/value/ValuePattern.ts +0 -8
  156. package/src/tests/AndComposite.test.ts +0 -102
  157. package/src/tests/AnyOfThese.test.ts +0 -74
  158. package/src/tests/CompositeNode.test.ts +0 -33
  159. package/src/tests/NotValue.test.ts +0 -76
  160. package/src/tests/OptionalValue.test.ts +0 -50
  161. package/src/tests/OrComposite.test.ts +0 -75
  162. package/src/tests/OrValue.test.ts +0 -171
  163. package/src/tests/Permutor.test.ts +0 -30
  164. package/src/tests/ReferencePattern.test.ts +0 -24
  165. package/src/tests/RegexValue.test.ts +0 -22
  166. package/src/tests/RepeatComposite.test.ts +0 -58
  167. package/src/tests/ValueNode.test.ts +0 -24
  168. package/src/tests/javascriptPatterns/varStatement.ts +0 -0
  169. 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,5 +0,0 @@
1
- import Pattern from "../Pattern";
2
- export default abstract class ValuePattern extends Pattern {
3
- constructor(type: string, name: string, children?: ValuePattern[]);
4
- abstract clone(name?: string): ValuePattern;
5
- }
@@ -1,7 +0,0 @@
1
- import Pattern from "../Pattern";
2
- export default class ValuePattern extends Pattern {
3
- constructor(type, name, children = []) {
4
- super(type, name, children);
5
- }
6
- }
7
- //# sourceMappingURL=ValuePattern.js.map
@@ -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
- }
@@ -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
- }
@@ -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,7 +0,0 @@
1
- import Pattern from "../Pattern";
2
-
3
- export default abstract class CompositePattern extends Pattern {
4
- constructor(type: string, name: string, children: Pattern[] = []) {
5
- super(type, name, children);
6
- }
7
- }
@@ -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
- }