clarity-pattern-parser 4.0.2 → 5.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 (132) hide show
  1. package/README.md +176 -1
  2. package/TODO.md +22 -2
  3. package/dist/ast/Node.d.ts +43 -11
  4. package/dist/ast/Visitor.d.ts +31 -31
  5. package/dist/index.browser.js +1248 -1495
  6. package/dist/index.browser.js.map +1 -1
  7. package/dist/index.d.ts +12 -16
  8. package/dist/index.esm.js +1218 -1460
  9. package/dist/index.esm.js.map +1 -1
  10. package/dist/index.js +1217 -1464
  11. package/dist/index.js.map +1 -1
  12. package/dist/patterns/And.d.ts +37 -24
  13. package/dist/patterns/Cursor.d.ts +35 -0
  14. package/dist/patterns/CursorHistory.d.ts +30 -0
  15. package/dist/patterns/Literal.d.ts +36 -19
  16. package/dist/patterns/Not.d.ts +26 -11
  17. package/dist/patterns/Or.d.ts +31 -22
  18. package/dist/patterns/ParseError.d.ts +6 -8
  19. package/dist/patterns/ParseResult.d.ts +6 -0
  20. package/dist/patterns/Pattern.d.ts +17 -26
  21. package/dist/patterns/Reference.d.ts +31 -12
  22. package/dist/patterns/Regex.d.ts +42 -21
  23. package/dist/patterns/Repeat.d.ts +38 -20
  24. package/dist/patterns/clonePatterns.d.ts +2 -0
  25. package/dist/patterns/filterOutNull.d.ts +2 -0
  26. package/dist/patterns/findPattern.d.ts +2 -0
  27. package/dist/patterns/getNextPattern.d.ts +2 -0
  28. package/jest.config.js +2 -1
  29. package/package.json +4 -5
  30. package/rollup.config.js +1 -1
  31. package/src/ast/Node.test.ts +254 -0
  32. package/src/ast/Node.ts +171 -23
  33. package/src/index.ts +11 -19
  34. package/src/intellisense/AutoComplete.test.ts +72 -0
  35. package/src/intellisense/AutoComplete.ts +146 -0
  36. package/src/intellisense/Suggestion.ts +13 -0
  37. package/src/intellisense/SuggestionOption.ts +4 -0
  38. package/src/{tests/cssPatterns → intellisense/css}/cssValue.ts +1 -1
  39. package/src/{tests/cssPatterns → intellisense/css}/divider.ts +2 -1
  40. package/src/intellisense/css/hex.ts +6 -0
  41. package/src/{tests/cssPatterns → intellisense/css}/method.ts +8 -9
  42. package/src/intellisense/css/name.ts +5 -0
  43. package/src/{tests/javascriptPatterns → intellisense/css}/number.ts +3 -3
  44. package/src/intellisense/css/spaces.ts +6 -0
  45. package/src/intellisense/css/unit.ts +10 -0
  46. package/src/{tests/cssPatterns → intellisense/css}/value.ts +1 -1
  47. package/src/{tests/cssPatterns → intellisense/css}/values.ts +1 -1
  48. package/src/intellisense/javascript/Javascript.test.ts +203 -0
  49. package/src/intellisense/javascript/arrayLiteral.ts +25 -0
  50. package/src/intellisense/javascript/deleteStatement.ts +14 -0
  51. package/src/intellisense/javascript/escapedCharacter.ts +50 -0
  52. package/src/intellisense/javascript/exponent.ts +26 -0
  53. package/src/intellisense/javascript/expression.ts +87 -0
  54. package/src/intellisense/javascript/expressionStatement.ts +29 -0
  55. package/src/intellisense/javascript/fraction.ts +13 -0
  56. package/src/intellisense/javascript/infixOperator.ts +36 -0
  57. package/src/intellisense/javascript/integer.ts +7 -0
  58. package/src/intellisense/javascript/invocation.ts +28 -0
  59. package/src/intellisense/javascript/literal.ts +14 -0
  60. package/src/intellisense/javascript/name.ts +3 -0
  61. package/src/intellisense/javascript/numberLiteral.ts +10 -0
  62. package/src/intellisense/javascript/objectLiteral.ts +30 -0
  63. package/src/intellisense/javascript/optionalSpaces.ts +3 -0
  64. package/src/intellisense/javascript/parameters.ts +20 -0
  65. package/src/intellisense/javascript/prefixOperator.ts +13 -0
  66. package/src/intellisense/javascript/propertyAccess.ts +23 -0
  67. package/src/intellisense/javascript/stringLiteral.ts +28 -0
  68. package/src/patterns/And.test.ts +299 -0
  69. package/src/patterns/And.ts +222 -119
  70. package/src/patterns/Cursor.test.ts +93 -0
  71. package/src/patterns/Cursor.ts +130 -0
  72. package/src/patterns/CursorHistory.test.ts +54 -0
  73. package/src/patterns/CursorHistory.ts +95 -0
  74. package/src/patterns/Literal.test.ts +134 -0
  75. package/src/patterns/Literal.ts +151 -61
  76. package/src/patterns/Not.test.ts +88 -0
  77. package/src/patterns/Not.ts +74 -33
  78. package/src/patterns/Or.test.ts +105 -0
  79. package/src/patterns/Or.ts +106 -98
  80. package/src/patterns/ParseError.ts +3 -7
  81. package/src/patterns/ParseResult.ts +7 -0
  82. package/src/patterns/Pattern.ts +18 -150
  83. package/src/patterns/Reference.test.ts +104 -0
  84. package/src/patterns/Reference.ts +94 -94
  85. package/src/patterns/Regex.test.ts +101 -0
  86. package/src/patterns/Regex.ts +129 -60
  87. package/src/patterns/Repeat.test.ts +196 -0
  88. package/src/patterns/Repeat.ts +208 -104
  89. package/src/patterns/clonePatterns.ts +5 -0
  90. package/src/patterns/filterOutNull.ts +13 -0
  91. package/src/patterns/findPattern.ts +25 -0
  92. package/src/patterns/getNextPattern.test.ts +39 -0
  93. package/src/patterns/getNextPattern.ts +18 -0
  94. package/src/Cursor.ts +0 -141
  95. package/src/CursorHistory.ts +0 -146
  96. package/src/TextSuggester.ts +0 -317
  97. package/src/ast/Visitor.ts +0 -271
  98. package/src/patterns/LookAhead.ts +0 -32
  99. package/src/patterns/Recursive.ts +0 -92
  100. package/src/tests/And.test.ts +0 -180
  101. package/src/tests/ComplexExamples.test.ts +0 -86
  102. package/src/tests/CssPatterns.test.ts +0 -90
  103. package/src/tests/CursorHistory.test.ts +0 -107
  104. package/src/tests/Cusor.test.ts +0 -174
  105. package/src/tests/HtmlPatterns.test.ts +0 -34
  106. package/src/tests/Literal.test.ts +0 -79
  107. package/src/tests/LookAhead.test.ts +0 -44
  108. package/src/tests/Not.test.ts +0 -51
  109. package/src/tests/Or.test.ts +0 -113
  110. package/src/tests/Pattern.test.ts +0 -290
  111. package/src/tests/Recursive.test.ts +0 -64
  112. package/src/tests/Reference.test.ts +0 -16
  113. package/src/tests/Repeat.test.ts +0 -75
  114. package/src/tests/SpeedTest.test.ts +0 -31
  115. package/src/tests/TextSuggester.test.ts +0 -297
  116. package/src/tests/Visitor.test.ts +0 -331
  117. package/src/tests/cssPatterns/hex.ts +0 -5
  118. package/src/tests/cssPatterns/name.ts +0 -5
  119. package/src/tests/cssPatterns/number.ts +0 -8
  120. package/src/tests/cssPatterns/spaces.ts +0 -5
  121. package/src/tests/cssPatterns/unit.ts +0 -8
  122. package/src/tests/htmlPatterns/element.ts +0 -49
  123. package/src/tests/javascriptPatterns/boolean.ts +0 -10
  124. package/src/tests/javascriptPatterns/json.ts +0 -67
  125. package/src/tests/javascriptPatterns/name.ts +0 -5
  126. package/src/tests/javascriptPatterns/objectLiteral.ts +0 -40
  127. package/src/tests/javascriptPatterns/string.ts +0 -84
  128. package/src/tests/javascriptPatterns/unit.ts +0 -8
  129. package/src/tests/javascriptPatterns/whitespace.ts +0 -44
  130. package/src/tests/naturalLanguage/filter.ts +0 -37
  131. package/src/tests/patterns/sentence.ts +0 -37
  132. /package/src/{tests/cssPatterns → intellisense/css}/optionalSpaces.ts +0 -0
