tree-sitter-sed 0.1.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.
@@ -0,0 +1,678 @@
1
+ const { issueField, namedExternal } = require("./dsl");
2
+
3
+ function intervalExpression($, openingName, closingName) {
4
+ return seq(
5
+ field("opening", namedExternal($, $._regex_interval_open, openingName)),
6
+ choice(
7
+ seq(
8
+ field("minimum", $.dup_count),
9
+ optional(
10
+ seq(
11
+ field(
12
+ "separator",
13
+ namedExternal(
14
+ $,
15
+ $._regex_interval_separator,
16
+ "interval_separator",
17
+ ),
18
+ ),
19
+ optional(field("maximum", $.dup_count)),
20
+ ),
21
+ ),
22
+ choice(
23
+ field(
24
+ "closing",
25
+ namedExternal($, $._regex_interval_close, closingName),
26
+ ),
27
+ seq(
28
+ issueField($, "malformed_interval"),
29
+ optional(
30
+ field(
31
+ "closing",
32
+ namedExternal($, $._regex_interval_close, closingName),
33
+ ),
34
+ ),
35
+ ),
36
+ issueField($, "incomplete_interval"),
37
+ ),
38
+ ),
39
+ seq(
40
+ choice(
41
+ issueField($, "malformed_interval"),
42
+ issueField($, "incomplete_interval"),
43
+ ),
44
+ optional(
45
+ field(
46
+ "closing",
47
+ namedExternal($, $._regex_interval_close, closingName),
48
+ ),
49
+ ),
50
+ ),
51
+ ),
52
+ );
53
+ }
54
+
55
+ function compoundBracketExpression(
56
+ $,
57
+ openingExternal,
58
+ openingName,
59
+ contentField,
60
+ content,
61
+ closingExternal,
62
+ closingName,
63
+ ) {
64
+ const closing = namedExternal($, closingExternal, closingName);
65
+ return seq(
66
+ field("opening", namedExternal($, openingExternal, openingName)),
67
+ choice(
68
+ seq(
69
+ field(contentField, content),
70
+ choice(
71
+ field("closing", closing),
72
+ seq(
73
+ issueField($, "malformed_bracket_term"),
74
+ optional(field("closing", closing)),
75
+ ),
76
+ issueField($, "incomplete_bracket_term"),
77
+ ),
78
+ ),
79
+ seq(
80
+ choice(
81
+ issueField($, "malformed_bracket_term"),
82
+ issueField($, "incomplete_bracket_term"),
83
+ ),
84
+ optional(field("closing", closing)),
85
+ ),
86
+ ),
87
+ );
88
+ }
89
+
90
+ function bracketRules() {
91
+ return {
92
+ bracket_expression: ($) =>
93
+ seq(
94
+ field(
95
+ "opening",
96
+ namedExternal($, $._regex_bracket_open, "open_bracket"),
97
+ ),
98
+ field("list", choice($.matching_list, $.nonmatching_list)),
99
+ optional(issueField($, "ambiguous_bracket_expression")),
100
+ field("closing", $.close_bracket),
101
+ ),
102
+
103
+ close_bracket: ($) =>
104
+ choice(
105
+ namedExternal($, $._regex_bracket_close, "close_bracket_token"),
106
+ issueField($, "unclosed_bracket_expression"),
107
+ issueField($, "incomplete_unclosed_bracket_expression"),
108
+ ),
109
+
110
+ matching_list: ($) =>
111
+ choice(
112
+ field("elements", $.bracket_list),
113
+ issueField($, "missing_bracket_list"),
114
+ issueField($, "incomplete_missing_bracket_list"),
115
+ ),
116
+
117
+ nonmatching_list: ($) =>
118
+ seq(
119
+ field(
120
+ "operator",
121
+ namedExternal(
122
+ $,
123
+ $._regex_bracket_negation,
124
+ "nonmatching_list_operator",
125
+ ),
126
+ ),
127
+ choice(
128
+ field("elements", $.bracket_list),
129
+ issueField($, "missing_bracket_list"),
130
+ issueField($, "incomplete_missing_bracket_list"),
131
+ ),
132
+ ),
133
+
134
+ bracket_list: ($) =>
135
+ choice(
136
+ $.follow_list,
137
+ seq(
138
+ $.follow_list,
139
+ field(
140
+ "trailing_hyphen",
141
+ namedExternal(
142
+ $,
143
+ $._regex_bracket_trailing_hyphen,
144
+ "trailing_hyphen",
145
+ ),
146
+ ),
147
+ ),
148
+ ),
149
+
150
+ follow_list: ($) =>
151
+ choice(
152
+ $.expression_term,
153
+ prec.left(
154
+ seq(field("left", $.follow_list), field("right", $.expression_term)),
155
+ ),
156
+ ),
157
+
158
+ expression_term: ($) =>
159
+ choice(
160
+ $.single_expression,
161
+ $.range_expression,
162
+ issueField($, "malformed_bracket_term"),
163
+ issueField($, "shared_range_endpoint"),
164
+ ),
165
+
166
+ single_expression: ($) =>
167
+ choice($.end_range, $.character_class, $.equivalence_class),
168
+
169
+ range_expression: ($) =>
170
+ seq(
171
+ field(
172
+ "start",
173
+ choice(
174
+ $.start_range,
175
+ alias($._character_class_start_range, $.start_range),
176
+ alias($._equivalence_class_start_range, $.start_range),
177
+ ),
178
+ ),
179
+ choice(
180
+ field(
181
+ "end",
182
+ choice(
183
+ $.end_range,
184
+ alias($._character_class_end_range, $.end_range),
185
+ alias($._equivalence_class_end_range, $.end_range),
186
+ ),
187
+ ),
188
+ field(
189
+ "ending_hyphen",
190
+ namedExternal(
191
+ $,
192
+ $._regex_bracket_range_end_hyphen,
193
+ "range_end_hyphen",
194
+ ),
195
+ ),
196
+ ),
197
+ ),
198
+
199
+ _character_class_start_range: ($) =>
200
+ seq(
201
+ field("start", $.character_class),
202
+ issueField($, "character_class_range_start"),
203
+ field(
204
+ "operator",
205
+ namedExternal($, $._regex_bracket_hyphen, "range_operator"),
206
+ ),
207
+ ),
208
+
209
+ _equivalence_class_start_range: ($) =>
210
+ seq(
211
+ field("start", $.equivalence_class),
212
+ issueField($, "equivalence_class_range_start"),
213
+ field(
214
+ "operator",
215
+ namedExternal($, $._regex_bracket_hyphen, "range_operator"),
216
+ ),
217
+ ),
218
+
219
+ _character_class_end_range: ($) =>
220
+ seq(
221
+ issueField($, "character_class_range_end"),
222
+ field("term", $.character_class),
223
+ ),
224
+
225
+ _equivalence_class_end_range: ($) =>
226
+ seq(
227
+ issueField($, "equivalence_class_range_end"),
228
+ field("term", $.equivalence_class),
229
+ ),
230
+
231
+ start_range: ($) =>
232
+ seq(
233
+ field("start", $.end_range),
234
+ field(
235
+ "operator",
236
+ namedExternal($, $._regex_bracket_hyphen, "range_operator"),
237
+ ),
238
+ ),
239
+
240
+ end_range: ($) => choice($.collating_element, $.collating_symbol),
241
+
242
+ collating_element: ($) =>
243
+ namedExternal($, $._regex_bracket_literal, "collating_element_token"),
244
+
245
+ collating_symbol: ($) =>
246
+ compoundBracketExpression(
247
+ $,
248
+ $._regex_open_dot,
249
+ "open_dot",
250
+ "element",
251
+ choice(
252
+ namedExternal($, $._regex_coll_elem_single, "coll_elem_single"),
253
+ namedExternal($, $._regex_coll_elem_multi, "coll_elem_multi"),
254
+ namedExternal($, $._regex_meta_char, "meta_char"),
255
+ ),
256
+ $._regex_dot_close,
257
+ "dot_close",
258
+ ),
259
+
260
+ equivalence_class: ($) =>
261
+ compoundBracketExpression(
262
+ $,
263
+ $._regex_open_equal,
264
+ "open_equal",
265
+ "element",
266
+ choice(
267
+ namedExternal($, $._regex_coll_elem_single, "coll_elem_single"),
268
+ namedExternal($, $._regex_coll_elem_multi, "coll_elem_multi"),
269
+ ),
270
+ $._regex_equal_close,
271
+ "equal_close",
272
+ ),
273
+
274
+ character_class: ($) =>
275
+ compoundBracketExpression(
276
+ $,
277
+ $._regex_open_colon,
278
+ "open_colon",
279
+ "name",
280
+ namedExternal($, $._regex_class_name, "class_name"),
281
+ $._regex_colon_close,
282
+ "colon_close",
283
+ ),
284
+ };
285
+ }
286
+
287
+ function commonRegularExpressionRules() {
288
+ return {
289
+ dup_count: ($) => namedExternal($, $._regex_dup_count, "dup_count_token"),
290
+
291
+ ordinary_character: ($) =>
292
+ namedExternal($, $._regex_literal, "ordinary_character_token"),
293
+
294
+ quoted_character: ($) =>
295
+ choice(
296
+ namedExternal($, $._regex_quoted_escape, "quoted_character_token"),
297
+ $.escaped_delimiter,
298
+ issueField($, "ordinary_character_escape"),
299
+ issueField($, "incomplete_regular_expression_escape"),
300
+ issueField($, "forbidden_regular_expression_newline"),
301
+ ),
302
+
303
+ escaped_delimiter: ($) =>
304
+ field(
305
+ "token",
306
+ namedExternal($, $._regex_escaped_delimiter, "escaped_delimiter_token"),
307
+ ),
308
+
309
+ ambiguous_delimiter_escape: ($) =>
310
+ issueField($, "special_delimiter_escape"),
311
+
312
+ sed_newline_escape: ($) =>
313
+ namedExternal($, $._regex_newline_escape, "sed_newline_escape_token"),
314
+
315
+ period: ($) => namedExternal($, $._regex_period, "period_token"),
316
+
317
+ left_anchor: ($) =>
318
+ namedExternal($, $._regex_beginning_anchor, "left_anchor_token"),
319
+
320
+ right_anchor: ($) =>
321
+ namedExternal($, $._regex_end_anchor, "right_anchor_token"),
322
+
323
+ ...bracketRules(),
324
+ };
325
+ }
326
+
327
+ function breDuplicationSymbol($) {
328
+ return choice(
329
+ namedExternal($, $._regex_zero_or_more, "zero_or_more_operator"),
330
+ $._bre_interval,
331
+ );
332
+ }
333
+
334
+ function breRules() {
335
+ return {
336
+ bre_extension_escape: ($) =>
337
+ choice(
338
+ seq(
339
+ field(
340
+ "token",
341
+ namedExternal($, $._regex_bre_vertical_line_escape, "back_bar"),
342
+ ),
343
+ issueField($, "bre_vertical_line_escape"),
344
+ ),
345
+ seq(
346
+ field(
347
+ "token",
348
+ namedExternal($, $._regex_bre_question_mark_escape, "back_qm"),
349
+ ),
350
+ issueField($, "bre_question_mark_escape"),
351
+ ),
352
+ seq(
353
+ field(
354
+ "token",
355
+ namedExternal($, $._regex_bre_plus_escape, "back_plus"),
356
+ ),
357
+ issueField($, "bre_plus_escape"),
358
+ ),
359
+ ),
360
+
361
+ bre_subexpression_anchor: ($) =>
362
+ choice(
363
+ issueField($, "bre_subexpression_right_anchor"),
364
+ issueField($, "bre_subexpression_left_anchor"),
365
+ ),
366
+
367
+ basic_reg_exp: ($) => $.bre_branch,
368
+
369
+ bre_branch: ($) =>
370
+ choice(
371
+ $.bre_expression,
372
+ prec.left(
373
+ seq(field("left", $.bre_branch), field("right", $.bre_expression)),
374
+ ),
375
+ ),
376
+
377
+ bre_expression: ($) =>
378
+ choice(
379
+ $.simple_bre,
380
+ field("left_anchor", $.left_anchor),
381
+ field("right_anchor", $.right_anchor),
382
+ prec(
383
+ 1,
384
+ seq(
385
+ field("left_anchor", $.left_anchor),
386
+ field("right_anchor", $.right_anchor),
387
+ ),
388
+ ),
389
+ prec(
390
+ 1,
391
+ seq(
392
+ field("left_anchor", $.left_anchor),
393
+ field("expression", $.simple_bre),
394
+ ),
395
+ ),
396
+ prec(
397
+ 1,
398
+ seq(
399
+ field("expression", $.simple_bre),
400
+ field("right_anchor", $.right_anchor),
401
+ ),
402
+ ),
403
+ prec(
404
+ 2,
405
+ seq(
406
+ field("left_anchor", $.left_anchor),
407
+ field("expression", $.simple_bre),
408
+ field("right_anchor", $.right_anchor),
409
+ ),
410
+ ),
411
+ ),
412
+
413
+ simple_bre: ($) =>
414
+ choice(
415
+ field("operand", $.nondupl_bre),
416
+ prec(
417
+ 1,
418
+ seq(
419
+ field("operand", $.nondupl_bre),
420
+ field("operator", $.bre_dupl_symbol),
421
+ ),
422
+ ),
423
+ prec.left(
424
+ -1,
425
+ seq(
426
+ field("operand", $.simple_bre),
427
+ field("operator", $.adjacent_bre_dupl_symbol),
428
+ ),
429
+ ),
430
+ field("operator", $.leading_bre_dupl_symbol),
431
+ ),
432
+
433
+ nondupl_bre: ($) =>
434
+ choice(
435
+ $.one_char_or_coll_elem_bre,
436
+ seq(
437
+ field(
438
+ "opening",
439
+ namedExternal($, $._regex_group_open, "back_open_parenthesis"),
440
+ ),
441
+ choice(
442
+ field("expression", $.basic_reg_exp),
443
+ issueField($, "empty_subexpression"),
444
+ issueField($, "missing_subexpression"),
445
+ $._missing_subexpression_placeholder_marker,
446
+ ),
447
+ field("closing", $.back_close_parenthesis),
448
+ ),
449
+ $.backreference,
450
+ issueField($, "unmatched_subexpression_close"),
451
+ seq(
452
+ field(
453
+ "closing",
454
+ namedExternal(
455
+ $,
456
+ $._regex_unmatched_interval_close,
457
+ "back_close_brace",
458
+ ),
459
+ ),
460
+ issueField($, "unmatched_interval_close"),
461
+ ),
462
+ ),
463
+
464
+ back_close_parenthesis: ($) =>
465
+ choice(
466
+ namedExternal($, $._regex_group_close, "back_close_parenthesis_token"),
467
+ issueField($, "unclosed_subexpression"),
468
+ issueField($, "incomplete_unclosed_subexpression"),
469
+ ),
470
+
471
+ backreference: ($) =>
472
+ namedExternal($, $._regex_backreference, "backreference_token"),
473
+
474
+ one_char_or_coll_elem_bre: ($) =>
475
+ choice(
476
+ $.ordinary_character,
477
+ $.quoted_character,
478
+ $.sed_newline_escape,
479
+ $.period,
480
+ $.bracket_expression,
481
+ $.ambiguous_delimiter_escape,
482
+ $.bre_extension_escape,
483
+ $.bre_subexpression_anchor,
484
+ ),
485
+
486
+ bre_dupl_symbol: ($) => breDuplicationSymbol($),
487
+
488
+ _bre_interval: ($) =>
489
+ intervalExpression($, "back_open_brace", "back_close_brace"),
490
+
491
+ leading_bre_dupl_symbol: ($) =>
492
+ choice(
493
+ seq(
494
+ issueField($, "leading_duplication_symbol"),
495
+ field("operator", $.bre_dupl_symbol),
496
+ ),
497
+ issueField($, "malformed_interval"),
498
+ issueField($, "incomplete_interval"),
499
+ ),
500
+
501
+ adjacent_bre_dupl_symbol: ($) =>
502
+ choice(
503
+ seq(
504
+ issueField($, "adjacent_duplication_symbol"),
505
+ field("operator", $.bre_dupl_symbol),
506
+ ),
507
+ issueField($, "malformed_interval"),
508
+ issueField($, "incomplete_interval"),
509
+ ),
510
+ };
511
+ }
512
+
513
+ function ereDuplicationSymbol($) {
514
+ return choice(
515
+ namedExternal($, $._regex_zero_or_more, "zero_or_more_operator"),
516
+ namedExternal($, $._regex_one_or_more, "one_or_more_operator"),
517
+ namedExternal($, $._regex_zero_or_one, "zero_or_one_operator"),
518
+ $._ere_interval,
519
+ );
520
+ }
521
+
522
+ function ereRules() {
523
+ return {
524
+ extended_reg_exp: ($) =>
525
+ choice(
526
+ $.ere_branch,
527
+ prec.left(
528
+ 1,
529
+ seq(
530
+ field("left", $.extended_reg_exp),
531
+ field("operator", $.ere_alternation_operator),
532
+ field("right", $.ere_branch),
533
+ ),
534
+ ),
535
+ prec.left(
536
+ 1,
537
+ seq(
538
+ field("left", alias($._empty_ere_branch, $.ere_branch)),
539
+ field("operator", $.ere_alternation_operator),
540
+ field("right", $.ere_branch),
541
+ ),
542
+ ),
543
+ prec.left(
544
+ 1,
545
+ seq(
546
+ field("left", $.extended_reg_exp),
547
+ field("operator", $.ere_alternation_operator),
548
+ field("right", alias($._empty_ere_branch, $.ere_branch)),
549
+ ),
550
+ ),
551
+ prec.left(
552
+ 1,
553
+ seq(
554
+ field("left", alias($._empty_ere_branch, $.ere_branch)),
555
+ field("operator", $.ere_alternation_operator),
556
+ field("right", alias($._empty_ere_branch, $.ere_branch)),
557
+ ),
558
+ ),
559
+ ),
560
+
561
+ _empty_ere_branch: ($) =>
562
+ choice(
563
+ issueField($, "empty_alternative"),
564
+ issueField($, "incomplete_alternative"),
565
+ ),
566
+
567
+ ere_alternation_operator: ($) =>
568
+ namedExternal(
569
+ $,
570
+ $._regex_alternation_operator,
571
+ "ere_alternation_operator_token",
572
+ ),
573
+
574
+ ere_branch: ($) =>
575
+ choice(
576
+ $.ere_expression,
577
+ prec.left(
578
+ seq(field("left", $.ere_branch), field("right", $.ere_expression)),
579
+ ),
580
+ ),
581
+
582
+ ere_expression: ($) =>
583
+ choice(
584
+ $.one_char_or_coll_elem_ere,
585
+ field("left_anchor", $.left_anchor),
586
+ field("right_anchor", $.right_anchor),
587
+ seq(
588
+ field(
589
+ "opening",
590
+ namedExternal($, $._regex_group_open, "open_parenthesis"),
591
+ ),
592
+ choice(
593
+ field("expression", $.extended_reg_exp),
594
+ issueField($, "empty_subexpression"),
595
+ issueField($, "missing_subexpression"),
596
+ $._missing_subexpression_placeholder_marker,
597
+ ),
598
+ field("closing", $.close_parenthesis),
599
+ ),
600
+ prec.left(
601
+ 1,
602
+ seq(
603
+ field("operand", $.ere_expression),
604
+ field("operator", $.ere_dupl_symbol),
605
+ ),
606
+ ),
607
+ field("operator", $.leading_ere_dupl_symbol),
608
+ ),
609
+
610
+ close_parenthesis: ($) =>
611
+ choice(
612
+ namedExternal($, $._regex_group_close, "close_parenthesis_token"),
613
+ issueField($, "unclosed_subexpression"),
614
+ issueField($, "incomplete_unclosed_subexpression"),
615
+ ),
616
+
617
+ one_char_or_coll_elem_ere: ($) =>
618
+ choice(
619
+ $.ordinary_character,
620
+ $.quoted_character,
621
+ $.sed_newline_escape,
622
+ $.period,
623
+ $.bracket_expression,
624
+ $.ambiguous_delimiter_escape,
625
+ ),
626
+
627
+ ere_dupl_symbol: ($) =>
628
+ seq(
629
+ choice(
630
+ ereDuplicationSymbol($),
631
+ seq(
632
+ issueField($, "adjacent_duplication_symbol"),
633
+ ereDuplicationSymbol($),
634
+ ),
635
+ issueField($, "malformed_interval"),
636
+ issueField($, "incomplete_interval"),
637
+ ),
638
+ optional(field("modifier", $.repetition_modifier)),
639
+ ),
640
+
641
+ _ere_interval: ($) => intervalExpression($, "open_brace", "close_brace"),
642
+
643
+ repetition_modifier: ($) => $._regex_repetition_modifier,
644
+
645
+ _leading_ere_dupl_symbol: ($) =>
646
+ seq(
647
+ ereDuplicationSymbol($),
648
+ optional(field("modifier", $.repetition_modifier)),
649
+ ),
650
+
651
+ leading_ere_dupl_symbol: ($) =>
652
+ choice(
653
+ seq(
654
+ issueField($, "leading_duplication_symbol"),
655
+ field(
656
+ "operator",
657
+ alias($._leading_ere_dupl_symbol, $.ere_dupl_symbol),
658
+ ),
659
+ ),
660
+ seq(
661
+ choice(
662
+ issueField($, "malformed_interval"),
663
+ issueField($, "incomplete_interval"),
664
+ ),
665
+ optional(field("modifier", $.repetition_modifier)),
666
+ ),
667
+ ),
668
+ };
669
+ }
670
+
671
+ function regularExpressionRules(mode) {
672
+ return {
673
+ ...commonRegularExpressionRules(),
674
+ ...(mode === "bre" ? breRules() : ereRules()),
675
+ };
676
+ }
677
+
678
+ module.exports = regularExpressionRules;