tree-sitter-sed 0.7.0 → 0.9.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.
package/common/regex.js CHANGED
@@ -1,4 +1,4 @@
1
- const { issueField, namedExternal } = require("./dsl");
1
+ const { issueField, issueNode, namedExternal } = require("./dsl");
2
2
 
3
3
  function subexpressionBody($, expression) {
4
4
  return choice(
@@ -10,6 +10,10 @@ function subexpressionBody($, expression) {
10
10
  }
11
11
 
12
12
  function intervalExpression($, openingName, closingName) {
13
+ const closing = field(
14
+ "closing",
15
+ namedExternal($, $._regex_interval_close, closingName),
16
+ );
13
17
  return seq(
14
18
  field("opening", namedExternal($, $._regex_interval_open, openingName)),
15
19
  choice(
@@ -29,19 +33,8 @@ function intervalExpression($, openingName, closingName) {
29
33
  ),
30
34
  ),
31
35
  choice(
32
- field(
33
- "closing",
34
- namedExternal($, $._regex_interval_close, closingName),
35
- ),
36
- seq(
37
- issueField($, "malformed_interval"),
38
- optional(
39
- field(
40
- "closing",
41
- namedExternal($, $._regex_interval_close, closingName),
42
- ),
43
- ),
44
- ),
36
+ closing,
37
+ seq(issueField($, "malformed_interval"), optional(closing)),
45
38
  issueField($, "incomplete_interval"),
46
39
  ),
47
40
  ),
@@ -50,12 +43,7 @@ function intervalExpression($, openingName, closingName) {
50
43
  issueField($, "malformed_interval"),
51
44
  issueField($, "incomplete_interval"),
52
45
  ),
53
- optional(
54
- field(
55
- "closing",
56
- namedExternal($, $._regex_interval_close, closingName),
57
- ),
58
- ),
46
+ optional(closing),
59
47
  ),
60
48
  ),
61
49
  );
