tree-sitter-sed 0.13.0 → 0.14.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/Cargo.toml +1 -1
- package/common/grammar.js +24 -59
- package/common/regex.js +17 -20
- package/common/scanner.h +124 -116
- package/package.json +1 -1
- package/sed_ere/src/parser.c +1 -1
- package/src/parser.c +1 -1
- package/tree-sitter.json +1 -1
package/Cargo.toml
CHANGED
package/common/grammar.js
CHANGED
|
@@ -935,6 +935,25 @@ function sedRules(mode) {
|
|
|
935
935
|
};
|
|
936
936
|
}
|
|
937
937
|
|
|
938
|
+
const missingCommandDefinitions = [
|
|
939
|
+
{ reason: "missing_function", atBoundary: true },
|
|
940
|
+
{ reason: "missing_label", atBoundary: true },
|
|
941
|
+
{ reason: "missing_rfile", atBoundary: true },
|
|
942
|
+
{ reason: "missing_wfile", atBoundary: true },
|
|
943
|
+
{ reason: "missing_text_introducer", atBoundary: true },
|
|
944
|
+
{
|
|
945
|
+
reason: "incomplete_text_introducer",
|
|
946
|
+
rule: ($) => $._text_incomplete_introducer,
|
|
947
|
+
},
|
|
948
|
+
{ reason: "missing_text" },
|
|
949
|
+
{ reason: "missing_closing_brace" },
|
|
950
|
+
{ reason: "missing_opening_delimiter", atBoundary: true },
|
|
951
|
+
];
|
|
952
|
+
|
|
953
|
+
const boundaryMissingReasons = missingCommandDefinitions
|
|
954
|
+
.filter(({ atBoundary }) => atBoundary)
|
|
955
|
+
.map(({ reason }) => reason);
|
|
956
|
+
|
|
938
957
|
function missingMarkerNames(mode) {
|
|
939
958
|
return [
|
|
940
959
|
"omitted_address",
|
|
@@ -956,12 +975,7 @@ function missingMarkerNames(mode) {
|
|
|
956
975
|
"missing_opening_delimiter",
|
|
957
976
|
"missing_separator_before_unmatched_brace",
|
|
958
977
|
"missing_separator_after_unmatched_brace",
|
|
959
|
-
|
|
960
|
-
"nonconforming_missing_label",
|
|
961
|
-
"nonconforming_missing_rfile",
|
|
962
|
-
"nonconforming_missing_wfile",
|
|
963
|
-
"nonconforming_missing_text_introducer",
|
|
964
|
-
"nonconforming_missing_opening_delimiter",
|
|
978
|
+
...boundaryMissingReasons.map((reason) => `nonconforming_${reason}`),
|
|
965
979
|
"missing_subexpression_placeholder",
|
|
966
980
|
"incomplete_bracket_list",
|
|
967
981
|
"incomplete_bracket_expression",
|
|
@@ -975,15 +989,6 @@ function issueDefinitions(mode) {
|
|
|
975
989
|
return ($) => $[`_${reason}_marker`];
|
|
976
990
|
}
|
|
977
991
|
|
|
978
|
-
const boundaryMissingReasons = [
|
|
979
|
-
"missing_function",
|
|
980
|
-
"missing_label",
|
|
981
|
-
"missing_rfile",
|
|
982
|
-
"missing_wfile",
|
|
983
|
-
"missing_text_introducer",
|
|
984
|
-
"missing_opening_delimiter",
|
|
985
|
-
];
|
|
986
|
-
|
|
987
992
|
return [
|
|
988
993
|
{
|
|
989
994
|
reason: "malformed_bracket_term",
|
|
@@ -1403,51 +1408,11 @@ function issueDefinitions(mode) {
|
|
|
1403
1408
|
outcome: "nonconforming_syntax",
|
|
1404
1409
|
rule: missing(`nonconforming_${reason}`),
|
|
1405
1410
|
})),
|
|
1406
|
-
{
|
|
1407
|
-
reason
|
|
1408
|
-
outcome: "incomplete_syntax",
|
|
1409
|
-
rule: missing("missing_function"),
|
|
1410
|
-
},
|
|
1411
|
-
{
|
|
1412
|
-
reason: "missing_label",
|
|
1413
|
-
outcome: "incomplete_syntax",
|
|
1414
|
-
rule: missing("missing_label"),
|
|
1415
|
-
},
|
|
1416
|
-
{
|
|
1417
|
-
reason: "missing_rfile",
|
|
1418
|
-
outcome: "incomplete_syntax",
|
|
1419
|
-
rule: missing("missing_rfile"),
|
|
1420
|
-
},
|
|
1421
|
-
{
|
|
1422
|
-
reason: "missing_wfile",
|
|
1423
|
-
outcome: "incomplete_syntax",
|
|
1424
|
-
rule: missing("missing_wfile"),
|
|
1425
|
-
},
|
|
1426
|
-
{
|
|
1427
|
-
reason: "missing_text_introducer",
|
|
1428
|
-
outcome: "incomplete_syntax",
|
|
1429
|
-
rule: missing("missing_text_introducer"),
|
|
1430
|
-
},
|
|
1431
|
-
{
|
|
1432
|
-
reason: "incomplete_text_introducer",
|
|
1433
|
-
outcome: "incomplete_syntax",
|
|
1434
|
-
rule: ($) => $._text_incomplete_introducer,
|
|
1435
|
-
},
|
|
1436
|
-
{
|
|
1437
|
-
reason: "missing_text",
|
|
1438
|
-
outcome: "incomplete_syntax",
|
|
1439
|
-
rule: missing("missing_text"),
|
|
1440
|
-
},
|
|
1441
|
-
{
|
|
1442
|
-
reason: "missing_closing_brace",
|
|
1443
|
-
outcome: "incomplete_syntax",
|
|
1444
|
-
rule: missing("missing_closing_brace"),
|
|
1445
|
-
},
|
|
1446
|
-
{
|
|
1447
|
-
reason: "missing_opening_delimiter",
|
|
1411
|
+
...missingCommandDefinitions.map(({ reason, rule }) => ({
|
|
1412
|
+
reason,
|
|
1448
1413
|
outcome: "incomplete_syntax",
|
|
1449
|
-
rule: missing(
|
|
1450
|
-
},
|
|
1414
|
+
rule: rule ?? missing(reason),
|
|
1415
|
+
})),
|
|
1451
1416
|
{
|
|
1452
1417
|
reason: "missing_subexpression",
|
|
1453
1418
|
outcome: "incomplete_syntax",
|
package/common/regex.js
CHANGED
|
@@ -316,6 +316,20 @@ function regularExpressionEscape($) {
|
|
|
316
316
|
);
|
|
317
317
|
}
|
|
318
318
|
|
|
319
|
+
function oneCharOrCollElem($, ...additional) {
|
|
320
|
+
return choice(
|
|
321
|
+
issueField($, "invalid_regular_expression_character"),
|
|
322
|
+
issueField($, "invalid_encoding"),
|
|
323
|
+
$.ordinary_character,
|
|
324
|
+
regularExpressionEscape($),
|
|
325
|
+
$.sed_newline_escape,
|
|
326
|
+
$.period,
|
|
327
|
+
$._bracket_expression,
|
|
328
|
+
issueField($, "special_delimiter_escape"),
|
|
329
|
+
...additional,
|
|
330
|
+
);
|
|
331
|
+
}
|
|
332
|
+
|
|
319
333
|
function commonRegularExpressionRules() {
|
|
320
334
|
return {
|
|
321
335
|
dup_count: ($) => $._regex_dup_count,
|
|
@@ -432,15 +446,8 @@ function breRules() {
|
|
|
432
446
|
backreference: ($) => $._regex_backreference,
|
|
433
447
|
|
|
434
448
|
one_char_or_coll_elem_bre: ($) =>
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
issueField($, "invalid_encoding"),
|
|
438
|
-
$.ordinary_character,
|
|
439
|
-
regularExpressionEscape($),
|
|
440
|
-
$.sed_newline_escape,
|
|
441
|
-
$.period,
|
|
442
|
-
$._bracket_expression,
|
|
443
|
-
issueField($, "special_delimiter_escape"),
|
|
449
|
+
oneCharOrCollElem(
|
|
450
|
+
$,
|
|
444
451
|
issueField($, "bre_vertical_line_escape"),
|
|
445
452
|
issueField($, "bre_question_mark_escape"),
|
|
446
453
|
issueField($, "bre_plus_escape"),
|
|
@@ -524,17 +531,7 @@ function ereRules() {
|
|
|
524
531
|
field("operator", issueNode($, "leading_duplication_symbol")),
|
|
525
532
|
),
|
|
526
533
|
|
|
527
|
-
one_char_or_coll_elem_ere: ($) =>
|
|
528
|
-
choice(
|
|
529
|
-
issueField($, "invalid_regular_expression_character"),
|
|
530
|
-
issueField($, "invalid_encoding"),
|
|
531
|
-
$.ordinary_character,
|
|
532
|
-
regularExpressionEscape($),
|
|
533
|
-
$.sed_newline_escape,
|
|
534
|
-
$.period,
|
|
535
|
-
$._bracket_expression,
|
|
536
|
-
issueField($, "special_delimiter_escape"),
|
|
537
|
-
),
|
|
534
|
+
one_char_or_coll_elem_ere: ($) => oneCharOrCollElem($),
|
|
538
535
|
|
|
539
536
|
ere_dupl_symbol: ($) =>
|
|
540
537
|
seq(
|
package/common/scanner.h
CHANGED
|
@@ -2339,6 +2339,129 @@ scan_right_brace(TSLexer *lexer, const bool *valid_symbols, TSSymbol *symbol) {
|
|
|
2339
2339
|
return false;
|
|
2340
2340
|
}
|
|
2341
2341
|
|
|
2342
|
+
static bool scan_command_recovery(
|
|
2343
|
+
TSLexer *lexer,
|
|
2344
|
+
const bool *valid_symbols,
|
|
2345
|
+
TSSymbol *symbol
|
|
2346
|
+
) {
|
|
2347
|
+
if (
|
|
2348
|
+
lexer->lookahead ==
|
|
2349
|
+
',' &&
|
|
2350
|
+
emit_marker(lexer, valid_symbols, OMITTED_FIRST_ADDRESS_MARKER, symbol)
|
|
2351
|
+
) {
|
|
2352
|
+
return true;
|
|
2353
|
+
}
|
|
2354
|
+
|
|
2355
|
+
if (
|
|
2356
|
+
(valid_symbols[OMITTED_ADDRESS_MARKER] ||
|
|
2357
|
+
valid_symbols[INCOMPLETE_OMITTED_ADDRESS_MARKER]) &&
|
|
2358
|
+
!can_start_address(lexer) &&
|
|
2359
|
+
!is_blank(lexer->lookahead)
|
|
2360
|
+
) {
|
|
2361
|
+
return emit_marker(
|
|
2362
|
+
lexer,
|
|
2363
|
+
valid_symbols,
|
|
2364
|
+
lexer->eof(lexer) ? INCOMPLETE_OMITTED_ADDRESS_MARKER
|
|
2365
|
+
: OMITTED_ADDRESS_MARKER,
|
|
2366
|
+
symbol
|
|
2367
|
+
);
|
|
2368
|
+
}
|
|
2369
|
+
|
|
2370
|
+
if (is_blank(lexer->lookahead)) {
|
|
2371
|
+
switch (scan_post_blank_recovery(lexer, valid_symbols, symbol)) {
|
|
2372
|
+
case POST_BLANK_RECOVERY_TOKEN:
|
|
2373
|
+
return true;
|
|
2374
|
+
case POST_BLANK_RECOVERY_FAILED:
|
|
2375
|
+
return scan_unexpected_command_text(lexer, valid_symbols, symbol, true);
|
|
2376
|
+
case POST_BLANK_RECOVERY_SKIPPED:
|
|
2377
|
+
break;
|
|
2378
|
+
}
|
|
2379
|
+
}
|
|
2380
|
+
|
|
2381
|
+
if (
|
|
2382
|
+
!at_command_boundary(lexer) &&
|
|
2383
|
+
!is_blank(lexer->lookahead) &&
|
|
2384
|
+
emit_marker(lexer, valid_symbols, OMITTED_FILE_SEPARATOR_MARKER, symbol)
|
|
2385
|
+
) {
|
|
2386
|
+
return true;
|
|
2387
|
+
}
|
|
2388
|
+
|
|
2389
|
+
if (at_command_boundary(lexer)) {
|
|
2390
|
+
static const TSSymbol boundary_markers[][2] = {
|
|
2391
|
+
{MISSING_FUNCTION_MARKER, NONCONFORMING_MISSING_FUNCTION_MARKER},
|
|
2392
|
+
{MISSING_LABEL_MARKER, NONCONFORMING_MISSING_LABEL_MARKER},
|
|
2393
|
+
{MISSING_RFILE_MARKER, NONCONFORMING_MISSING_RFILE_MARKER},
|
|
2394
|
+
{MISSING_WFILE_MARKER, NONCONFORMING_MISSING_WFILE_MARKER},
|
|
2395
|
+
};
|
|
2396
|
+
const unsigned variant = lexer->eof(lexer) ? 0 : 1;
|
|
2397
|
+
for (
|
|
2398
|
+
unsigned index = 0;
|
|
2399
|
+
index < sizeof(boundary_markers) / sizeof(boundary_markers[0]);
|
|
2400
|
+
index++
|
|
2401
|
+
) {
|
|
2402
|
+
if (
|
|
2403
|
+
emit_marker(
|
|
2404
|
+
lexer,
|
|
2405
|
+
valid_symbols,
|
|
2406
|
+
boundary_markers[index][variant],
|
|
2407
|
+
symbol
|
|
2408
|
+
)
|
|
2409
|
+
) {
|
|
2410
|
+
return true;
|
|
2411
|
+
}
|
|
2412
|
+
}
|
|
2413
|
+
}
|
|
2414
|
+
|
|
2415
|
+
if (
|
|
2416
|
+
emit_marker(
|
|
2417
|
+
lexer,
|
|
2418
|
+
valid_symbols,
|
|
2419
|
+
missing_text_introducer_symbol(lexer),
|
|
2420
|
+
symbol
|
|
2421
|
+
)
|
|
2422
|
+
) {
|
|
2423
|
+
return true;
|
|
2424
|
+
}
|
|
2425
|
+
|
|
2426
|
+
if (
|
|
2427
|
+
lexer->eof(lexer) &&
|
|
2428
|
+
emit_marker(lexer, valid_symbols, MISSING_CLOSING_BRACE_MARKER, symbol)
|
|
2429
|
+
) {
|
|
2430
|
+
return true;
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
if (
|
|
2434
|
+
!at_command_boundary(lexer) &&
|
|
2435
|
+
!is_blank(lexer->lookahead) &&
|
|
2436
|
+
emit_marker(
|
|
2437
|
+
lexer,
|
|
2438
|
+
valid_symbols,
|
|
2439
|
+
MISSING_SEPARATOR_AFTER_UNMATCHED_BRACE_MARKER,
|
|
2440
|
+
symbol
|
|
2441
|
+
)
|
|
2442
|
+
) {
|
|
2443
|
+
return true;
|
|
2444
|
+
}
|
|
2445
|
+
|
|
2446
|
+
const TSSymbol separator_marker =
|
|
2447
|
+
missing_command_separator_marker(lexer, valid_symbols);
|
|
2448
|
+
if (separator_marker != ERROR_SENTINEL) {
|
|
2449
|
+
return emit_marker(lexer, valid_symbols, separator_marker, symbol);
|
|
2450
|
+
}
|
|
2451
|
+
|
|
2452
|
+
const TSSymbol missing_opening_delimiter = lexer->eof(lexer)
|
|
2453
|
+
? MISSING_OPENING_DELIMITER_MARKER
|
|
2454
|
+
: NONCONFORMING_MISSING_OPENING_DELIMITER_MARKER;
|
|
2455
|
+
if (
|
|
2456
|
+
delimiter_is_missing(lexer) &&
|
|
2457
|
+
emit_marker(lexer, valid_symbols, missing_opening_delimiter, symbol)
|
|
2458
|
+
) {
|
|
2459
|
+
return true;
|
|
2460
|
+
}
|
|
2461
|
+
|
|
2462
|
+
return scan_unexpected_command_text(lexer, valid_symbols, symbol, false);
|
|
2463
|
+
}
|
|
2464
|
+
|
|
2342
2465
|
static bool scan_command_token(
|
|
2343
2466
|
TSLexer *lexer,
|
|
2344
2467
|
ScannerState *state,
|
|
@@ -2512,122 +2635,7 @@ static bool scan_command_token(
|
|
|
2512
2635
|
return scan_right_brace(lexer, valid_symbols, symbol);
|
|
2513
2636
|
}
|
|
2514
2637
|
|
|
2515
|
-
|
|
2516
|
-
lexer->lookahead ==
|
|
2517
|
-
',' &&
|
|
2518
|
-
emit_marker(lexer, valid_symbols, OMITTED_FIRST_ADDRESS_MARKER, symbol)
|
|
2519
|
-
) {
|
|
2520
|
-
return true;
|
|
2521
|
-
}
|
|
2522
|
-
|
|
2523
|
-
if (
|
|
2524
|
-
(valid_symbols[OMITTED_ADDRESS_MARKER] ||
|
|
2525
|
-
valid_symbols[INCOMPLETE_OMITTED_ADDRESS_MARKER]) &&
|
|
2526
|
-
!can_start_address(lexer) &&
|
|
2527
|
-
!is_blank(lexer->lookahead)
|
|
2528
|
-
) {
|
|
2529
|
-
return emit_marker(
|
|
2530
|
-
lexer,
|
|
2531
|
-
valid_symbols,
|
|
2532
|
-
lexer->eof(lexer) ? INCOMPLETE_OMITTED_ADDRESS_MARKER
|
|
2533
|
-
: OMITTED_ADDRESS_MARKER,
|
|
2534
|
-
symbol
|
|
2535
|
-
);
|
|
2536
|
-
}
|
|
2537
|
-
|
|
2538
|
-
if (is_blank(lexer->lookahead)) {
|
|
2539
|
-
switch (scan_post_blank_recovery(lexer, valid_symbols, symbol)) {
|
|
2540
|
-
case POST_BLANK_RECOVERY_TOKEN:
|
|
2541
|
-
return true;
|
|
2542
|
-
case POST_BLANK_RECOVERY_FAILED:
|
|
2543
|
-
return scan_unexpected_command_text(lexer, valid_symbols, symbol, true);
|
|
2544
|
-
case POST_BLANK_RECOVERY_SKIPPED:
|
|
2545
|
-
break;
|
|
2546
|
-
}
|
|
2547
|
-
}
|
|
2548
|
-
|
|
2549
|
-
if (
|
|
2550
|
-
!at_command_boundary(lexer) &&
|
|
2551
|
-
!is_blank(lexer->lookahead) &&
|
|
2552
|
-
emit_marker(lexer, valid_symbols, OMITTED_FILE_SEPARATOR_MARKER, symbol)
|
|
2553
|
-
) {
|
|
2554
|
-
return true;
|
|
2555
|
-
}
|
|
2556
|
-
|
|
2557
|
-
if (at_command_boundary(lexer)) {
|
|
2558
|
-
static const TSSymbol boundary_markers[][2] = {
|
|
2559
|
-
{MISSING_FUNCTION_MARKER, NONCONFORMING_MISSING_FUNCTION_MARKER},
|
|
2560
|
-
{MISSING_LABEL_MARKER, NONCONFORMING_MISSING_LABEL_MARKER},
|
|
2561
|
-
{MISSING_RFILE_MARKER, NONCONFORMING_MISSING_RFILE_MARKER},
|
|
2562
|
-
{MISSING_WFILE_MARKER, NONCONFORMING_MISSING_WFILE_MARKER},
|
|
2563
|
-
};
|
|
2564
|
-
const unsigned variant = lexer->eof(lexer) ? 0 : 1;
|
|
2565
|
-
for (
|
|
2566
|
-
unsigned index = 0;
|
|
2567
|
-
index < sizeof(boundary_markers) / sizeof(boundary_markers[0]);
|
|
2568
|
-
index++
|
|
2569
|
-
) {
|
|
2570
|
-
if (
|
|
2571
|
-
emit_marker(
|
|
2572
|
-
lexer,
|
|
2573
|
-
valid_symbols,
|
|
2574
|
-
boundary_markers[index][variant],
|
|
2575
|
-
symbol
|
|
2576
|
-
)
|
|
2577
|
-
) {
|
|
2578
|
-
return true;
|
|
2579
|
-
}
|
|
2580
|
-
}
|
|
2581
|
-
}
|
|
2582
|
-
|
|
2583
|
-
if (
|
|
2584
|
-
emit_marker(
|
|
2585
|
-
lexer,
|
|
2586
|
-
valid_symbols,
|
|
2587
|
-
missing_text_introducer_symbol(lexer),
|
|
2588
|
-
symbol
|
|
2589
|
-
)
|
|
2590
|
-
) {
|
|
2591
|
-
return true;
|
|
2592
|
-
}
|
|
2593
|
-
|
|
2594
|
-
if (
|
|
2595
|
-
lexer->eof(lexer) &&
|
|
2596
|
-
emit_marker(lexer, valid_symbols, MISSING_CLOSING_BRACE_MARKER, symbol)
|
|
2597
|
-
) {
|
|
2598
|
-
return true;
|
|
2599
|
-
}
|
|
2600
|
-
|
|
2601
|
-
if (
|
|
2602
|
-
!at_command_boundary(lexer) &&
|
|
2603
|
-
!is_blank(lexer->lookahead) &&
|
|
2604
|
-
emit_marker(
|
|
2605
|
-
lexer,
|
|
2606
|
-
valid_symbols,
|
|
2607
|
-
MISSING_SEPARATOR_AFTER_UNMATCHED_BRACE_MARKER,
|
|
2608
|
-
symbol
|
|
2609
|
-
)
|
|
2610
|
-
) {
|
|
2611
|
-
return true;
|
|
2612
|
-
}
|
|
2613
|
-
|
|
2614
|
-
const TSSymbol separator_marker =
|
|
2615
|
-
missing_command_separator_marker(lexer, valid_symbols);
|
|
2616
|
-
if (separator_marker != ERROR_SENTINEL) {
|
|
2617
|
-
return emit_marker(lexer, valid_symbols, separator_marker, symbol);
|
|
2618
|
-
}
|
|
2619
|
-
|
|
2620
|
-
const TSSymbol missing_opening_delimiter = lexer->eof(lexer)
|
|
2621
|
-
? MISSING_OPENING_DELIMITER_MARKER
|
|
2622
|
-
: NONCONFORMING_MISSING_OPENING_DELIMITER_MARKER;
|
|
2623
|
-
if (
|
|
2624
|
-
delimiter_is_missing(lexer) &&
|
|
2625
|
-
emit_marker(lexer, valid_symbols, missing_opening_delimiter, symbol)
|
|
2626
|
-
) {
|
|
2627
|
-
return true;
|
|
2628
|
-
}
|
|
2629
|
-
|
|
2630
|
-
return scan_unexpected_command_text(lexer, valid_symbols, symbol, false);
|
|
2638
|
+
return scan_command_recovery(lexer, valid_symbols, symbol);
|
|
2631
2639
|
}
|
|
2632
2640
|
|
|
2633
2641
|
static bool sed_scanner_scan_impl(
|
package/package.json
CHANGED
package/sed_ere/src/parser.c
CHANGED
|
@@ -56370,7 +56370,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sed_ere(void) {
|
|
|
56370
56370
|
.max_reserved_word_set_size = 0,
|
|
56371
56371
|
.metadata = {
|
|
56372
56372
|
.major_version = 0,
|
|
56373
|
-
.minor_version =
|
|
56373
|
+
.minor_version = 14,
|
|
56374
56374
|
.patch_version = 0,
|
|
56375
56375
|
},
|
|
56376
56376
|
};
|
package/src/parser.c
CHANGED
|
@@ -59264,7 +59264,7 @@ TS_PUBLIC const TSLanguage *tree_sitter_sed(void) {
|
|
|
59264
59264
|
.max_reserved_word_set_size = 0,
|
|
59265
59265
|
.metadata = {
|
|
59266
59266
|
.major_version = 0,
|
|
59267
|
-
.minor_version =
|
|
59267
|
+
.minor_version = 14,
|
|
59268
59268
|
.patch_version = 0,
|
|
59269
59269
|
},
|
|
59270
59270
|
};
|