clarity-pattern-parser 4.0.3 → 6.0.0

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 (133) hide show
  1. package/README.md +466 -1
  2. package/TODO.md +76 -2
  3. package/dist/ast/Node.d.ts +49 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1513 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +17 -17
  8. package/dist/index.esm.js +1480 -1459
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1481 -1463
  11. package/dist/index.js.map +1 -1
  12. package/dist/intellisense/AutoComplete.d.ts +28 -0
  13. package/dist/intellisense/Suggestion.d.ts +11 -0
  14. package/dist/intellisense/SuggestionOption.d.ts +4 -0
  15. package/dist/patterns/And.d.ts +37 -24
  16. package/dist/patterns/Cursor.d.ts +37 -0
  17. package/dist/patterns/CursorHistory.d.ts +30 -0
  18. package/dist/patterns/Literal.d.ts +35 -19
  19. package/dist/patterns/Not.d.ts +29 -11
  20. package/dist/patterns/Or.d.ts +33 -22
  21. package/dist/patterns/ParseError.d.ts +6 -8
  22. package/dist/patterns/ParseResult.d.ts +6 -0
  23. package/dist/patterns/Pattern.d.ts +20 -26
  24. package/dist/patterns/Reference.d.ts +34 -12
  25. package/dist/patterns/Regex.d.ts +41 -21
  26. package/dist/patterns/Repeat.d.ts +38 -20
  27. package/dist/patterns/clonePatterns.d.ts +2 -0
  28. package/dist/patterns/filterOutNull.d.ts +2 -0
  29. package/dist/patterns/findPattern.d.ts +2 -0
  30. package/dist/patterns/getNextPattern.d.ts +2 -0
  31. package/jest.config.js +2 -1
  32. package/package.json +4 -5
  33. package/rollup.config.js +1 -1
  34. package/src/ast/Node.test.ts +364 -0
  35. package/src/ast/Node.ts +237 -23
  36. package/src/index.ts +25 -27
  37. package/src/intellisense/AutoComplete.test.ts +150 -0
  38. package/src/intellisense/AutoComplete.ts +200 -0
  39. package/src/intellisense/Suggestion.ts +12 -0
  40. package/src/intellisense/SuggestionOption.ts +4 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  42. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  43. package/src/intellisense/css/hex.ts +6 -0
  44. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  45. package/src/intellisense/css/name.ts +5 -0
  46. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  47. package/src/intellisense/css/spaces.ts +6 -0
  48. package/src/intellisense/css/unit.ts +10 -0
  49. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  50. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  51. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  52. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  53. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  54. package/src/intellisense/javascript/escapedCharacter.ts +49 -0
  55. package/src/intellisense/javascript/exponent.ts +24 -0
  56. package/src/intellisense/javascript/expression.ts +87 -0
  57. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  58. package/src/intellisense/javascript/fraction.ts +11 -0
  59. package/src/intellisense/javascript/infixOperator.ts +36 -0
  60. package/src/intellisense/javascript/integer.ts +7 -0
  61. package/src/intellisense/javascript/invocation.ts +28 -0
  62. package/src/intellisense/javascript/literal.ts +14 -0
  63. package/src/intellisense/javascript/name.ts +3 -0
  64. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  65. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  66. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  67. package/src/intellisense/javascript/parameters.ts +20 -0
  68. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  69. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  70. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  71. package/src/patterns/And.test.ts +310 -0
  72. package/src/patterns/And.ts +244 -119
  73. package/src/patterns/Cursor.test.ts +93 -0
  74. package/src/patterns/Cursor.ts +133 -0
  75. package/src/patterns/CursorHistory.test.ts +54 -0
  76. package/src/patterns/CursorHistory.ts +95 -0
  77. package/src/patterns/Literal.test.ts +166 -0
  78. package/src/patterns/Literal.ts +141 -62
  79. package/src/patterns/Not.test.ts +168 -0
  80. package/src/patterns/Not.ts +113 -32
  81. package/src/patterns/Or.test.ts +209 -0
  82. package/src/patterns/Or.ts +128 -97
  83. package/src/patterns/ParseError.ts +3 -7
  84. package/src/patterns/ParseResult.ts +7 -0
  85. package/src/patterns/Pattern.ts +21 -150
  86. package/src/patterns/Reference.test.ts +193 -0
  87. package/src/patterns/Reference.ts +114 -88
  88. package/src/patterns/Regex.test.ts +133 -0
  89. package/src/patterns/Regex.ts +117 -60
  90. package/src/patterns/Repeat.test.ts +218 -0
  91. package/src/patterns/Repeat.ts +220 -103
  92. package/src/patterns/clonePatterns.ts +5 -0
  93. package/src/patterns/filterOutNull.ts +13 -0
  94. package/src/patterns/findPattern.ts +25 -0
  95. package/src/Cursor.ts +0 -141
  96. package/src/CursorHistory.ts +0 -146
  97. package/src/TextSuggester.ts +0 -317
  98. package/src/ast/Visitor.ts +0 -271
  99. package/src/patterns/LookAhead.ts +0 -32
  100. package/src/patterns/Recursive.ts +0 -92
  101. package/src/tests/And.test.ts +0 -180
  102. package/src/tests/ComplexExamples.test.ts +0 -86
  103. package/src/tests/CssPatterns.test.ts +0 -90
  104. package/src/tests/CursorHistory.test.ts +0 -107
  105. package/src/tests/Cusor.test.ts +0 -174
  106. package/src/tests/HtmlPatterns.test.ts +0 -34
  107. package/src/tests/Literal.test.ts +0 -79
  108. package/src/tests/LookAhead.test.ts +0 -44
  109. package/src/tests/Not.test.ts +0 -51
  110. package/src/tests/Or.test.ts +0 -113
  111. package/src/tests/Pattern.test.ts +0 -290
  112. package/src/tests/Recursive.test.ts +0 -64
  113. package/src/tests/Reference.test.ts +0 -16
  114. package/src/tests/Repeat.test.ts +0 -75
  115. package/src/tests/SpeedTest.test.ts +0 -31
  116. package/src/tests/TextSuggester.test.ts +0 -297
  117. package/src/tests/Visitor.test.ts +0 -331
  118. package/src/tests/cssPatterns/hex.ts +0 -5
  119. package/src/tests/cssPatterns/name.ts +0 -5
  120. package/src/tests/cssPatterns/number.ts +0 -8
  121. package/src/tests/cssPatterns/spaces.ts +0 -5
  122. package/src/tests/cssPatterns/unit.ts +0 -8
  123. package/src/tests/htmlPatterns/element.ts +0 -49
  124. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  125. package/src/tests/javascriptPatterns/json.ts +0 -67
  126. package/src/tests/javascriptPatterns/name.ts +0 -5
  127. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  128. package/src/tests/javascriptPatterns/string.ts +0 -84
  129. package/src/tests/javascriptPatterns/unit.ts +0 -8
  130. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  131. package/src/tests/naturalLanguage/filter.ts +0 -37
  132. package/src/tests/patterns/sentence.ts +0 -37
  133. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -0,0 +1,54 @@
