clarity-pattern-parser 3.0.8 → 3.0.10

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 (63) hide show
  1. package/dist/Cursor.js +105 -0
  2. package/dist/Cursor.js.map +1 -0
  3. package/dist/CursorHistory.js +104 -0
  4. package/dist/CursorHistory.js.map +1 -0
  5. package/dist/Permutor.js +52 -0
  6. package/dist/Permutor.js.map +1 -0
  7. package/dist/TextSuggester.js +223 -0
  8. package/dist/TextSuggester.js.map +1 -0
  9. package/dist/ast/CompositeNode.js +17 -0
  10. package/dist/ast/CompositeNode.js.map +1 -0
  11. package/dist/ast/Node.js +16 -0
  12. package/dist/ast/Node.js.map +1 -0
  13. package/dist/ast/ValueNode.js +14 -0
  14. package/dist/ast/ValueNode.js.map +1 -0
  15. package/dist/ast/Visitor.js +209 -0
  16. package/dist/ast/Visitor.js.map +1 -0
  17. package/dist/index.browser.js +13 -7
  18. package/dist/index.browser.js.map +1 -1
  19. package/dist/index.esm.js +13 -7
  20. package/dist/index.esm.js.map +1 -1
  21. package/dist/index.js +13 -7
  22. package/dist/index.js.map +1 -1
  23. package/dist/patterns/ParseError.js +9 -0
  24. package/dist/patterns/ParseError.js.map +1 -0
  25. package/dist/patterns/Pattern.js +127 -0
  26. package/dist/patterns/Pattern.js.map +1 -0
  27. package/dist/patterns/RecursivePattern.js +65 -0
  28. package/dist/patterns/RecursivePattern.js.map +1 -0
  29. package/dist/patterns/composite/AndComposite.js +117 -0
  30. package/dist/patterns/composite/AndComposite.js.map +1 -0
  31. package/dist/patterns/composite/CompositePattern.js +7 -0
  32. package/dist/patterns/composite/CompositePattern.js.map +1 -0
  33. package/dist/patterns/composite/OptionalComposite.js +29 -0
  34. package/dist/patterns/composite/OptionalComposite.js.map +1 -0
  35. package/dist/patterns/composite/OrComposite.js +69 -0
  36. package/dist/patterns/composite/OrComposite.js.map +1 -0
  37. package/dist/patterns/composite/RepeatComposite.js +83 -0
  38. package/dist/patterns/composite/RepeatComposite.js.map +1 -0
  39. package/dist/patterns/value/AndValue.js +118 -0
  40. package/dist/patterns/value/AndValue.js.map +1 -0
  41. package/dist/patterns/value/AnyOfThese.js +59 -0
  42. package/dist/patterns/value/AnyOfThese.js.map +1 -0
  43. package/dist/patterns/value/Literal.js +63 -0
  44. package/dist/patterns/value/Literal.js.map +1 -0
  45. package/dist/patterns/value/NotValue.js +70 -0
  46. package/dist/patterns/value/NotValue.js.map +1 -0
  47. package/dist/patterns/value/OptionalValue.js +32 -0
  48. package/dist/patterns/value/OptionalValue.js.map +1 -0
  49. package/dist/patterns/value/OrValue.js +73 -0
  50. package/dist/patterns/value/OrValue.js.map +1 -0
  51. package/dist/patterns/value/RegexValue.js +69 -0
  52. package/dist/patterns/value/RegexValue.js.map +1 -0
  53. package/dist/patterns/value/RepeatValue.js +84 -0
  54. package/dist/patterns/value/RepeatValue.js.map +1 -0
  55. package/dist/patterns/value/ValuePattern.js +7 -0
  56. package/dist/patterns/value/ValuePattern.js.map +1 -0
  57. package/package.json +1 -1
  58. package/src/TextSuggester.ts +21 -11
  59. package/src/patterns/composite/RepeatComposite.ts +6 -0
  60. package/src/patterns/value/RepeatValue.ts +6 -0
  61. package/src/tests/RepeatComposite.test.ts +19 -0
  62. package/src/tests/TextSuggester.test.ts +15 -0
  63. package/src/tests/javascriptPatterns/json.ts +1 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AndValue.js","sourceRoot":"","sources":["../../../src/patterns/value/AndValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import ValuePattern from "./ValuePattern";