@@ -0,0 +1,203 @@
1
+ import { escapedCharacter } from "./escapedCharacter";
2
+ import { exponent } from "./exponent";
3
+ import { expression } from "./expression";
4
+ import { expressionStatement } from "./expressionStatement";
5
+ import { infixOperator } from "./infixOperator";
6
+ import { integer } from "./integer";
7
+ import { name } from "./name";
8
+ import { parameters } from "./parameters";
9
+ import { prefixOperator } from "./prefixOperator";
10
+
11
+ describe("Ecmascript 3", () => {
12
+ test("Escaped Character", () => {
13
+ let result = escapedCharacter.parseText(`\\"`);
14
+ expect(result.ast?.value).toBe(`\\"`)
15
+
16
+ result = escapedCharacter.parseText(`\\'`)
17
+ expect(result.ast?.value).toBe(`\\'`)
18
+
19
+ result = escapedCharacter.parseText(`\\\\`)
20
+ expect(result.ast?.value).toBe(`\\\\`)
21
+
22
+ result = escapedCharacter.parseText(`\\/`)
23
+ expect(result.ast?.value).toBe(`\\/`)
24
+
25
+ result = escapedCharacter.parseText(`\\f`)
26
+ expect(result.ast?.value).toBe(`\\f`)
27
+
28
+ result = escapedCharacter.parseText(`\\t`)
29
+ expect(result.ast?.value).toBe(`\\t`)
30
+
31
+ result = escapedCharacter.parseText(`\\u00E9`)
32
+ expect(result.ast?.value).toBe(`\\u00E9`)
33
+ });
34
+
35
+ test("Exponent", () => {
36
+ let result = exponent.parseText("e+1");
37
+ expect(result.ast?.value).toBe("e+1")
38
+
39
+ result = exponent.parseText("e-1");
40
+ expect(result.ast?.value).toBe("e-1")
41
+
42
+ result = exponent.parseText("E+1");
43
+ expect(result.ast?.value).toBe("E+1")
44
+
45
+ result = exponent.parseText("E-1");
46
+ expect(result.ast?.value).toBe("E-1")
47
+
48
+ result = exponent.parseText("e+11");
49
+ expect(result.ast?.value).toBe("e+11")
50
+
51
+ result = exponent.parseText("11");
52
+ expect(result.ast).toBeNull()
53
+ });
54
+
55
+ test("Integer", () => {
56
+ let result = integer.parseText("0");
57
+ expect(result.ast?.value).toBe("0");
58
+
59
+ result = integer.parseText("1");
60
+ expect(result.ast?.value).toBe("1");
61
+
62
+ result = integer.parseText("100");
63
+ expect(result.ast?.value).toBe("100");
64
+
65
+ result = integer.parseText(".1");
66
+ expect(result.ast).toBeNull();
67
+ });
68
+
69
+ test("Infix Operator", () => {
70
+ let result = infixOperator.parseText("*");
71
+ expect(result.ast?.value).toBe("*");
72
+
73
+ result = infixOperator.parseText("/");
74
+ expect(result.ast?.value).toBe("/");
75
+
76
+ result = infixOperator.parseText("%");
77
+ expect(result.ast?.value).toBe("%");
78
+
79
+ result = infixOperator.parseText("+");
80
+ expect(result.ast?.value).toBe("+");
81
+
82
+ result = infixOperator.parseText("-");
83
+ expect(result.ast?.value).toBe("-");
84
+
85
+ result = infixOperator.parseText(">=");
86
+ expect(result.ast?.value).toBe(">=");
87
+
88
+ result = infixOperator.parseText("<=");
89
+ expect(result.ast?.value).toBe("<=");
90
+
91
+ result = infixOperator.parseText(">");
92
+ expect(result.ast?.value).toBe(">");
93
+
94
+ result = infixOperator.parseText("<");
95
+ expect(result.ast?.value).toBe("<");
96
+
97
+ result = infixOperator.parseText("===");
98
+ expect(result.ast?.value).toBe("===");
99
+
100
+ result = infixOperator.parseText("!==");
101
+ expect(result.ast?.value).toBe("!==");
102
+
103
+ result = infixOperator.parseText("||");
104
+ expect(result.ast?.value).toBe("||");
105
+
106
+ result = infixOperator.parseText("&&");
107
+ expect(result.ast?.value).toBe("&&");
108
+
109
+ result = infixOperator.parseText("bad");
110
+ expect(result.ast).toBeNull();
111
+ });
112
+
113
+
114
+ test("Name", () => {
115
+ let result = name.parseText("p_0");
116
+ expect(result.ast?.value).toBe("p_0");
117
+
118
+ result = name.parseText("_0");
119
+ expect(result.ast?.value).toBe("_0");
120
+
121
+ result = name.parseText("0");
122
+ expect(result.ast).toBeNull();
123
+
124
+ result = name.parseText("_");
125
+ expect(result.ast?.value).toBe("_");
126
+ });
127
+
128
+ test("Parameters", () => {
129
+ let result = parameters.parseText("(param1)");
130
+ expect(result.ast?.value).toBe("(param1)");
131
+
132
+ result = parameters.parseText("(param1, param2)");
133
+ expect(result.ast?.value).toBe("(param1, param2)");
134
+
135
+ result = parameters.parseText("(param1, param2,)");
136
+ expect(result.ast).toBeNull();
137
+ });
138
+
139
+ test("Prefix Operator", () => {
140
+ let result = prefixOperator.parseText("typeof ");
141
+ expect(result.ast?.value).toBe("typeof ");
142
+
143
+ result = prefixOperator.parseText("+");
144
+ expect(result.ast?.value).toBe("+");
145
+
146
+ result = prefixOperator.parseText("-");
147
+ expect(result.ast?.value).toBe("-");
148
+
149
+ result = prefixOperator.parseText("!");
150
+ expect(result.ast?.value).toBe("!");
151
+
152
+ result = prefixOperator.parseText("a");
153
+ expect(result.ast).toBeNull();
154
+ });
155
+
156
+ test("Object Literal", () => {
157
+ let result = expression.parseText(`{}`)
158
+ expect(result.ast?.value).toBe("{}");
159
+
160
+ result = expression.parseText(`{prop:{}}`)
161
+ expect(result.ast?.value).toBe("{prop:{}}");
162
+
163
+ result = expression.parseText(`{prop:"value"}`)
164
+ expect(result.ast?.value).toBe(`{prop:"value"}`);
165
+
166
+ result = expression.parseText(`{prop:0.9}`)
167
+ expect(result.ast?.value).toBe(`{prop:0.9}`);
168
+
169
+ result = expression.parseText(`{prop:1}`)
170
+ expect(result.ast?.value).toBe(`{prop:1}`);
171
+
172
+ result = expression.parseText(`{"prop":1}`)
173
+ expect(result.ast?.value).toBe(`{"prop":1}`);
174
+ });
175
+
176
+ test("Array Literal", () => {
177
+ let result = expression.parseText("[]")
178
+ expect(result.ast?.value).toBe("[]");
179
+
180
+ result = expression.parseText("[{}, 9, 0.9e-10, [1, 2]]")
181
+ expect(result.ast?.value).toBe("[{}, 9, 0.9e-10, [1, 2]]");
182
+ });
183
+
184
+ test("Expression Statement", () => {
185
+ let result = expressionStatement.parseText(`name = "John"`);
186
+ expect(result.ast?.value).toBe(`name = "John"`);
187
+
188
+ result = expressionStatement.parseText(`name = othername = "John"`)
189
+ expect(result.ast?.value).toBe(`name = othername = "John"`);
190
+
191
+ result = expressionStatement.parseText(`name = othername.prop = "John"`)
192
+ expect(result.ast?.value).toBe(`name = othername.prop = "John"`);
193
+
194
+ result = expressionStatement.parseText(`name = othername.prop += 2`)
195
+ expect(result.ast?.value).toBe(`name = othername.prop += 2`);
196
+
197
+ result = expressionStatement.parseText(`name.prop().method(blah) = blah.prop()`)
198
+ expect(result.ast?.value).toBe(`name.prop().method(blah) = blah.prop()`);
199
+
200
+ });
201
+
202
+
203
+ });
@@ -0,0 +1,25 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Reference } from "../../patterns/Reference";
5
+ import { Regex } from "../../patterns/Regex";
6
+ import { Repeat } from "../../patterns/Repeat";
7
+ import { optionalSpaces } from "./optionalSpaces";
8
+
9
+ const divider = new Regex("array-divider", "\\s*,\\s*");
10
+ const arrayItems = new Repeat("array-items", new Reference("expression"), divider, true);
11
+
12
+ export const arrayLiteral = new Or("array-literal",
13
+ [new And("empty-array-literal", [
14
+ new Literal("open-square-bracket", "["),
15
+ optionalSpaces,
16
+ new Literal("close-square-bracket", "]"),
17
+ ]),
18
+ new And("array-literal", [
19
+ new Literal("open-square-bracket", "["),
20
+ optionalSpaces,
21
+ arrayItems,
22
+ optionalSpaces,
23
+ new Literal("close-square-bracket", "]"),
24
+ ])
25
+ ]);
@@ -0,0 +1,14 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Regex } from "../../patterns/Regex";
4
+ import { expression } from "./expression";
5
+ import { propertyAccess } from "./propertyAccess";
6
+
7
+ const space = new Regex("space", "\\s+");
8
+ export const deleteStatement = new And("delete-statement", [
9
+ new Literal("delete-keyword", "delete"),
10
+ space,
11
+ expression,
12
+ propertyAccess
13
+ ]);
14
+
@@ -0,0 +1,50 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Regex } from "../../patterns/Regex";
5
+
6
+ const backslash = new Literal("backslash", "\\");
7
+ const doubleQuote = new Literal("double-quote", "\"");
8
+ const singleQuote = new Literal("single-quote", "'");
9
+ const slash = new Literal("slash", "/");
10
+ const backspace = new Literal("backspace", "b");
11
+ const formFeed = new Literal("form-feed", "f");
12
+ const newLine = new Literal("new-line", "n");
13
+ const carriageReturn = new Literal("carriage-return", "r");
14
+ const tab = new Literal("tab", "t");
15
+ const hexDigit = new Regex("hex-digit", "[0-9a-fA-F]");
16
+
17
+ hexDigit.setTokens([
18
+ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
19
+ "a", "b", "c", "d", "e", "f",
20
+ "A", "B", "C", "D", "E", "F",
21
+ ]);
22
+
23
+ const unicode = new And("hex", [
24
+ new Literal("u", "u"),
25
+ hexDigit,
26
+ hexDigit,
27
+ hexDigit,
28
+ hexDigit
29
+ ]);
30
+
31
+ const specialCharacter = new Or("special-character", [
32
+ doubleQuote,
33
+ singleQuote,
34
+ backslash,
35
+ slash,
36
+ backspace,
37
+ formFeed,
38
+ newLine,
39
+ carriageReturn,
40
+ tab,
41
+ unicode,
42
+ ]);
43
+
44
+ const escapedCharacter = new And("escaped-character", [backslash, specialCharacter])
45
+ escapedCharacter.enableAstReduction();
46
+
47
+ export {
48
+ escapedCharacter
49
+ }
50
+
@@ -0,0 +1,26 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Regex } from "../../patterns/Regex";
5
+
6
+ const e = new Or("e", [
7
+ new Literal("e", "e"),
8
+ new Literal("e", "E")
9
+ ]);
10
+
11
+ const optionalSign = new Or("sign", [
12
+ new Literal("plus", "+"),
13
+ new Literal("minus", "-")
14
+ ], true);
15
+
16
+ const digit = new Regex("digit", "\\d+");
17
+
18
+ const exponent = new And("exponent", [
19
+ e,
20
+ optionalSign,
21
+ digit,
22
+ ]);
23
+
24
+ exponent.enableAstReduction();
25
+
26
+ export { exponent }
@@ -0,0 +1,87 @@
1
+ import { Regex } from "../..";
2
+ import { And } from "../../patterns/And";
3
+ import { Literal } from "../../patterns/Literal";
4
+ import { Or } from "../../patterns/Or";
5
+ import { Reference } from "../../patterns/Reference";
6
+ import { Repeat } from "../../patterns/Repeat";
7
+ import { infixOperator } from "./infixOperator";
8
+ import { invocation } from "./invocation";
9
+ import { literal } from "./literal";
10
+ import { name } from "./name";
11
+ import { optionalSpaces } from "./optionalSpaces";
12
+ import { prefixOperator } from "./prefixOperator";
13
+ import { propertyAccess } from "./propertyAccess";
14
+
15
+ const space = new Regex("space", "\\s+")
16
+ const newKeyword = new Literal("new-keyword", "new");
17
+ const deleteKeyword = new Literal("delete-keyword", "delete");
18
+
19
+ const newExpression = new And("new-expression", [
20
+ newKeyword,
21
+ space,
22
+ new Reference("expression")
23
+ ]);
24
+
25
+ const deleteExpression = new And("delete-expression", [
26
+ deleteKeyword,
27
+ space,
28
+ new Reference("expression")
29
+ ]);
30
+
31
+ const groupExpression = new And("group-expression", [
32
+ new Literal("open-paren", "("),
33
+ optionalSpaces,
34
+ new Reference("expression"),
35
+ optionalSpaces,
36
+ new Literal("close-paren", ")")
37
+ ]);
38
+
39
+ const prefixExpression = new And("prefix-expression", [
40
+ prefixOperator,
41
+ new Reference("expression")
42
+ ]);
43
+
44
+ const optionalInfix = new And("infix-expression", [
45
+ infixOperator,
46
+ optionalSpaces,
47
+ new Reference("expression"),
48
+ ], true);
49
+
50
+ const optionalTernary = new And("ternary", [
51
+ new Literal("question-mark", "?"),
52
+ optionalSpaces,
53
+ new Reference("expression"),
54
+ optionalSpaces,
55
+ new Literal("colon", ":"),
56
+ optionalSpaces,
57
+ new Reference("expression")
58
+ ], true);
59
+
60
+ const optionalMemberAccesses = new Repeat("object-member-accesses",
61
+ new Or("object-member-access", [
62
+ invocation,
63
+ propertyAccess,
64
+ ]),
65
+ undefined, true
66
+ );
67
+
68
+ var variableName = name.clone("variable-name");
69
+
70
+ const expressions = new Or("expressions", [
71
+ newExpression,
72
+ deleteExpression,
73
+ groupExpression,
74
+ prefixExpression,
75
+ literal,
76
+ variableName,
77
+ ]);
78
+
79
+ const expression = new And("expression", [
80
+ expressions,
81
+ optionalInfix,
82
+ optionalTernary,
83
+ optionalMemberAccesses
84
+ ]);
85
+
86
+ export { expression }
87
+
@@ -0,0 +1,29 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Repeat } from "../../patterns/Repeat";
5
+ import { expression } from "./expression";
6
+ import { optionalSpaces } from "./optionalSpaces";
7
+
8
+ const assignmentOperators = new Or("assignment-operators", [
9
+ new Literal("assign", "="),
10
+ new Literal("addition-assign", "+="),
11
+ new Literal("subtraction-assign", "-="),
12
+ ]);
13
+
14
+ const assignment = new And("assignment", [
15
+ expression,
16
+ optionalSpaces,
17
+ assignmentOperators,
18
+ optionalSpaces,
19
+ ]);
20
+
21
+ const expressionStatement = new And("expressionStatement", [
22
+ new Repeat("assignments",
23
+ assignment),
24
+ optionalSpaces,
25
+ expression
26
+ ]);
27
+
28
+
29
+ export { expressionStatement }
@@ -0,0 +1,13 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Regex } from "../../patterns/Regex";
4
+
5
+ const period = new Literal("period", ".");
6
+ const digit = new Regex("digit", "\\d+");
7
+ const fraction = new And("fraction", [period, digit]);
8
+
9
+ fraction.enableAstReduction();
10
+
11
+ export {
12
+ fraction
13
+ }
@@ -0,0 +1,36 @@
1
+ import { Literal } from "../../patterns/Literal"
2
+ import { Or } from "../../patterns/Or";
3
+
4
+ const multiply = new Literal("multiply", "*");
5
+ const divide = new Literal("divide", "/");
6
+ const remainder = new Literal("remainder", "%");
7
+ const add = new Literal("add", "+");
8
+ const subtract = new Literal("subtract", "-");
9
+ const greaterOrEqual = new Literal("greater-or-equal", ">=");
10
+ const lessOrEqual = new Literal("less-or-equal", "<=");
11
+ const greater = new Literal("greater", ">");
12
+ const less = new Literal("less", "<");
13
+ const equal = new Literal("equal", "===");
14
+ const notEqual = new Literal("not-equal", "!==");
15
+ const logicalOr = new Literal("logical-or", "||");
16
+ const logicalAnd = new Literal("logical-and", "&&");
17
+
18
+ const infixOperator = new Or("infix-operator", [
19
+ multiply,
20
+ divide,
21
+ remainder,
22
+ add,
23
+ subtract,
24
+ greaterOrEqual,
25
+ lessOrEqual,
26
+ greater,
27
+ less,
28
+ equal,
29
+ notEqual,
30
+ logicalOr,
31
+ logicalAnd
32
+ ]);
33
+
34
+ export { infixOperator }
35
+
36
+
@@ -0,0 +1,7 @@
1
+ import { Regex } from "../../patterns/Regex";
2
+
3
+ const integer = new Regex("integer", "([1-9][0-9]*)|0");
4
+
5
+ export {
6
+ integer
7
+ }
@@ -0,0 +1,28 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Reference } from "../../patterns/Reference";
5
+ import { Regex } from "../../patterns/Regex";
6
+ import { Repeat } from "../../patterns/Repeat";
7
+ import { optionalSpaces } from "./optionalSpaces";
8
+
9
+ const divider = new Regex("invocation-divider", "\\s*,\\s*");
10
+
11
+ const invocationWithArguments = new And("invocation-with-arguments", [
12
+ new Literal("open-paren", "("),
13
+ optionalSpaces,
14
+ new Repeat("expressions", new Reference("expression"), divider, true),
15
+ optionalSpaces,
16
+ new Literal("close-paren", ")"),
17
+ ]);
18
+
19
+ const emptyInvocation = new And("empty-invocation", [
20
+ new Literal("open-paren", "("),
21
+ optionalSpaces,
22
+ new Literal("close-paren", ")"),
23
+ ]);
24
+
25
+ export const invocation = new Or("invocation", [
26
+ emptyInvocation,
27
+ invocationWithArguments
28
+ ])
@@ -0,0 +1,14 @@
1
+ import { Or } from "../../patterns/Or";
2
+ import { arrayLiteral } from "./arrayLiteral";
3
+ import { numberLiteral } from "./numberLiteral";
4
+ import { objectLiteral } from "./objectLiteral";
5
+ import { stringLiteral } from "./stringLiteral";
6
+
7
+ const literal = new Or("literal", [
8
+ numberLiteral,
9
+ stringLiteral,
10
+ arrayLiteral,
11
+ objectLiteral,
12
+ ]);
13
+
14
+ export { literal }
@@ -0,0 +1,3 @@
1
+ import { Regex } from "../../patterns/Regex";
2
+
3
+ export const name = new Regex("name", "[a-zA-Z_]+[a-zA-Z0-9_]*");
@@ -0,0 +1,10 @@
1
+ import { And } from "../../patterns/And";
2
+ import { exponent } from "./exponent";
3
+ import { fraction } from "./fraction";
4
+ import { integer } from "./integer";
5
+
6
+ export const numberLiteral = new And("number-literal", [
7
+ integer,
8
+ fraction.clone("number-fraction", true),
9
+ exponent.clone("number-exponent", true)
10
+ ]);
@@ -0,0 +1,30 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Reference } from "../../patterns/Reference";
5
+ import { Regex } from "../../patterns/Regex";
6
+ import { Repeat } from "../../patterns/Repeat";
7
+ import { name } from "./name";
8
+ import { optionalSpaces } from "./optionalSpaces";
9
+ import { stringLiteral } from "./stringLiteral";
10
+
11
+ const propertyName = new Or("property-name", [stringLiteral, name]);
12
+ const property = new And("property", [
13
+ propertyName,
14
+ optionalSpaces,
15
+ new Literal("colon", ":"),
16
+ optionalSpaces,
17
+ new Reference("expression"),
18
+ ]);
19
+ const divider = new Regex("property-divider", "\\s*,\\s*");
20
+ const properties = new Repeat("properties", property, divider, true);
21
+
22
+ const objectLiteral = new And("object-literal", [
23
+ new Literal("open-curly-bracket", "{"),
24
+ optionalSpaces,
25
+ properties,
26
+ optionalSpaces,
27
+ new Literal("close-curly-bracket", "}"),
28
+ ]);
29
+
30
+ export { objectLiteral }
@@ -0,0 +1,3 @@
1
+ import { Regex } from "../../patterns/Regex";
2
+
3
+ export const optionalSpaces = new Regex("optional-spaces", "\\s+", true);
@@ -0,0 +1,20 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Regex } from "../../patterns/Regex";
4
+ import { Repeat } from "../../patterns/Repeat";
5
+ import { name } from "./name";
6
+
7
+ const divider = new Regex(",", "\\s*[,]\\s*");
8
+ divider.setTokens([", "]);
9
+
10
+ const optionalSpace = new Regex("optional-space", "\\s", true)
11
+
12
+ const parameters = new And("parameters", [
13
+ new Literal("open-paren", "("),
14
+ optionalSpace,
15
+ new Repeat("arguments", name, divider),
16
+ optionalSpace,
17
+ new Literal("close-paren", ")"),
18
+ ]);
19
+
20
+ export { parameters }
@@ -0,0 +1,13 @@
1
+ import { Literal } from "../../patterns/Literal";
2
+ import { Or } from "../../patterns/Or";
3
+ import { Regex } from "../../patterns/Regex";
4
+
5
+ const prefixOperator = new Or("prefix-operator", [
6
+ new Literal("typeof", "typeof "),
7
+ new Literal("to-number", "+"),
8
+ new Literal("negate", "-"),
9
+ new Literal("logical-not", "!"),
10
+ ]);
11
+
12
+ export { prefixOperator }
13
+
@@ -0,0 +1,23 @@
1
+ import { And } from "../../patterns/And";
2
+ import { Literal } from "../../patterns/Literal";
3
+ import { Or } from "../../patterns/Or";
4
+ import { Reference } from "../../patterns/Reference";
5
+ import { name } from "./name";
6
+
7
+ const dotPropertyAccess = new And("dot-property-access", [
8
+ new Literal("period", "."),
9
+ name
10
+ ]);
11
+
12
+ const bracketPropertyAccess = new And("bracket-property-access", [
13
+ new Literal("open-square-bracket", "["),
14
+ new Reference("expression"),
15
+ new Literal("close-square-bracket", "]"),
16
+ ]);
17
+
18
+ const propertyAccess = new Or("property-access", [
19
+ dotPropertyAccess,
20
+ bracketPropertyAccess,
21
+ ]);
22
+
23
+ export { propertyAccess }