@@ -75,7 +63,15 @@ function compoundBracketExpression(
75
63
  marker,
76
64
  choice(
77
65
  seq(
78
- field(contentField, content),
66
+ repeat1(
67
+ choice(
68
+ field(contentField, content),
69
+ issueField($, "invalid_regular_expression_character"),
70
+ ...(marker === ":"
71
+ ? [issueField($, "invalid_character_class_name")]
72
+ : []),
73
+ ),
74
+ ),
79
75
  choice(
80
76
  closing,
81
77
  seq(issueField($, "malformed_bracket_term"), optional(closing)),
@@ -93,17 +89,41 @@ function compoundBracketExpression(
93
89
  );
94
90
  }
95
91
 
92
+ function bracketListBody($) {
93
+ return choice(
94
+ field("elements", $.bracket_list),
95
+ issueField($, "missing_bracket_list"),
96
+ issueField($, "incomplete_missing_bracket_list"),
97
+ );
98
+ }
99
+
100
+ function subexpressionClose($, tokenName) {
101
+ return choice(
102
+ namedExternal($, $._regex_group_close, tokenName),
103
+ issueField($, "unclosed_subexpression"),
104
+ issueField($, "incomplete_unclosed_subexpression"),
105
+ );
106
+ }
107
+
108
+ function bracketExpression($, ambiguous) {
109
+ return seq(
110
+ field("opening", namedExternal($, $._regex_bracket_open, "open_bracket")),
111
+ field("list", choice($.matching_list, $.nonmatching_list)),
112
+ ...(ambiguous ? [$._ambiguous_bracket_expression_marker] : []),
113
+ field("closing", $.close_bracket),
114
+ );
115
+ }
116
+
96
117
  function bracketRules() {
97
118
  return {
98
- bracket_expression: ($) =>
99
- seq(
100
- field(
101
- "opening",
102
- namedExternal($, $._regex_bracket_open, "open_bracket"),
103
- ),
104
- field("list", choice($.matching_list, $.nonmatching_list)),
105
- optional(issueField($, "ambiguous_bracket_expression")),
106
- field("closing", $.close_bracket),
119
+ bracket_expression: ($) => bracketExpression($, false),
120
+
121
+ _ambiguous_bracket_expression: ($) => bracketExpression($, true),
122
+
123
+ _bracket_expression: ($) =>
124
+ choice(
125
+ $.bracket_expression,
126
+ issueField($, "ambiguous_bracket_expression"),
107
127
  ),
108
128
 
109
129
  close_bracket: ($) =>
@@ -113,12 +133,7 @@ function bracketRules() {
113
133
  issueField($, "incomplete_unclosed_bracket_expression"),
114
134
  ),
115
135
 
116
- matching_list: ($) =>
117
- choice(
118
- field("elements", $.bracket_list),
119
- issueField($, "missing_bracket_list"),
120
- issueField($, "incomplete_missing_bracket_list"),
121
- ),
136
+ matching_list: bracketListBody,
122
137
 
123
138
  nonmatching_list: ($) =>
124
139
  seq(
@@ -130,11 +145,7 @@ function bracketRules() {
130
145
  "nonmatching_list_operator",
131
146
  ),
132
147
  ),
133
- choice(
134
- field("elements", $.bracket_list),
135
- issueField($, "missing_bracket_list"),
136
- issueField($, "incomplete_missing_bracket_list"),
137
- ),
148
+ bracketListBody($),
138
149
  ),
139
150
 
140
151
  bracket_list: ($) =>
@@ -204,8 +215,7 @@ function bracketRules() {
204
215
 
205
216
  _character_class_start_range: ($) =>
206
217
  seq(
207
- field("start", $.character_class),
208
- issueField($, "character_class_range_start"),
218
+ field("start", issueNode($, "character_class_range_start")),
209
219
  field(
210
220
  "operator",
211
221
  namedExternal($, $._regex_bracket_hyphen, "range_operator"),
@@ -214,8 +224,7 @@ function bracketRules() {
214
224
 
215
225
  _equivalence_class_start_range: ($) =>
216
226
  seq(
217
- field("start", $.equivalence_class),
218
- issueField($, "equivalence_class_range_start"),
227
+ field("start", issueNode($, "equivalence_class_range_start")),
219
228
  field(
220
229
  "operator",
221
230
  namedExternal($, $._regex_bracket_hyphen, "range_operator"),
@@ -223,16 +232,10 @@ function bracketRules() {
223
232
  ),
224
233
 
225
234
  _character_class_end_range: ($) =>
226
- seq(
227
- issueField($, "character_class_range_end"),
228
- field("term", $.character_class),
229
- ),
235
+ field("term", issueNode($, "character_class_range_end")),
230
236
 
231
237
  _equivalence_class_end_range: ($) =>
232
- seq(
233
- issueField($, "equivalence_class_range_end"),
234
- field("term", $.equivalence_class),
235
- ),
238
+ field("term", issueNode($, "equivalence_class_range_end")),
236
239
 
237
240
  start_range: ($) =>
238
241
  seq(
@@ -246,7 +249,10 @@ function bracketRules() {
246
249
  end_range: ($) => choice($.collating_element, $.collating_symbol),
247
250
 
248
251
  collating_element: ($) =>
249
- namedExternal($, $._regex_bracket_literal, "collating_element_token"),
252
+ choice(
253
+ namedExternal($, $._regex_bracket_literal, "collating_element_token"),
254
+ issueField($, "invalid_regular_expression_character"),
255
+ ),
250
256
 
251
257
  collating_symbol: ($) =>
252
258
  compoundBracketExpression(
@@ -289,39 +295,32 @@ function bracketRules() {
289
295
 
290
296
  function commonRegularExpressionRules() {
291
297
  return {
292
- dup_count: ($) => namedExternal($, $._regex_dup_count, "dup_count_token"),
298
+ dup_count: ($) => $._regex_dup_count,
293
299
 
294
- ordinary_character: ($) =>
295
- namedExternal($, $._regex_literal, "ordinary_character_token"),
300
+ ordinary_character: ($) => $._regex_literal,
296
301
 
297
302
  quoted_character: ($) =>
298
303
  choice(
299
304
  namedExternal($, $._regex_quoted_escape, "quoted_character_token"),
305
+ seq(
306
+ $._escape_prefix,
307
+ issueField($, "invalid_regular_expression_character"),
308
+ ),
300
309
  $.escaped_delimiter,
301
310
  issueField($, "ordinary_character_escape"),
302
311
  issueField($, "incomplete_regular_expression_escape"),
303
312
  issueField($, "forbidden_regular_expression_newline"),
304
313
  ),
305
314
 
306
- escaped_delimiter: ($) =>
307
- field(
308
- "token",
309
- namedExternal($, $._regex_escaped_delimiter, "escaped_delimiter_token"),
310
- ),
311
-
312
- ambiguous_delimiter_escape: ($) =>
313
- issueField($, "special_delimiter_escape"),
315
+ escaped_delimiter: ($) => $._regex_escaped_delimiter,
314
316
 
315
- sed_newline_escape: ($) =>
316
- namedExternal($, $._regex_newline_escape, "sed_newline_escape_token"),
317
+ sed_newline_escape: ($) => $._regex_newline_escape,
317
318
 
318
- period: ($) => namedExternal($, $._regex_period, "period_token"),
319
+ period: ($) => $._regex_period,
319
320
 
320
- left_anchor: ($) =>
321
- namedExternal($, $._regex_beginning_anchor, "left_anchor_token"),
321
+ left_anchor: ($) => $._regex_beginning_anchor,
322
322
 
323
- right_anchor: ($) =>
324
- namedExternal($, $._regex_end_anchor, "right_anchor_token"),
323
+ right_anchor: ($) => $._regex_end_anchor,
325
324
 
326
325
  ...bracketRules(),
327
326
  };
@@ -334,47 +333,8 @@ function breDuplicationSymbol($) {
334
333
  );
335
334
  }
336
335
 
337
- function misplacedBreDuplSymbol($, reason) {
338
- return choice(
339
- seq(issueField($, reason), field("operator", $.bre_dupl_symbol)),
340
- issueField($, "malformed_interval"),
341
- issueField($, "incomplete_interval"),
342
- );
343
- }
344
-
345
336
  function breRules() {
346
337
  return {
347
- bre_extension_escape: ($) =>
348
- choice(
349
- seq(
350
- field(
351
- "token",
352
- namedExternal($, $._regex_bre_vertical_line_escape, "back_bar"),
353
- ),
354
- issueField($, "bre_vertical_line_escape"),
355
- ),
356
- seq(
357
- field(
358
- "token",
359
- namedExternal($, $._regex_bre_question_mark_escape, "back_qm"),
360
- ),
361
- issueField($, "bre_question_mark_escape"),
362
- ),
363
- seq(
364
- field(
365
- "token",
366
- namedExternal($, $._regex_bre_plus_escape, "back_plus"),
367
- ),
368
- issueField($, "bre_plus_escape"),
369
- ),
370
- ),
371
-
372
- bre_subexpression_anchor: ($) =>
373
- choice(
374
- issueField($, "bre_subexpression_right_anchor"),
375
- issueField($, "bre_subexpression_left_anchor"),
376
- ),
377
-
378
338
  basic_reg_exp: ($) => $.bre_branch,
379
339
 
380
340
  bre_branch: ($) =>
@@ -435,10 +395,10 @@ function breRules() {
435
395
  -1,
436
396
  seq(
437
397
  field("operand", $.simple_bre),
438
- field("operator", $.adjacent_bre_dupl_symbol),
398
+ field("operator", issueNode($, "adjacent_duplication_symbol")),
439
399
  ),
440
400
  ),
441
- field("operator", $.leading_bre_dupl_symbol),
401
+ field("operator", issueNode($, "leading_duplication_symbol")),
442
402
  ),
443
403
 
444
404
  nondupl_bre: ($) =>
@@ -458,37 +418,30 @@ function breRules() {
458
418
  ),
459
419
 
460
420
  back_close_parenthesis: ($) =>
461
- choice(
462
- namedExternal($, $._regex_group_close, "back_close_parenthesis_token"),
463
- issueField($, "unclosed_subexpression"),
464
- issueField($, "incomplete_unclosed_subexpression"),
465
- ),
421
+ subexpressionClose($, "back_close_parenthesis_token"),
466
422
 
467
- backreference: ($) =>
468
- namedExternal($, $._regex_backreference, "backreference_token"),
423
+ backreference: ($) => $._regex_backreference,
469
424
 
470
425
  one_char_or_coll_elem_bre: ($) =>
471
426
  choice(
427
+ issueField($, "invalid_regular_expression_character"),
472
428
  $.ordinary_character,
473
429
  $.quoted_character,
474
430
  $.sed_newline_escape,
475
431
  $.period,
476
- $.bracket_expression,
477
- $.ambiguous_delimiter_escape,
478
- $.bre_extension_escape,
479
- $.bre_subexpression_anchor,
432
+ $._bracket_expression,
433
+ issueField($, "special_delimiter_escape"),
434
+ issueField($, "bre_vertical_line_escape"),
435
+ issueField($, "bre_question_mark_escape"),
436
+ issueField($, "bre_plus_escape"),
437
+ issueField($, "bre_subexpression_right_anchor"),
438
+ issueField($, "bre_subexpression_left_anchor"),
480
439
  ),
481
440
 
482
441
  bre_dupl_symbol: ($) => breDuplicationSymbol($),
483
442
 
484
443
  _bre_interval: ($) =>
485
444
  intervalExpression($, "back_open_brace", "back_close_brace"),
486
-
487
- leading_bre_dupl_symbol: ($) =>
488
- misplacedBreDuplSymbol($, "leading_duplication_symbol"),
489
-
490
- adjacent_bre_dupl_symbol: ($) =>
491
- misplacedBreDuplSymbol($, "adjacent_duplication_symbol"),
492
445
  };
493
446
  }
494
447
 
@@ -503,42 +456,20 @@ function ereDuplicationSymbol($) {
503
456
 
504
457
  function ereRules() {
505
458
  return {
506
- extended_reg_exp: ($) =>
507
- choice(
459
+ extended_reg_exp: ($) => {
460
+ const emptyBranch = alias($._empty_ere_branch, $.ere_branch);
461
+ return choice(
508
462
  $.ere_branch,
509
463
  prec.left(
510
464
  1,
511
465
  seq(
512
- field("left", $.extended_reg_exp),
513
- field("operator", $.ere_alternation_operator),
514
- field("right", $.ere_branch),
515
- ),
516
- ),
517
- prec.left(
518
- 1,
519
- seq(
520
- field("left", alias($._empty_ere_branch, $.ere_branch)),
521
- field("operator", $.ere_alternation_operator),
522
- field("right", $.ere_branch),
523
- ),
524
- ),
525
- prec.left(
526
- 1,
527
- seq(
528
- field("left", $.extended_reg_exp),
529
- field("operator", $.ere_alternation_operator),
530
- field("right", alias($._empty_ere_branch, $.ere_branch)),
531
- ),
532
- ),
533
- prec.left(
534
- 1,
535
- seq(
536
- field("left", alias($._empty_ere_branch, $.ere_branch)),
466
+ field("left", choice($.extended_reg_exp, emptyBranch)),
537
467
  field("operator", $.ere_alternation_operator),
538
- field("right", alias($._empty_ere_branch, $.ere_branch)),
468
+ field("right", choice($.ere_branch, emptyBranch)),
539
469
  ),
540
470
  ),
541
- ),
471
+ );
472
+ },
542
473
 
543
474
  _empty_ere_branch: ($) =>
544
475
  choice(
@@ -546,12 +477,7 @@ function ereRules() {
546
477
  issueField($, "incomplete_alternative"),
547
478
  ),
548
479
 
549
- ere_alternation_operator: ($) =>
550
- namedExternal(
551
- $,
552
- $._regex_alternation_operator,
553
- "ere_alternation_operator_token",
554
- ),
480
+ ere_alternation_operator: ($) => $._regex_alternation_operator,
555
481
 
556
482
  ere_branch: ($) =>
557
483
  choice(
@@ -578,70 +504,40 @@ function ereRules() {
578
504
  1,
579
505
  seq(
580
506
  field("operand", $.ere_expression),
581
- field("operator", $.ere_dupl_symbol),
507
+ field(
508
+ "operator",
509
+ choice(
510
+ $.ere_dupl_symbol,
511
+ issueNode($, "adjacent_duplication_symbol"),
512
+ ),
513
+ ),
582
514
  ),
583
515
  ),
584
- field("operator", $.leading_ere_dupl_symbol),
516
+ field("operator", issueNode($, "leading_duplication_symbol")),
585
517
  ),
586
518
 
587
- close_parenthesis: ($) =>
588
- choice(
589
- namedExternal($, $._regex_group_close, "close_parenthesis_token"),
590
- issueField($, "unclosed_subexpression"),
591
- issueField($, "incomplete_unclosed_subexpression"),
592
- ),
519
+ close_parenthesis: ($) => subexpressionClose($, "close_parenthesis_token"),
593
520
 
594
521
  one_char_or_coll_elem_ere: ($) =>
595
522
  choice(
523
+ issueField($, "invalid_regular_expression_character"),
596
524
  $.ordinary_character,
597
525
  $.quoted_character,
598
526
  $.sed_newline_escape,
599
527
  $.period,
600
- $.bracket_expression,
601
- $.ambiguous_delimiter_escape,
528
+ $._bracket_expression,
529
+ issueField($, "special_delimiter_escape"),
602
530
  ),
603
531
 
604
532
  ere_dupl_symbol: ($) =>
605
533
  seq(
606
- choice(
607
- ereDuplicationSymbol($),
608
- seq(
609
- issueField($, "adjacent_duplication_symbol"),
610
- ereDuplicationSymbol($),
611
- ),
612
- issueField($, "malformed_interval"),
613
- issueField($, "incomplete_interval"),
614
- ),
534
+ ereDuplicationSymbol($),
615
535
  optional(field("modifier", $.repetition_modifier)),
616
536
  ),
617
537
 
618
538
  _ere_interval: ($) => intervalExpression($, "open_brace", "close_brace"),
619
539
 
620
540
  repetition_modifier: ($) => $._regex_repetition_modifier,
621
-
622
- _leading_ere_dupl_symbol: ($) =>
623
- seq(
624
- ereDuplicationSymbol($),
625
- optional(field("modifier", $.repetition_modifier)),
626
- ),
627
-
628
- leading_ere_dupl_symbol: ($) =>
629
- choice(
630
- seq(
631
- issueField($, "leading_duplication_symbol"),
632
- field(
633
- "operator",
634
- alias($._leading_ere_dupl_symbol, $.ere_dupl_symbol),
635
- ),
636
- ),
637
- seq(
638
- choice(
639
- issueField($, "malformed_interval"),
640
- issueField($, "incomplete_interval"),
641
- ),
642
- optional(field("modifier", $.repetition_modifier)),
643
- ),
644
- ),
645
541
  };
646
542
  }
647
543