1
+ import { Node } from "../ast/Node";
2
+ import { CursorHistory } from "./CursorHistory"
3
+ import { Literal } from "./Literal";
4
+
5
+ describe("CursorHistory", () => {
6
+ test("Add Match", () => {
7
+ const history = new CursorHistory();
8
+ const pattern = new Literal("a", "A");
9
+ const node = new Node("literal", "a", 0, 0, [], "A");
10
+
11
+ history.startRecording();
12
+ history.recordMatch(pattern, node);
13
+
14
+ expect(history.isRecording).toBeTruthy();
15
+
16
+ expect(history.leafMatch.node).toBe(node);
17
+ expect(history.leafMatch.pattern).toBe(pattern);
18
+
19
+ expect(history.rootMatch.node).toBe(node);
20
+ expect(history.rootMatch.pattern).toBe(pattern);
21
+
22
+ expect(history.nodes[0]).toBe(node);
23
+ expect(history.patterns[0]).toBe(pattern);
24
+
25
+ history.stopRecording();
26
+
27
+ expect(history.isRecording).toBeFalsy();
28
+ });
29
+
30
+ test("Add Error At", () => {
31
+ const history = new CursorHistory();
32
+ const pattern = new Literal("a", "A");
33
+
34
+ history.startRecording();
35
+ history.recordErrorAt(0, pattern);
36
+
37
+ expect(history.error?.index).toBe(0);
38
+ expect(history.error?.pattern).toBe(pattern);
39
+ expect(history.errors[0]?.index).toBe(0);
40
+ expect(history.errors[0]?.pattern).toBe(pattern);
41
+
42
+ history.stopRecording()
43
+ history.resolveError();
44
+
45
+ expect(history.isRecording).toBeFalsy();
46
+ expect(history.error).toBeNull();
47
+
48
+ expect(history.errors[0]?.index).toBe(0);
49
+ expect(history.errors[0]?.pattern).toBe(pattern);
50
+
51
+ expect(history.furthestError?.index).toBe(0);
52
+ expect(history.furthestError?.pattern).toBe(pattern);
53
+ });
54
+ });
@@ -0,0 +1,95 @@
1
+ import { Node } from "../ast/Node";
2
+ import { ParseError } from "./ParseError";
3
+ import { Pattern } from "./Pattern";
4
+
5
+ export interface Match {
6
+ pattern: Pattern | null;
7
+ node: Node | null;
8
+ }
9
+
10
+ export class CursorHistory {
11
+ private _isRecording: boolean = false;
12
+ private _leafMatch: Match = { pattern: null, node: null };
13
+ private _furthestError: ParseError | null = null;
14
+ private _currentError: ParseError | null = null;
15
+ private _rootMatch: Match = { pattern: null, node: null };
16
+ private _patterns: Pattern[] = [];
17
+ private _nodes: Node[] = [];
18
+ private _errors: ParseError[] = [];
19
+
20
+ get isRecording(): boolean {
21
+ return this._isRecording;
22
+ }
23
+
24
+ get rootMatch(): Match {
25
+ return this._rootMatch;
26
+ }
27
+
28
+ get leafMatch(): Match {
29
+ return this._leafMatch;
30
+ }
31
+
32
+ get furthestError(): ParseError | null {
33
+ return this._furthestError;
34
+ }
35
+
36
+ get errors(): ParseError[] {
37
+ return this._errors;
38
+ }
39
+
40
+ get error(): ParseError | null {
41
+ return this._currentError
42
+ }
43
+
44
+ get nodes(): Node[] {
45
+ return this._nodes;
46
+ }
47
+
48
+ get patterns(): Pattern[] {
49
+ return this._patterns;
50
+ }
51
+
52
+ recordMatch(pattern: Pattern, node: Node): void {
53
+ if (this._isRecording) {
54
+ this._patterns.push(pattern);
55
+ this._nodes.push(node);
56
+ }
57
+
58
+ this._rootMatch.pattern = pattern;
59
+ this._rootMatch.node = node;
60
+
61
+ const isFurthestMatch =
62
+ this._leafMatch.node === null || node.lastIndex > this._leafMatch.node.lastIndex;
63
+
64
+ if (isFurthestMatch) {
65
+ this._leafMatch.pattern = pattern;
66
+ this._leafMatch.node = node;
67
+ }
68
+ }
69
+
70
+ recordErrorAt(index: number, pattern: Pattern): void {
71
+ const error = new ParseError(index, pattern);
72
+ this._currentError = error;
73
+
74
+ if (this._furthestError === null || index > this._furthestError.index) {
75
+ this._furthestError = error;
76
+ }
77
+
78
+ if (this._isRecording) {
79
+ this._errors.push(error);
80
+ }
81
+ }
82
+
83
+ startRecording(): void {
84
+ this._isRecording = true;
85
+ }
86
+
87
+ stopRecording(): void {
88
+ this._isRecording = false;
89
+ }
90
+
91
+ resolveError() {
92
+ this._currentError = null;
93
+ }
94
+
95
+ }
@@ -0,0 +1,166 @@
1
+ import { Node } from "../ast/Node";
2
+ import { And } from "./And";
3
+ import { Cursor } from "./Cursor";
4
+ import { Literal } from "./Literal"
5
+
6
+ describe("Literal", () => {
7
+ test("Empty Value", () => {
8
+ expect(() => {
9
+ new Literal("empty", "")
10
+ }).toThrowError()
11
+ });
12
+
13
+ test("Successful Parse", () => {
14
+ const literal = new Literal("greeting", "Hello World!");
15
+
16
+ const cursor = new Cursor("Hello World!");
17
+ const result = literal.parse(cursor);
18
+ const expected = new Node("literal", "greeting", 0, 11, [], "Hello World!");
19
+
20
+ expect(result).toEqual(expected);
21
+ expect(cursor.index).toBe(11);
22
+ expect(cursor.error).toBeNull();
23
+ expect(cursor.leafMatch.node).toEqual(expected)
24
+ expect(cursor.leafMatch.pattern).toBe(literal)
25
+ expect(cursor.rootMatch.node).toEqual(expected)
26
+ expect(cursor.rootMatch.pattern).toBe(literal)
27
+ });
28
+
29
+ test("Failed Parse", () => {
30
+ const literal = new Literal("greeting", "Hello World!");
31
+
32
+ const cursor = new Cursor("Hello Saturn!");
33
+ const result = literal.parse(cursor);
34
+
35
+ expect(result).toEqual(null);
36
+ expect(cursor.index).toBe(6);
37
+ expect(cursor.error?.index).toBe(6);
38
+ expect(cursor.error?.pattern).toBe(literal)
39
+ });
40
+
41
+ test("Failed Parse Because End Of Text", () => {
42
+ const literal = new Literal("greeting", "Hello World!");
43
+
44
+ const cursor = new Cursor("Hello World");
45
+ const result = literal.parse(cursor);
46
+
47
+ expect(result).toEqual(null);
48
+ expect(cursor.index).toBe(10);
49
+ expect(cursor.error?.index).toBe(10);
50
+ expect(cursor.error?.pattern).toBe(literal)
51
+ });
52
+
53
+ test("Failed Parse (Optional)", () => {
54
+ const literal = new Literal("greeting", "Hello World!", true);
55
+
56
+ const cursor = new Cursor("Hello Saturn!");
57
+ const result = literal.parse(cursor);
58
+
59
+ expect(result).toEqual(null);
60
+ expect(cursor.index).toBe(0);
61
+ expect(cursor.error).toBeNull();
62
+ });
63
+
64
+ test("Clone", () => {
65
+ const literal = new Literal("greeting", "Hello World!");
66
+ const clone = literal.clone();
67
+
68
+ expect(clone.name).toBe("greeting");
69
+ expect(clone).not.toBe(literal);
70
+ });
71
+
72
+ test("Get Tokens", () => {
73
+ const a = new Literal("a", "A");
74
+
75
+ const tokens = a.getTokens();
76
+ const expectedTokens = ["A"];
77
+
78
+ expect(tokens).toEqual(expectedTokens);
79
+ });
80
+
81
+ test("Get Tokens After", () => {
82
+ const literal = new Literal("a", "A");
83
+ const tokens = literal.getTokensAfter(new Literal("bogus", "bogus"));
84
+ const expected: string[] = [];
85
+
86
+ expect(tokens).toEqual(expected)
87
+ });
88
+
89
+ test("Properties", () => {
90
+ const literal = new Literal("a", "A");
91
+
92
+ expect(literal.type).toBe("literal");
93
+ expect(literal.name).toBe("a");
94
+ expect(literal.parent).toBeNull();
95
+ expect(literal.children).toEqual([]);
96
+ });
97
+
98
+ test("Exec", () => {
99
+ const literal = new Literal("a", "A");
100
+ const { ast: result } = literal.exec("B");
101
+ expect(result).toBeNull()
102
+ });
103
+
104
+ test("Test With No Match", () => {
105
+ const literal = new Literal("a", "A");
106
+ const isMatch = literal.test("B");
107
+
108
+ expect(isMatch).toBeFalsy();
109
+ });
110
+
111
+ test("Test With Match", () => {
112
+ const literal = new Literal("a", "A");
113
+ const isMatch = literal.test("A");
114
+
115
+ expect(isMatch).toBeTruthy();
116
+ });
117
+
118
+ test("Get Next Tokens", () => {
119
+ const sequence = new And("sequence", [new Literal("a", "A")]);
120
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
121
+
122
+ const a = parent.findPattern(p => p.name === "a");
123
+ const tokens = a?.getNextTokens() || [];
124
+
125
+ expect(tokens[0]).toBe("B");
126
+ });
127
+
128
+ test("Get Next Tokens With Null Parent", () => {
129
+ const a = new Literal("a", "A");
130
+ const tokens = a.getNextTokens();
131
+
132
+ expect(tokens.length).toBe(0);
133
+ });
134
+
135
+ test("Get Next Patterns", () => {
136
+ const sequence = new And("sequence", [new Literal("a", "A")]);
137
+ const parent = new And("parent", [sequence, new Literal("b", "B")]);
138
+
139
+ const a = parent.findPattern(p => p.name === "a");
140
+ const nextPatterns = a?.getNextPatterns() || [];
141
+ const b = parent.findPattern(p => p.name === "b")
142
+
143
+ expect(nextPatterns[0]).toBe(b);
144
+ });
145
+
146
+ test("Get Next Patterns With Null Parent", () => {
147
+ const a = new Literal("a", "A");
148
+ const nextPatterns = a.getNextPatterns();
149
+
150
+ expect(nextPatterns.length).toBe(0);
151
+ });
152
+
153
+ test("Get Patterns After", () => {
154
+ const a = new Literal("a", "A");
155
+ const patterns = a.getPatternsAfter();
156
+
157
+ expect(patterns.length).toBe(0);
158
+ });
159
+
160
+ test("Find Pattern", () => {
161
+ const a = new Literal("a", "A");
162
+ const pattern = a.findPattern(p => p.name === "nada");
163
+
164
+ expect(pattern).toBeNull();
165
+ });
166
+ });
@@ -1,91 +1,170 @@
1
- import ParseError from "./ParseError";
2
- import Node from "../ast/Node";
3
- import Pattern from "./Pattern";
4
- import Cursor from "../Cursor";
1
+ import { Node } from "../ast/Node";
2
+ import { Cursor } from "./Cursor";
3
+ import { Pattern } from "./Pattern";
5
4
 