2
+ import ParseError from "../ParseError";
3
+ import ValueNode from "../../ast/ValueNode";
4
+ export default class AnyOfThese extends ValuePattern {
5
+ constructor(name, characters) {
6
+ super("any-of-these", name);
7
+ this.node = null;
8
+ this.mark = 0;
9
+ this.characters = characters;
10
+ this._assertArguments();
11
+ }
12
+ _assertArguments() {
13
+ if (typeof this.characters !== "string") {
14
+ throw new Error("Invalid Arguments: The characters argument needs to be a string of characters.");
15
+ }
16
+ if (this.characters.length < 1) {
17
+ throw new Error("Invalid Arguments: The characters argument needs to be at least one character long.");
18
+ }
19
+ }
20
+ parse(cursor) {
21
+ this._reset(cursor);
22
+ this._tryPattern();
23
+ return this.node;
24
+ }
25
+ _reset(cursor) {
26
+ this.cursor = cursor;
27
+ this.mark = this.cursor.mark();
28
+ this.node = null;
29
+ }
30
+ _tryPattern() {
31
+ if (this._isMatch()) {
32
+ const value = this.cursor.getChar();
33
+ const index = this.cursor.getIndex();
34
+ this.node = new ValueNode("any-of-these", this.name, value, index, index);
35
+ this.cursor.addMatch(this, this.node);
36
+ }
37
+ else {
38
+ this._processError();
39
+ }
40
+ }
41
+ _isMatch() {
42
+ return this.characters.indexOf(this.cursor.getChar()) > -1;
43
+ }
44
+ _processError() {
45
+ const message = `ParseError: Expected one of these characters, '${this.characters}' but found '${this.cursor.getChar()}' while parsing for '${this.name}'.`;
46
+ const parseError = new ParseError(message, this.cursor.getIndex(), this);
47
+ this.cursor.throwError(parseError);
48
+ }
49
+ clone(name) {
50
+ if (typeof name !== "string") {
51
+ name = this.name;
52
+ }
53
+ return new AnyOfThese(name, this.characters);
54
+ }
55
+ getTokens() {
56
+ return this.characters.split("");
57
+ }
58
+ }
59
+ //# sourceMappingURL=AnyOfThese.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AnyOfThese.js","sourceRoot":"","sources":["../../../src/patterns/value/AnyOfThese.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,UAAU,MAAM,eAAe,CAAC;AACvC,OAAO,SAAS,MAAM,qBAAqB,CAAC;AAI5C,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,YAAY;IAMlD,YAAY,IAAY,EAAE,UAAkB;QAC1C,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,CAAC;QALvB,SAAI,GAAqB,IAAI,CAAC;QAE9B,SAAI,GAAW,CAAC,CAAC;QAItB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;QAC7B,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,EAAE;YACvC,MAAM,IAAI,KAAK,CACb,gFAAgF,CACjF,CAAC;SACH;QAED,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE;YAC9B,MAAM,IAAI,KAAK,CACb,qFAAqF,CACtF,CAAC;SACH;IACH,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACpB,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAEO,MAAM,CAAC,MAAc;QAC3B,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;YAErC,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,cAAc,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAE1E,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SACvC;aAAM;YACL,IAAI,CAAC,aAAa,EAAE,CAAC;SACtB;IACH,CAAC;IAEO,QAAQ;QACd,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7D,CAAC;IAEO,aAAa;QACnB,MAAM,OAAO,GAAG,kDACd,IAAI,CAAC,UACP,gBAAgB,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,wBAAwB,IAAI,CAAC,IAAI,IAAI,CAAC;QAE3E,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,IAAI,CAAC,CAAC;QACzE,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAa;QACjB,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;YAC5B,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;SAClB;QACD,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,63 @@
1
+ import ParseError from "../ParseError";
2
+ import ValueNode from "../../ast/ValueNode";
3
+ import ValuePattern from "./ValuePattern";
4
+ export default class Literal extends ValuePattern {
5
+ constructor(name, literal) {
6
+ super("literal", name);
7
+ this.node = null;
8
+ this.mark = 0;
9
+ this.substring = "";
10
+ this.literal = literal;
11
+ this._assertArguments();
12
+ }
13
+ _assertArguments() {
14
+ if (typeof this.literal !== "string") {
15
+ throw new Error("Invalid Arguments: The literal argument needs to be a string of characters.");
16
+ }
17
+ if (this.literal.length < 1) {
18
+ throw new Error("Invalid Arguments: The literalString argument needs to be at least one character long.");
19
+ }
20
+ }
21
+ parse(cursor) {
22
+ this._reset(cursor);
23
+ this._tryPattern();
24
+ return this.node;
25
+ }
26
+ _reset(cursor) {
27
+ this.cursor = cursor;
28
+ this.mark = this.cursor.mark();
29
+ this.substring = this.cursor.text.substring(this.mark, this.mark + this.literal.length);
30
+ this.node = null;
31
+ }
32
+ _tryPattern() {
33
+ if (this.substring === this.literal) {
34
+ this._processMatch();
35
+ }
36
+ else {
37
+ this._processError();
38
+ }
39
+ }
40
+ _processError() {
41
+ const message = `ParseError: Expected '${this.literal}' but found '${this.substring}'.`;
42
+ const parseError = new ParseError(message, this.cursor.getIndex(), this);
43
+ this.cursor.throwError(parseError);
44
+ }
45
+ _processMatch() {
46
+ this.node = new ValueNode("literal", this.name, this.substring, this.mark, this.mark + this.literal.length - 1);
47
+ this.cursor.index = this.node.endIndex;
48
+ this.cursor.addMatch(this, this.node);
49
+ }
50
+ clone(name) {
51
+ if (typeof name !== "string") {
52
+ name = this.name;
53
+ }
54
+ return new Literal(name, this.literal);
55
+ }
56
+ getTokenValue() {
57
+ return this.literal;
58
+ }
59
+ getTokens() {
60
+ return [this.getTokenValue()];
61
+ }
62
+ }
63
+ //# sourceMappingURL=Literal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Literal.js","sourceRoot":"","sources":["../../../src/patterns/value/Literal.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import ValuePattern from "./ValuePattern";
2
+ import ValueNode from "../../ast/ValueNode";
3
+ import ParseError from "../ParseError";
4
+ import Pattern from "../Pattern";
5
+ export default class NotValue extends ValuePattern {
6
+ constructor(name, pattern) {
7
+ super("not-value", name, [pattern]);
8
+ this.match = "";
9
+ this.node = null;
10
+ this.mark = 0;
11
+ this._assertArguments();
12
+ }
13
+ _assertArguments() {
14
+ if (!(this.children[0] instanceof Pattern)) {
15
+ throw new Error("Invalid Arguments: Expected the pattern to be a ValuePattern.");
16
+ }
17
+ if (typeof this.name !== "string") {
18
+ throw new Error("Invalid Arguments: Expected name to be a string.");
19
+ }
20
+ }
21
+ _reset(cursor) {
22
+ this.match = "";
23
+ this.node = null;
24
+ this.cursor = cursor;
25
+ this.mark = this.cursor.mark();
26
+ }
27
+ parse(cursor) {
28
+ this._reset(cursor);
29
+ this._tryPattern();
30
+ return this.node;
31
+ }
32
+ _tryPattern() {
33
+ while (true) {
34
+ const mark = this.cursor.mark();
35
+ this.children[0].parse(this.cursor);
36
+ if (this.cursor.hasUnresolvedError()) {
37
+ this.cursor.resolveError();
38
+ this.cursor.moveToMark(mark);
39
+ this.match += this.cursor.getChar();
40
+ break;
41
+ }
42
+ else {
43
+ this.cursor.moveToMark(mark);
44
+ break;
45
+ }
46
+ }
47
+ this._processMatch();
48
+ }
49
+ _processMatch() {
50
+ if (this.match.length === 0) {
51
+ const parseError = new ParseError(`Didn't find any characters that didn't match the ${this.children[0].name} pattern.`, this.mark, this);
52
+ this.cursor.throwError(parseError);
53
+ }
54
+ else {
55
+ this.node = new ValueNode("not-value", this.name, this.match, this.mark, this.mark);
56
+ this.cursor.index = this.node.endIndex;
57
+ this.cursor.addMatch(this, this.node);
58
+ }
59
+ }
60
+ clone(name) {
61
+ if (typeof name !== "string") {
62
+ name = this.name;
63
+ }
64
+ return new NotValue(name, this.children[0]);
65
+ }
66
+ getTokens() {
67
+ return [];
68
+ }
69
+ }
70
+ //# sourceMappingURL=NotValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NotValue.js","sourceRoot":"","sources":["../../../src/patterns/value/NotValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import ValuePattern from "./ValuePattern";
2
+ export default class OptionalValue extends ValuePattern {
3
+ constructor(pattern) {
4
+ super("optional-value", "optional-value", [pattern]);
5
+ this._assertArguments();
6
+ }
7
+ _assertArguments() {
8
+ if (!(this.children[0] instanceof ValuePattern)) {
9
+ throw new Error("Invalid Arguments: Expected a ValuePattern.");
10
+ }
11
+ }
12
+ parse(cursor) {
13
+ const mark = cursor.mark();
14
+ const node = this.children[0].parse(cursor);
15
+ if (cursor.hasUnresolvedError() || node == null) {
16
+ cursor.resolveError();
17
+ cursor.moveToMark(mark);
18
+ return null;
19
+ }
20
+ else {
21
+ cursor.addMatch(this, node);
22
+ return node;
23
+ }
24
+ }
25
+ clone() {
26
+ return new OptionalValue(this.children[0]);
27
+ }
28
+ getTokens() {
29
+ return this._children[0].getTokens();
30
+ }
31
+ }
32
+ //# sourceMappingURL=OptionalValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OptionalValue.js","sourceRoot":"","sources":["../../../src/patterns/value/OptionalValue.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAI1C,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY;IACrD,YAAY,OAAqB;QAC/B,KAAK,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;QACrD,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,YAAY,YAAY,CAAC,EAAE;YAC/C,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;SAChE;IACH,CAAC;IAED,KAAK,CAAC,MAAc;QAClB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;QAE3B,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAE5C,IAAI,MAAM,CAAC,kBAAkB,EAAE,IAAI,IAAI,IAAI,IAAI,EAAE;YAC/C,MAAM,CAAC,YAAY,EAAE,CAAC;YACtB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YACxB,OAAO,IAAI,CAAC;SACb;aAAM;YACL,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC5B,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IAED,KAAK;QACH,OAAO,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAiB,CAAC,CAAC;IAC7D,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;IACvC,CAAC;CACF"}
@@ -0,0 +1,73 @@
1
+ import ValuePattern from "./ValuePattern";
2
+ import ValueNode from "../../ast/ValueNode";
3
+ import OptionalValue from "./OptionalValue";
4
+ export default class OrValue extends ValuePattern {
5
+ constructor(name, patterns) {
6
+ super("or-value", name, patterns);
7
+ this.index = 0;
8
+ this.errors = [];
9
+ this.node = null;
10
+ this.mark = 0;
11
+ this.parseError = null;
12
+ this._assertArguments();
13
+ }
14
+ _assertArguments() {
15
+ if (this._children.length < 2) {
16
+ throw new Error("Invalid Argument: OrValue needs to have more than one value pattern.");
17
+ }
18
+ const hasOptionalChildren = this._children.some((pattern) => pattern instanceof OptionalValue);
19
+ if (hasOptionalChildren) {
20
+ throw new Error("OrValues cannot have optional values.");
21
+ }
22
+ }
23
+ _reset(cursor) {
24
+ this.index = 0;
25
+ this.errors = [];
26
+ this.node = null;
27
+ this.cursor = cursor;
28
+ this.mark = cursor.mark();
29
+ }
30
+ parse(cursor) {
31
+ this._reset(cursor);
32
+ this._tryPattern();
33
+ return this.node;
34
+ }
35
+ _tryPattern() {
36
+ while (true) {
37
+ const pattern = this._children[this.index];
38
+ const node = pattern.parse(this.cursor);
39
+ if (this.cursor.hasUnresolvedError()) {
40
+ if (this.index + 1 < this._children.length) {
41
+ this.cursor.resolveError();
42
+ this.index++;
43
+ this.cursor.moveToMark(this.mark);
44
+ }
45
+ else {
46
+ this.node = null;
47
+ break;
48
+ }
49
+ }
50
+ else {
51
+ this.node = new ValueNode("or-value", this.name, node.value, node.startIndex, node.endIndex);
52
+ this.cursor.index = this.node.endIndex;
53
+ this.cursor.addMatch(this, this.node);
54
+ break;
55
+ }
56
+ }
57
+ }
58
+ clone(name) {
59
+ if (typeof name !== "string") {
60
+ name = this.name;
61
+ }
62
+ return new OrValue(name, this._children);
63
+ }
64
+ getTokens() {
65
+ const tokens = this._children.map((c) => c.getTokens());
66
+ const hasPrimitiveTokens = tokens.every((t) => t.every((value) => typeof value === "string"));
67
+ if (hasPrimitiveTokens && tokens.length > 0) {
68
+ return tokens.reduce((acc, t) => acc.concat(t), []);
69
+ }
70
+ return this._children[0].getTokens();
71
+ }
72
+ }
73
+ //# sourceMappingURL=OrValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"OrValue.js","sourceRoot":"","sources":["../../../src/patterns/value/OrValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import ParseError from "../ParseError";
2
+ import ValueNode from "../../ast/ValueNode";
3
+ import ValuePattern from "./ValuePattern";
4
+ export default class RegexValue extends ValuePattern {
5
+ constructor(name, regex) {
6
+ super("regex-value", name);
7
+ this.node = null;
8
+ this.substring = "";
9
+ this.regexString = regex;
10
+ this.regex = new RegExp(`^${regex}`, "g");
11
+ this._assertArguments();
12
+ }
13
+ _assertArguments() {
14
+ if (typeof this.regexString !== "string") {
15
+ throw new Error("Invalid Arguments: The regex argument needs to be a string of regex.");
16
+ }
17
+ if (this.regexString.length < 1) {
18
+ throw new Error("Invalid Arguments: The regex string argument needs to be at least one character long.");
19
+ }
20
+ if (this.regexString.charAt(0) === "^") {
21
+ throw new Error("Invalid Arguments: The regex string cannot start with a '^' because it is expected to be in the middle of a string.");
22
+ }
23
+ if (this.regexString.charAt(this.regexString.length - 1) === "$") {
24
+ throw new Error("Invalid Arguments: The regex string cannot end with a '$' because it is expected to be in the middle of a string.");
25
+ }
26
+ }
27
+ parse(cursor) {
28
+ this._reset(cursor);
29
+ this._tryPattern();
30
+ return this.node;
31
+ }
32
+ _reset(cursor) {
33
+ this.cursor = cursor;
34
+ this.regex.lastIndex = 0;
35
+ this.substring = this.cursor.text.substr(this.cursor.getIndex());
36
+ this.node = null;
37
+ }
38
+ _tryPattern() {
39
+ const result = this.regex.exec(this.substring);
40
+ if (result != null && result.index === 0) {
41
+ const currentIndex = this.cursor.getIndex();
42
+ const newIndex = currentIndex + result[0].length - 1;
43
+ this.node = new ValueNode("regex-value", this.name, result[0], currentIndex, newIndex);
44
+ this.cursor.index = newIndex;
45
+ this.cursor.addMatch(this, this.node);
46
+ }
47
+ else {
48
+ this._processError();
49
+ }
50
+ }
51
+ _processError() {
52
+ const message = `ParseError: Expected regex pattern of '${this.regexString}' but found '${this.substring}'.`;
53
+ const parseError = new ParseError(message, this.cursor.getIndex(), this);
54
+ this.cursor.throwError(parseError);
55
+ }
56
+ clone(name) {
57
+ if (typeof name !== "string") {
58
+ name = this.name;
59
+ }
60
+ return new RegexValue(name, this.regexString);
61
+ }
62
+ getTokenValue() {
63
+ return this.name;
64
+ }
65
+ getTokens() {
66
+ return [this.name];
67
+ }
68
+ }
69
+ //# sourceMappingURL=RegexValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RegexValue.js","sourceRoot":"","sources":["../../../src/patterns/value/RegexValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
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
+ this.cursor.next();
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ _processMatch() {
61
+ this.cursor.resolveError();
62
+ if (this.nodes.length === 0) {
63
+ const parseError = new ParseError(`Did not find a repeating match of ${this.name}.`, this.mark, this);
64
+ this.cursor.throwError(parseError);
65
+ this.node = null;
66
+ }
67
+ else {
68
+ const value = this.nodes.map((node) => node.value).join("");
69
+ this.node = new ValueNode("repeat-value", this.name, value, this.nodes[0].startIndex, this.nodes[this.nodes.length - 1].endIndex);
70
+ this.cursor.index = this.node.endIndex;
71
+ this.cursor.addMatch(this, this.node);
72
+ }
73
+ }
74
+ clone(name) {
75
+ if (typeof name !== "string") {
76
+ name = this.name;
77
+ }
78
+ return new RepeatValue(name, this._pattern, this._divider);
79
+ }
80
+ getTokens() {
81
+ return this._pattern.getTokens();
82
+ }
83
+ }
84
+ //# sourceMappingURL=RepeatValue.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RepeatValue.js","sourceRoot":"","sources":["../../../src/patterns/value/RepeatValue.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
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
@@ -0,0 +1 @@
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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "clarity-pattern-parser",
3
- "version": "3.0.8",
3
+ "version": "3.0.10",
4
4
  "description": "Parsing Library for Typescript and Javascript.",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.esm.js",
