@@ -44,7 +44,7 @@ extension MEProgram where Input.Element: Hashable {
4444 // Symbolic reference resolution
4545 var unresolvedReferences : [ ReferenceID : [ InstructionAddress ] ] = [ : ]
4646 var referencedCaptureOffsets : [ ReferenceID : Int ] = [ : ]
47- var namedCaptureOffsets : [ String : Int ] = [ : ]
47+
4848 var captureCount : Int {
4949 // We currently deduce the capture count from the capture register number.
5050 nextCaptureRegister. rawValue
@@ -284,6 +284,13 @@ extension MEProgram.Builder {
284284 unresolvedReferences [ id, default: [ ] ] . append ( lastInstructionAddress)
285285 }
286286
287+ mutating func buildNamedReference( _ name: String ) throws {
288+ guard let index = captureList. indexOfCapture ( named: name) else {
289+ throw RegexCompilationError . uncapturedReference
290+ }
291+ buildBackreference ( . init( index) )
292+ }
293+
287294 // TODO: Mutating because of fail address fixup, drop when
288295 // that's removed
289296 mutating func assemble( ) throws -> MEProgram {
@@ -359,7 +366,6 @@ extension MEProgram.Builder {
359366 registerInfo: regInfo,
360367 captureList: captureList,
361368 referencedCaptureOffsets: referencedCaptureOffsets,
362- namedCaptureOffsets: namedCaptureOffsets,
363369 initialOptions: initialOptions)
364370 }
365371
@@ -456,9 +462,10 @@ extension MEProgram.Builder {
456462 assert ( preexistingValue == nil )
457463 }
458464 if let name = name {
459- // TODO: Reject duplicate capture names unless `(?J)`?
460- namedCaptureOffsets . updateValue ( captureCount , forKey : name )
465+ let index = captureList . indexOfCapture ( named : name )
466+ assert ( index == nextCaptureRegister . rawValue )
461467 }
468+ assert ( nextCaptureRegister. rawValue < captureList. captures. count)
462469 return nextCaptureRegister
463470 }
464471
0 commit comments