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
package/README.md CHANGED
@@ -3,5 +3,470 @@
3
3
  ```
4
4
  npm install clarity-pattern-parser
5
5
  ```
6
+ ## Overview
6
7
 
7
- ## How to use
8
+ ### Leaf Patterns
9
+ * Literal
10
+ * Regex
11
+
12
+ ### Composing Patterns
13
+ * And
14
+ * Or
15
+ * Repeat
16
+ * Reference
17
+ * Not
18
+
19
+ The `Not` pattern is a negative look ahead and used with the `And` pattern. This will be illustrated in more detail within the `Not` pattern section.
20
+
21
+ ## Literal
22
+ The `Literal` pattern uses a string literal to match patterns.
23
+ ```ts
24
+ import { Literal } from "clarity-pattern-parser";
25
+
26
+ const firstName = new Literal("first-name", "John");
27
+
28
+ const { ast } = firstName.exec("John");
29
+
30
+ ast.toJson(2)
31
+ ```
32
+ ```json
33
+ {
34
+ "type": "literal",
35
+ "name": "first-name",
36
+ "value": "John",
37
+ "firstIndex": 0,
38
+ "lastIndex": 3,
39
+ "startIndex": 0,
40
+ "endIndex": 4,
41
+ "children": []
42
+ }
43
+ ```
44
+
45
+ ## Regex
46
+ The `Regex` pattern uses regular expressions to match patterns.
47
+ ```ts
48
+ import { Regex } from "clarity-pattern-parser";
49
+
50
+ const digits = new Regex("digits", "\\d+");
51
+
52
+ const { ast } = digits.exec("12");
53
+
54
+ ast.toJson(2);
55
+ ```
56
+ ```json
57
+ {
58
+ "type": "regex",
59
+ "name": "digits",
60
+ "value": "12",
61
+ "firstIndex": 0,
62
+ "lastIndex": 1,
63
+ "startIndex": 0,
64
+ "endIndex": 2,
65
+ "children": []
66
+ }
67
+ ```
68
+
69
+ ### Regex Caveats
70
+ Do not use "^" at the beginning or "$" at the end of your regular expression. If you are creating a regular expression that is concerned about the beginning and end of the text you should probably just use a regular expression.
71
+
72
+ ## And
73
+ The `And` pattern is a way to make a sequence pattern. `And` accepts all other patterns as children.
74
+ ```ts
75
+ import { And, Literal } from "clarity-pattern-parser";
76
+
77
+ const jane = new Literal("first-name", "Jane");
78
+ const space = new Literal("space", " ");
79
+ const doe = new Literal("last-name", "Doe");
80
+ const fullName = new And("full-name", [jane, space, doe]);
81
+
82
+ const { ast } = fullName.exec("Jane Doe");
83
+
84
+ ast.toJson(2); // Look Below for output
85
+ ```
86
+
87
+ ```json
88
+ {
89
+ "type": "and",
90
+ "name": "full-name",
91
+ "value": "Jane Doe",
92
+ "firstIndex": 0,
93
+ "lastIndex": 7,
94
+ "startIndex": 0,
95
+ "endIndex": 8,
96
+ "children": [
97
+ {
98
+ "type": "literal",
99
+ "name": "first-name",
100
+ "value": "Jane",
101
+ "firstIndex": 0,
102
+ "lastIndex": 3,
103
+ "startIndex": 0,
104
+ "endIndex": 4,
105
+ "children": []
106
+ },
107
+ {
108
+ "type": "and",
109
+ "name": "space",
110
+ "value": " ",
111
+ "firstIndex": 4,
112
+ "lastIndex": 4,
113
+ "startIndex": 4,
114
+ "endIndex": 5,
115
+ "children": []
116
+ },
117
+ {
118
+ "type": "and",
119
+ "name": "last-name",
120
+ "value": "Doe",
121
+ "firstIndex": 5,
122
+ "lastIndex": 7,
123
+ "startIndex": 5,
124
+ "endIndex": 8,
125
+ "children": []
126
+ }
127
+ ]
128
+ }
129
+ ```
130
+
131
+ ## Or
132
+ The `Or` pattern mathes any of the patterns given to the constructor.
133
+ ```ts
134
+ import { Or, Literal } from "clarity-pattern-parser";
135
+
136
+ const jane = new Literal("jane", "Jane");
137
+ const john = new Literal("john", "John");
138
+ const firstName = new Or("first-name", [jane, john]);
139
+ const { ast }= firstName.exec("Jane");
140
+
141
+ ast.toJson(2)
142
+ ```
143
+ ```json
144
+ {
145
+ "type": "literal",
146
+ "name": "jane",
147
+ "value": "Jane",
148
+ "firstIndex": 0,
149
+ "lastIndex": 3,
150
+ "startIndex": 0,
151
+ "endIndex": 4,
152
+ "children": []
153
+ }
154
+ ```
155
+ ## Repeat
156
+ The `Repeat` patterns allows you to match repeating patterns with, or without a divider.
157
+
158
+ For example you may want to match a pattern like so.
159
+ ```
160
+ 1,2,3
161
+ ```
162
+ Here is the code to do so.
163
+ ```ts
164
+ import { Repeat, Literal, Regex } from "clarity-pattern-parser";
165
+
166
+ const digit = new Regex("digit", "\\d+");
167
+ const commaDivider = new Literal("comma", ",");
168
+ const numberList = new Repeat("number-list", digit, commaDivider);
169
+
170
+ const ast = numberList.exec("1,2,3").ast;
171
+
172
+ ast.type // ==> "repeat"
173
+ ast.name // ==> "number-list"
174
+ ast.value // ==> "1,2,3
175
+
176
+ ast.children[0].value // ==> "1"
177
+ ast.children[1].value // ==> ","
178
+ ast.children[2].value // ==> "2"
179
+ ast.children[3].value // ==> ","
180
+ ast.children[4].value // ==> "3"
181
+ ```
182
+
183
+ If there is a trailing divider without the repeating pattern, it will not include the trailing divider as part of the result. Here is an example.
184
+
185
+ ```ts
186
+ import { Repeat, Literal, Regex } from "clarity-pattern-parser";
187
+
188
+ const digit = new Regex("digit", "\\d+");
189
+ const commaDivider = new Literal("comma", ",");
190
+ const numberList = new Repeat("number-list", digit, commaDivider);
191
+
192
+ const ast = numberList.exec("1,2,").ast;
193
+
194
+ ast.type // ==> "repeat"
195
+ ast.name // ==> "number-list"
196
+ ast.value // ==> "1,2
197
+
198
+ ast.children[0].value // ==> "1"
199
+ ast.children[1].value // ==> ","
200
+ ast.children[2].value // ==> "2"
201
+ ast.children.length // ==> 3
202
+ ```
203
+
204
+ ## Reference
205
+ Reference is a way to handle cyclical patterns. An example of this would be arrays within arrays. Lets say we want to make a pattern that matches an array that can store numbers and arrays.
206
+ ```
207
+ [[1, [1]], 1, 2, 3]
208
+ ```
209
+ Here is an example of using `Reference` to parse this pattern.
210
+ ```ts
211
+ import { Regex, Literal, Or, Repeat, And, Reference } from "clarity-pattern-parser";
212
+
213
+ const integer = new Regex("integer", "\\d+");
214
+ const commaDivider = new Regex("comma-divider", "\\s*,\\s*");
215
+
216
+ const openBracket = new Literal("open-bracket", "[");
217
+ const closeBracket = new Literal("close-bracket", "]");
218
+ const item = new Or("item", [integer, new Reference("array")]);
219
+ const items = new Repeat("items", item, commaDivider);
220
+
221
+ const array = new And("array", [openBracket, items, closeBracket]);
222
+ const { ast } = array.exec("[[1, [1]], 1, 2, 3]");
223
+
224
+ ast.toJson();
225
+ ```
226
+ ```json
227
+ {
228
+ "type": "and",
229
+ "name": "array",
230
+ "value": "[[1, [1]], 1, 2, 3]",
231
+ "firstIndex": 0,
232
+ "lastIndex": 18,
233
+ "startIndex": 0,
234
+ "endIndex": 19,
235
+ "children": [
236
+ {
237
+ "type": "literal",
238
+ "name": "open-bracket",
239
+ "value": "[",
240
+ "firstIndex": 0,
241
+ "lastIndex": 0,
242
+ "startIndex": 0,
243
+ "endIndex": 1,
244
+ "children": []
245
+ },
246
+ {
247
+ "type": "repeat",
248
+ "name": "items",
249
+ "value": "[1, [1]], 1, 2, 3",
250
+ "firstIndex": 1,
251
+ "lastIndex": 17,
252
+ "startIndex": 1,
253
+ "endIndex": 18,
254
+ "children": [
255
+ {
256
+ "type": "and",
257
+ "name": "array",
258
+ "value": "[1, [1]]",
259
+ "firstIndex": 1,
260
+ "lastIndex": 8,
261
+ "startIndex": 1,
262
+ "endIndex": 9,
263
+ "children": [
264
+ {
265
+ "type": "literal",
266
+ "name": "open-bracket",
267
+ "value": "[",
268
+ "firstIndex": 1,
269
+ "lastIndex": 1,
270
+ "startIndex": 1,
271
+ "endIndex": 2,
272
+ "children": []
273
+ },
274
+ {
275
+ "type": "repeat",
276
+ "name": "items",
277
+ "value": "1, [1]",
278
+ "firstIndex": 2,
279
+ "lastIndex": 7,
280
+ "startIndex": 2,
281
+ "endIndex": 8,
282
+ "children": [
283
+ {
284
+ "type": "regex",
285
+ "name": "integer",
286
+ "value": "1",
287
+ "firstIndex": 2,
288
+ "lastIndex": 2,
289
+ "startIndex": 2,
290
+ "endIndex": 3,
291
+ "children": []
292
+ },
293
+ {
294
+ "type": "regex",
295
+ "name": "comma-divider",
296
+ "value": ", ",
297
+ "firstIndex": 3,
298
+ "lastIndex": 4,
299
+ "startIndex": 3,
300
+ "endIndex": 5,
301
+ "children": []
302
+ },
303
+ {
304
+ "type": "and",
305
+ "name": "array",
306
+ "value": "[1]",
307
+ "firstIndex": 5,
308
+ "lastIndex": 7,
309
+ "startIndex": 5,
310
+ "endIndex": 8,
311
+ "children": [
312
+ {
313
+ "type": "literal",
314
+ "name": "open-bracket",
315
+ "value": "[",
316
+ "firstIndex": 5,
317
+ "lastIndex": 5,
318
+ "startIndex": 5,
319
+ "endIndex": 6,
320
+ "children": []
321
+ },
322
+ {
323
+ "type": "repeat",
324
+ "name": "items",
325
+ "value": "1",
326
+ "firstIndex": 6,
327
+ "lastIndex": 6,
328
+ "startIndex": 6,
329
+ "endIndex": 7,
330
+ "children": [
331
+ {
332
+ "type": "regex",
333
+ "name": "integer",
334
+ "value": "1",
335
+ "firstIndex": 6,
336
+ "lastIndex": 6,
337
+ "startIndex": 6,
338
+ "endIndex": 7,
339
+ "children": []
340
+ }
341
+ ]
342
+ },
343
+ {
344
+ "type": "literal",
345
+ "name": "close-bracket",
346
+ "value": "]",
347
+ "firstIndex": 7,
348
+ "lastIndex": 7,
349
+ "startIndex": 7,
350
+ "endIndex": 8,
351
+ "children": []
352
+ }
353
+ ]
354
+ }
355
+ ]
356
+ },
357
+ {
358
+ "type": "literal",
359
+ "name": "close-bracket",
360
+ "value": "]",
361
+ "firstIndex": 8,
362
+ "lastIndex": 8,
363
+ "startIndex": 8,
364
+ "endIndex": 9,
365
+ "children": []
366
+ }
367
+ ]
368
+ },
369
+ {
370
+ "type": "regex",
371
+ "name": "comma-divider",
372
+ "value": ", ",
373
+ "firstIndex": 9,
374
+ "lastIndex": 10,
375
+ "startIndex": 9,
376
+ "endIndex": 11,
377
+ "children": []
378
+ },
379
+ {
380
+ "type": "regex",
381
+ "name": "integer",
382
+ "value": "1",
383
+ "firstIndex": 11,
384
+ "lastIndex": 11,
385
+ "startIndex": 11,
386
+ "endIndex": 12,
387
+ "children": []
388
+ },
389
+ {
390
+ "type": "regex",
391
+ "name": "comma-divider",
392
+ "value": ", ",
393
+ "firstIndex": 12,
394
+ "lastIndex": 13,
395
+ "startIndex": 12,
396
+ "endIndex": 14,
397
+ "children": []
398
+ },
399
+ {
400
+ "type": "regex",
401
+ "name": "integer",
402
+ "value": "2",
403
+ "firstIndex": 14,
404
+ "lastIndex": 14,
405
+ "startIndex": 14,
406
+ "endIndex": 15,
407
+ "children": []
408
+ },
409
+ {
410
+ "type": "regex",
411
+ "name": "comma-divider",
412
+ "value": ", ",
413
+ "firstIndex": 15,
414
+ "lastIndex": 16,
415
+ "startIndex": 15,
416
+ "endIndex": 17,
417
+ "children": []
418
+ },
419
+ {
420
+ "type": "regex",
421
+ "name": "integer",
422
+ "value": "3",
423
+ "firstIndex": 17,
424
+ "lastIndex": 17,
425
+ "startIndex": 17,
426
+ "endIndex": 18,
427
+ "children": []
428
+ }
429
+ ]
430
+ },
431
+ {
432
+ "type": "literal",
433
+ "name": "close-bracket",
434
+ "value": "]",
435
+ "firstIndex": 18,
436
+ "lastIndex": 18,
437
+ "startIndex": 18,
438
+ "endIndex": 19,
439
+ "children": []
440
+ }
441
+ ]
442
+ }
443
+ ```
444
+ The `Reference` pattern traverses the pattern composition to find the pattern that matches the one given to it at construction. It will then clone that pattern and tell that pattern to parse the text. If it cannot find the pattern with the given name, it will throw a runtime error.
445
+ ## Not
446
+
447
+ ## Intellisense
448
+ Because the patterns are composed in a tree and the cursor remembers what patterns matched last, we can ask what tokens are next. We will discuss how you can use clarity-pattern-parser for text auto complete and other interesting approaches for intellisense.
449
+
450
+ ## GetTokens
451
+ The `getTokens` method allow you to ask the pattern what tokens it is looking for. The Regex pattern was the only pattern that didn't already intrinsically know what patterns it was looking for, and we solved this by adding a `setTokens` to its class. This allows you to define a regexp that can capture infinitely many patterns, but suggest a finite set. We will discuss this further in the setTokens section. For now we will demonstrate what `getTokens` does.
452
+
453
+ ```ts
454
+ import { Or, Literal } from "clarity-pattern-parser";
455
+
456
+ const jane = new Literal("jane", "Jane");
457
+ const john = new Literal("john", "John");
458
+ const jack = new Literal("jack", "Jack");
459
+ const jill = new Literal("jill", "Jill");
460
+
461
+ const names = new Or("names", [jane, john, jack, jill]);
462
+
463
+ names.getTokens();
464
+ ```
465
+ ```json
466
+ ["Jane", "John", "Jack", "Jill"]
467
+ ```
468
+ ## GetNextTokens
469
+
470
+ ## SetTokens
471
+
472
+ ## Error Handling
package/TODO.md CHANGED
@@ -1,2 +1,76 @@
1
- - Remove the getNextToken from the Patterns. Use a Visitor pattern to figure out the tokens. Patterns should just be data.
2
- - Build a visitor and remove the filter off of the node. Nodes should just be data.
1
+ ## Grammar Ideas
2
+ ```
3
+ #comment
4
+ integer = /0|([1-9][0-9]+)/
5
+ method-name = "subtract" | "add" | "multiply"
6
+ divider = /\s*,\s*/
7
+ open-paren = "("
8
+ close-paren = ")"
9
+ argument = integer | method
10
+ arguments = argument* divider
11
+ not-integer = !integer
12
+ optional-integer = integer?
13
+ method = method-name & open-paren & arguments & close-paren
14
+
15
+ integer.tokens = ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"]
16
+ integer.enableContextualTokenAggregation
17
+ arguments.shouldReduceAst
18
+
19
+ export (method, arguments)
20
+ ```
21
+
22
+ Using Grammar for a simple JSON Parser
23
+ ```
24
+ # Number Integer
25
+ integer = /([1-9][0-9])*|0/
26
+ digit = /\d+/
27
+
28
+ # Number Fraction
29
+ period = "."
30
+ fraction = period & digit
31
+
32
+ # Number Exponent
33
+ e = "e" | "E"
34
+ sign = "+" | "-"
35
+ number-exponent = e & sign? & digit
36
+
37
+ # Number
38
+ number = integer & fraction? & number-exponent?
39
+
40
+ # String Unicode
41
+ hex-digit = /[0-9a-fA-F]/
42
+ unicode = "u" & hex-digit & hex-digit & hex-digit & hex-digit
43
+ special-character =
44
+ "'" |
45
+ "\"" |
46
+ "\\" |
47
+ "/" |
48
+ "b" |
49
+ "f" |
50
+ "n" |
51
+ "r" |
52
+ "t" |
53
+ unicode
54
+
55
+ normal-character = /[^\\"]+/
56
+ escaped-character = "\\" & special-character
57
+ character = normal-character | special-character
58
+ characters = character*
59
+
60
+ # String
61
+ string = "\"" & characters & "\""
62
+
63
+ # Boolean
64
+ boolean = "true" | "false"
65
+
66
+ spaces /\s+/
67
+
68
+ array-item = number | boolean | string | array | object
69
+ array-items = array-items* /\s+,\s+/
70
+ array = "[" & spaces? & array-items & spaces? & "]"
71
+
72
+
73
+ ```
74
+
75
+ // Other file
76
+ import (method, arguments) from "./method.grammar"
@@ -1,11 +1,49 @@
1
- export default class Node {
2
- type: string;
3
- name: string;
4
- startIndex: number;
5
- endIndex: number;
6
- children: Node[];
7
- value: string;
8
- constructor(type: string, name: string, startIndex: number, endIndex: number, children?: Node[], value?: string);
9
- clone(): Node;
10
- toString(): string;
11
- }
1
+ export interface CycleFreeNode {
2
+ type: string;
3
+ name: string;
4
+ firstIndex: number;
5
+ lastIndex: number;
6
+ startIndex: number;
7
+ endIndex: number;
8
+ value: string;
9
+ children: CycleFreeNode[];
10
+ }
11
+ export declare class Node {
12
+ private _type;
13
+ private _name;
14
+ private _firstIndex;
15
+ private _lastIndex;
16
+ private _parent;
17
+ private _children;
18
+ private _value;
19
+ get type(): string;
20
+ get name(): string;
21
+ get firstIndex(): number;
22
+ get lastIndex(): number;
23
+ get startIndex(): number;
24
+ get endIndex(): number;
25
+ get parent(): Node | null;
26
+ get children(): readonly Node[];
27
+ get hasChildren(): boolean;
28
+ get value(): string;
29
+ constructor(type: string, name: string, firstIndex: number, lastIndex: number, children?: Node[], value?: string);
30
+ removeChild(node: Node): void;
31
+ removeAllChildren(): void;
32
+ replaceChild(newNode: Node, referenceNode: Node): void;
33
+ insertBefore(newNode: Node, referenceNode: Node | null): void;
34
+ appendChild(newNode: Node): void;
35
+ spliceChildren(index: number, deleteCount: number, ...items: Node[]): Node[];
36
+ nextSibling(): Node | null;
37
+ previousSibling(): Node | null;
38
+ find(predicate: (node: Node) => boolean): Node | null;
39
+ findAll(predicate: (node: Node) => boolean): Node[];
40
+ findAncester(predicate: (node: Node) => boolean): Node | null;
41
+ walkUp(callback: (node: Node) => void): void;
42
+ walkDown(callback: (node: Node) => void): void;
43
+ flatten(): Node[];
44
+ reduce(): void;
45
+ clone(): Node;
46
+ toString(): string;
47
+ toCycleFreeObject(): CycleFreeNode;
48
+ toJson(space?: number): string;
49
+ }
@@ -1,31 +1,31 @@
1
- import Node from "./Node";
2
- export default class Visitor {
3
- root: Node | null;
4
- selectedNodes: Node[];
5
- constructor(root?: Node | null, selectedNodes?: Node[]);
6
- flatten(): this;
7
- remove(): this;
8
- private recursiveRemove;
9
- wrap(callback: (node: Node) => Node): this;
10
- unwrap(): this;
11
- prepend(callback: (node: Node) => Node): this;
12
- append(callback: (node: Node) => Node): this;
13
- transform(callback: (node: Node) => Node): this;
14
- private recursiveTransform;
15
- selectAll(): Visitor;
16
- selectNode(node: Node): Visitor;
17
- deselectNode(node: Node): Visitor;
18
- select(callback: (node: Node) => boolean): Visitor;
19
- forEach(callback: (node: Node) => void): this;
20
- filter(callback: (node: Node) => boolean): Visitor;
21
- map(callback: (node: Node) => Node): Visitor;
22
- selectRoot(): Visitor;
23
- first(): Visitor;
24
- last(): Visitor;
25
- get(index: number): Visitor;
26
- clear(): this;
27
- setRoot(root: Node | null): this;
28
- static select(root: Node, callback?: (node: Node) => boolean): Visitor;
29
- static walkUp(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
30
- static walkDown(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
31
- }
1
+ import { Node } from "./Node";
2
+ export declare class Visitor {
3
+ root: Node | null;
4
+ selectedNodes: Node[];
5
+ constructor(root?: Node | null, selectedNodes?: Node[]);
6
+ flatten(): this;
7
+ remove(): this;
8
+ private recursiveRemove;
9
+ wrap(callback: (node: Node) => Node): this;
10
+ unwrap(): this;
11
+ prepend(callback: (node: Node) => Node): this;
12
+ append(callback: (node: Node) => Node): this;
13
+ transform(callback: (node: Node) => Node): this;
14
+ private recursiveTransform;
15
+ selectAll(): Visitor;
16
+ selectNode(node: Node): Visitor;
17
+ deselectNode(node: Node): Visitor;
18
+ select(callback: (node: Node) => boolean): Visitor;
19
+ forEach(callback: (node: Node) => void): this;
20
+ filter(callback: (node: Node) => boolean): Visitor;
21
+ map(callback: (node: Node) => Node): Visitor;
22
+ selectRoot(): Visitor;
23
+ first(): Visitor;
24
+ last(): Visitor;
25
+ get(index: number): Visitor;
26
+ clear(): this;
27
+ setRoot(root: Node | null): this;
28
+ static select(root: Node, callback?: (node: Node) => boolean): Visitor;
29
+ static walkUp(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
30
+ static walkDown(node: Node, callback: (node: Node, ancestors: Node[]) => void, ancestors?: Node[]): typeof Visitor;
31
+ }