@@ -172,24 +172,21 @@ export default class TextSuggester {
172
172
  }
173
173
 
174
174
  private saveNextToken() {
175
- if (
175
+ const isCompleteMatch =
176
176
  this.patternMatch?.pattern === this.rootPattern &&
177
- this.cursor?.didSuccessfullyParse()
178
- ) {
177
+ this.cursor?.didSuccessfullyParse();
178
+ const noMatch = this.patternMatch?.astNode == null;
179
+
180
+ if (isCompleteMatch) {
179
181
  this.tokens = null;
180
182
  return;
181
183
  }
182
184
 
183
- if (this.patternMatch?.astNode == null) {
185
+ if (noMatch) {
184
186
  let options = this.rootPattern?.getTokens();
185
- const parts = this.text.split(" ").filter((part: any) => {
186
- return part.length > 0;
187
- });
188
187
 
189
188
  options = options?.filter((option: any) => {
190
- return parts.some((part: any) => {
191
- return option.indexOf(part) > -1;
192
- });
189
+ return option.indexOf(this.text) > -1;
193
190
  });
194
191
 
195
192
  if (options?.length === 0) {
@@ -197,11 +194,24 @@ export default class TextSuggester {
197
194
  return;
198
195
  }
199
196
 
197
+ const values = options?.map((option) => {
198
+ const parts = option.split(this.text);
199
+ return parts[1];
200
+ });
201
+
200
202
  this.tokens = {
201
203
  startIndex: 0,
202
- values: options || [],
204
+ values: values || [],
203
205
  };
204
206
 
207
+ this.matchedText = this.text;
208
+ this.match = {
209
+ text: this.text,
210
+ startIndex: 0,
211
+ endIndex: this.text.length - 1,
212
+ };
213
+ this.error = null;
214
+
205
215
  return;
206
216
  }
207
217
 
@@ -73,6 +73,12 @@ export default class RepeatComposite extends CompositePattern {
73
73
  break;
74
74
  } else {
75
75
  this.nodes.push(node);
76
+
77
+ if (node.endIndex === this.cursor.lastIndex()) {
78
+ this._processMatch();
79
+ break;
80
+ }
81
+
76
82
  this.cursor.next();
77
83
  }
78
84
  }
@@ -74,6 +74,12 @@ export default class RepeatValue extends ValuePattern {
74
74
  break;
75
75
  } else {
76
76
  this.nodes.push(node);
77
+
78
+ if (node.endIndex === this.cursor.lastIndex()) {
79
+ this._processMatch();
80
+ break;
81
+ }
82
+
77
83
  this.cursor.next();
78
84
  }
79
85
  }
@@ -3,6 +3,8 @@ import RepeatComposite from "../patterns/composite/RepeatComposite";
3
3
  import AndComposite from "../patterns/composite/AndComposite";
4
4
  import OptionalComposite from "../patterns/composite/OptionalComposite";
5
5
  import Literal from "../patterns/value/Literal";
6
+ import Cursor from "../Cursor";
7
+ import OrComposite from "../patterns/composite/OrComposite";
6
8
 
7
9
  describe("RepeatComposite", () => {
8
10
  test("Cannot use optional patterns.", () => {
@@ -24,4 +26,21 @@ describe("RepeatComposite", () => {
24
26
 
25
27
  expect(clone.name).toBe("full-names-2");
26
28
  });
29
+
30
+ test("parse.", () => {
31
+ const a = new Literal("a", "A");
32
+ const b = new Literal("b", "B");
33
+ const space = new Literal("space", " ");
34
+ const or = new OrComposite("names", [a, b]);
35
+
36
+ const repeat = new RepeatComposite("repeat", or, space);
37
+ const result = repeat.parse(new Cursor("A B"));
38
+
39
+ expect(result?.children[0].value).toBe("A");
40
+ expect(result?.children[0].name).toBe("a");
41
+ expect(result?.children[1].value).toBe(" ");
42
+ expect(result?.children[1].name).toBe("space");
43
+ expect(result?.children[2].value).toBe("B");
44
+ expect(result?.children[2].name).toBe("b");
45
+ });
27
46
  });