Skip to content

Commit 2325cef

Browse files
committed
Add support for rx'...' for experimental syntax
1 parent 61450e8 commit 2325cef

File tree

2 files changed

+11
-3
lines changed

2 files changed

+11
-3
lines changed

Sources/_MatchingEngine/Regex/Parse/DelimiterLexing.swift

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,14 @@ enum Delimiter: Hashable, CaseIterable {
1515
case traditional
1616
case experimental
1717
case reSingleQuote
18+
case rxSingleQuote
1819

1920
var openingAndClosing: (opening: String, closing: String) {
2021
switch self {
2122
case .traditional: return ("#/", "/#")
2223
case .experimental: return ("#|", "|#")
2324
case .reSingleQuote: return ("re'", "'")
25+
case .rxSingleQuote: return ("rx'", "'")
2426
}
2527
}
2628
var opening: String { openingAndClosing.opening }
@@ -31,7 +33,7 @@ enum Delimiter: Hashable, CaseIterable {
3133
switch self {
3234
case .traditional, .reSingleQuote:
3335
return .traditional
34-
case .experimental:
36+
case .experimental, .rxSingleQuote:
3537
return .experimental
3638
}
3739
}
@@ -134,11 +136,11 @@ fileprivate struct DelimiterLexer {
134136
/// Attempt to skip over a closing delimiter character that is unlikely to be
135137
/// the actual closing delimiter.
136138
mutating func trySkipDelimiter(_ delimiter: Delimiter) {
137-
// Only the closing `'` for re'...' can potentially be skipped over.
139+
// Only the closing `'` for re'...'/rx'...' can potentially be skipped over.
138140
switch delimiter {
139141
case .traditional, .experimental:
140142
return
141-
case .reSingleQuote:
143+
case .reSingleQuote, .rxSingleQuote:
142144
break
143145
}
144146
guard load() == ascii("'") else { return }

Tests/RegexTests/ParseTests.swift

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,9 @@ extension RegexTests {
14971497
parseWithDelimitersTest("#/a b/#", concat("a", " ", "b"))
14981498
parseWithDelimitersTest("#|a b|#", concat("a", "b"))
14991499

1500+
parseWithDelimitersTest("re'a b'", concat("a", " ", "b"))
1501+
parseWithDelimitersTest("rx'a b'", concat("a", "b"))
1502+
15001503
parseWithDelimitersTest("#|[a b]|#", charClass("a", "b"))
15011504
parseWithDelimitersTest(
15021505
"#|(?-x)[a b]|#", changeMatchingOptions(
@@ -1537,6 +1540,9 @@ extension RegexTests {
15371540
#"re'(?'a_bcA0-c1A'x*)'"#,
15381541
balancedCapture(name: "a_bcA0", priorName: "c1A", zeroOrMore(of: "x")))
15391542

1543+
parseWithDelimitersTest(
1544+
#"rx' (?'a_bcA0' a b)'"#, concat(namedCapture("a_bcA0", concat("a", "b"))))
1545+
15401546
parseWithDelimitersTest(
15411547
#"re'(?('a_bcA0')x|y)'"#, conditional(
15421548
.groupMatched(ref("a_bcA0")), trueBranch: "x", falseBranch: "y"))

0 commit comments

Comments
 (0)