6
- export default class Literal extends Pattern {
7
- public literal: string;
8
- public node: Node | null = null;
9
- public cursor!: Cursor;
10
- public mark: number = 0;
11
- public substring: string = "";
5
+ export class Literal implements Pattern {
6
+ private _type: string;
7
+ private _name: string;
8
+ private _parent: Pattern | null;
9
+ private _isOptional: boolean;
10
+ private _literal: string;
11
+ private _runes: string[];
12
+ private _firstIndex: number;
13
+ private _lastIndex: number;
12
14
 
13
- constructor(name: string, literal: string, isOptional = false) {
14
- super("literal", name, [], isOptional);
15
- this.literal = literal;
16
- this.assertArguments();
15
+ get type(): string {
16
+ return this._type;
17
17
  }
18
18
 
19
- parse(cursor: Cursor) {
20
- this.resetState(cursor);
21
- this.tryToParse();
19
+ get name(): string {
20
+ return this._name;
21
+ }
22
22
 
23
- return this.node;
23
+ get parent(): Pattern | null {
24
+ return this._parent;
24
25
  }
25
26
 
26
- clone(name?: string, isOptional?: boolean) {
27
- if (name == null) {
28
- name = this.name;
29
- }
27
+ set parent(pattern: Pattern | null) {
28
+ this._parent = pattern;
29
+ }
30
30
 
31
- if (isOptional == null) {
32
- isOptional = this._isOptional;
33
- }
34
-
35
- return new Literal(name, this.literal, isOptional);
31
+ get children(): Pattern[] {
32
+ return [];
36
33
  }
37
34
 
38
- getTokens() {
39
- return [this.literal];
35
+ get isOptional(): boolean {
36
+ return this._isOptional;
40
37
  }
41
38
 
42
- private assertArguments() {
43
- if (this.literal.length < 1) {
44
- throw new Error(
45
- "Invalid Arguments: The `literal` argument needs to be at least one character long."
46
- );
39
+ constructor(name: string, value: string, isOptional = false) {
40
+ if (value.length === 0) {
41
+ throw new Error("Value Cannot be empty.");
47
42
  }
43
+
44
+ this._type = "literal";
45
+ this._name = name;
46
+ this._literal = value;
47
+ this._runes = Array.from(value);
48
+ this._isOptional = isOptional;
49
+ this._parent = null;
50
+ this._firstIndex = 0;
51
+ this._lastIndex = 0;
48
52
  }
49
53
 
50
- private resetState(cursor: Cursor) {
51
- this.cursor = cursor;
52
- this.mark = this.cursor.mark();
53
- this.substring = this.cursor.text.substring(
54
- this.mark,
55
- this.mark + this.literal.length
56
- );
57
- this.node = null;
54
+ test(text: string) {
55
+ const cursor = new Cursor(text);
56
+ const ast = this.parse(cursor);
57
+
58
+ return ast?.value === text;
58
59
  }
59
60
 
60
- private tryToParse() {
61
- if (this.substring === this.literal) {
62
- this.processResult();
63
- } else {
64
- this.processError();
65
- }
61
+ exec(text: string) {
62
+ const cursor = new Cursor(text);
63
+ const ast = this.parse(cursor);
64
+
65
+ return {
66
+ ast: ast?.value === text ? ast : null,
67
+ cursor
68
+ };
66
69
  }
67
70
 
68
- private processError() {
69
- this.node = null;
71
+ parse(cursor: Cursor): Node | null {
72
+ this._firstIndex = cursor.index;
73
+
74
+ const passed = this._tryToParse(cursor);
75
+
76
+ if (passed) {
77
+ cursor.resolveError();
78
+ const node = this._createNode();
79
+ cursor.recordMatch(this, node);
80
+
81
+ return node;
82
+ }
70
83
 
71
84
  if (!this._isOptional) {
72
- const message = `ParseError: Expected '${this.literal}' but found '${this.substring}'.`;
73
- const parseError = new ParseError(message, this.cursor.getIndex(), this);
74
- this.cursor.throwError(parseError);
85
+ cursor.recordErrorAt(cursor.index, this)
86
+ return null;
75
87
  }
88
+
89
+ cursor.resolveError();
90
+ cursor.moveTo(this._firstIndex);
91
+ return null;
76
92
  }
77
93
 
78
- private processResult() {
79
- this.node = new Node(
94
+ private _tryToParse(cursor: Cursor): boolean {
95
+ let passed = false;
96
+ const literalRuneLength = this._runes.length;
97
+
98
+ for (let i = 0; i < literalRuneLength; i++) {
99
+ const literalRune = this._runes[i];
100
+ const cursorRune = cursor.currentChar;
101
+
102
+ if (literalRune !== cursorRune) {
103
+ break
104
+ }
105
+
106
+ if (i + 1 === literalRuneLength) {
107
+ this._lastIndex = this._firstIndex + this._literal.length - 1;
108
+ passed = true;
109
+ break;
110
+ }
111
+
112
+ if (!cursor.hasNext()) {
113
+ break;
114
+ }
115
+
116
+ cursor.next();
117
+ }
118
+
119
+ return passed
120
+ }
121
+
122
+ private _createNode(): Node {
123
+ return new Node(
80
124
  "literal",
81
- this.name,
82
- this.mark,
83
- this.mark + this.literal.length - 1,
84
- [],
85
- this.substring
125
+ this._name,
126
+ this._firstIndex,
127
+ this._lastIndex,
128
+ undefined,
129
+ this._literal
86
130
  );
131
+ }
132
+
133
+ clone(name = this._name, isOptional = this._isOptional): Pattern {
134
+ const clone = new Literal(name, this._literal, isOptional);
135
+ return clone;
136
+ }
137
+
138
+ getTokens(): string[] {
139
+ return [this._literal];
140
+ }
141
+
142
+ getTokensAfter(_lastMatched: Pattern): string[] {
143
+ return [];
144
+ }
145
+
146
+ getNextTokens(): string[] {
147
+ if (this.parent == null) {
148
+ return []
149
+ }
150
+
151
+ return this.parent.getTokensAfter(this);
152
+ }
153
+
154
+ getPatternsAfter(): Pattern[] {
155
+ return []
156
+ }
87
157
 
88
- this.cursor.index = this.node.endIndex;
89
- this.cursor.addMatch(this, this.node);
158
+ getNextPatterns(): Pattern[] {
159
+ if (this.parent == null) {
160
+ return [];
161
+ }
162
+
163
+ return this.parent.getPatternsAfter(this)
90
164
  }
165
+
166
+ findPattern(_predicate: (p: Pattern) => boolean): Pattern | null {
167
+ return null;
168
+ }
169
+
91
170
  }