@@ -435,7 +435,7 @@ extension Source {
435
435
return false
436
436
} . value
437
437
guard !result. isEmpty else {
438
- throw ParseError . misc ( " Expected non-empty contents " )
438
+ throw ParseError . expectedNonEmptyContents
439
439
}
440
440
return result
441
441
}
@@ -840,20 +840,25 @@ extension Source {
840
840
}
841
841
}
842
842
843
+ /// Eat a named reference up to a given closing delimiter.
844
+ private mutating func expectNamedReference(
845
+ endingWith end: String
846
+ ) throws -> Reference {
847
+ . named( try expectQuoted ( endingWith: end) . value)
848
+ }
849
+
843
850
/// Try to lex a numbered reference, or otherwise a named reference.
844
851
///
845
852
/// NameOrNumberRef -> NumberRef | <String>
846
853
///
847
854
private mutating func expectNamedOrNumberedReference(
848
855
endingWith ending: String
849
- ) throws -> Located < Reference > {
850
- try recordLoc { src in
851
- if let numbered = try src. lexNumberedReference ( ) {
852
- try src. expect ( sequence: ending)
853
- return numbered. value
854
- }
855
- return . named( try src. lexUntil ( eating: ending) . value)
856
+ ) throws -> Reference {
857
+ if let numbered = try lexNumberedReference ( ) {
858
+ try expect ( sequence: ending)
859
+ return numbered. value
856
860
}
861
+ return try expectNamedReference ( endingWith: ending)
857
862
}
858
863
859
864
private static func getClosingDelimiter(
@@ -886,15 +891,14 @@ extension Source {
886
891
if src. tryEat ( " g " ) {
887
892
// PCRE-style backreferences.
888
893
if src. tryEat ( " { " ) {
889
- let ref = try src. expectNamedOrNumberedReference (
890
- endingWith: " } " ) . value
894
+ let ref = try src. expectNamedOrNumberedReference ( endingWith: " } " )
891
895
return . backreference( ref)
892
896
}
893
897
894
898
// Oniguruma-style subpatterns.
895
899
if let openChar = src. tryEat ( anyOf: " < " , " ' " ) {
896
900
let ref = try src. expectNamedOrNumberedReference (
897
- endingWith: String ( Source . getClosingDelimiter ( for: openChar) ) ) . value
901
+ endingWith: String ( Source . getClosingDelimiter ( for: openChar) ) )
898
902
return . subpattern( ref)
899
903
}
900
904
@@ -911,9 +915,9 @@ extension Source {
911
915
if src. tryEat ( " k " ) {
912
916
// Perl/.NET-style backreferences.
913
917
if let openChar = src. tryEat ( anyOf: " < " , " ' " , " { " ) {
914
- let closingChar = Source . getClosingDelimiter ( for: openChar)
915
- return . backreference( . named (
916
- try src. lexUntil ( eating : closingChar ) . value ) )
918
+ let closing = String ( Source . getClosingDelimiter ( for: openChar) )
919
+ return . backreference(
920
+ try src. expectNamedReference ( endingWith : closing ) )
917
921
}
918
922
// Fallback to a literal character. We need to return here as we've
919
923
// already eaten the 'k'.
0 commit comments