@@ -253,18 +253,18 @@ extension Source {
253253 ///
254254 /// Throws on overflow
255255 ///
256- private mutating func lexNumber< Num : FixedWidthInteger > (
257- _ ty : Num . Type , _ kind: RadixKind
258- ) throws -> Located < Num > ? {
256+ private mutating func lexNumber(
257+ _ kind: RadixKind
258+ ) throws -> AST . Atom . Number ? {
259259 try recordLoc { src in
260- guard let str = src. tryEatPrefix ( kind. characterFilter) ? . string else {
260+ guard let str = src. tryEatLocatedPrefix ( kind. characterFilter) else {
261261 return nil
262262 }
263- guard let i = Num ( str, radix: kind. radix) else {
264- throw ParseError . numberOverflow ( str)
263+ guard let i = Int ( str. value , radix: kind. radix) else {
264+ throw ParseError . numberOverflow ( str. value )
265265 }
266- return i
267- }
266+ return . init ( i , at : str . location )
267+ } . value
268268 }
269269
270270 /// Try to eat a number off the front.
@@ -273,11 +273,11 @@ extension Source {
273273 ///
274274 /// Throws on overflow
275275 ///
276- mutating func lexNumber( ) throws -> Located < Int > ? {
277- try lexNumber ( Int . self , . decimal)
276+ mutating func lexNumber( ) throws -> AST . Atom . Number ? {
277+ try lexNumber ( . decimal)
278278 }
279279
280- mutating func expectNumber( ) throws -> Located < Int > {
280+ mutating func expectNumber( ) throws -> AST . Atom . Number {
281281 guard let num = try lexNumber ( ) else {
282282 throw ParseError . expectedNumber ( " " , kind: . decimal)
283283 }
@@ -488,9 +488,10 @@ extension Source {
488488
489489 if let t = src. lexWhitespace ( ) { trivia. append ( t) }
490490
491- let upperOpt = try src. lexNumber ( ) ? . map { upper in
491+ var upperOpt = try src. lexNumber ( )
492+ if closedRange == false {
492493 // If we have an open range, the upper bound should be adjusted down.
493- closedRange == true ? upper : upper - 1
494+ upperOpt ? . value ? -= 1
494495 }
495496
496497 if let t = src. lexWhitespace ( ) { trivia. append ( t) }
@@ -1066,10 +1067,11 @@ extension Source {
10661067 ///
10671068 private mutating func expectPCREVersionNumber(
10681069 ) throws -> AST . Conditional . Condition . PCREVersionNumber {
1069- let nums = try recordLoc { src -> ( major: Int , minor: Int ) in
1070- let major = try src. expectNumber ( ) . value
1070+ let nums = try recordLoc { src -> ( major: AST . Atom . Number ,
1071+ minor: AST . Atom . Number ) in
1072+ let major = try src. expectNumber ( )
10711073 try src. expect ( " . " )
1072- let minor = try src. expectNumber ( ) . value
1074+ let minor = try src. expectNumber ( )
10731075 return ( major, minor)
10741076 }
10751077 return . init( major: nums. value. major, minor: nums. value. minor,
@@ -1119,7 +1121,7 @@ extension Source {
11191121 }
11201122 if let num = try src. lexNumber ( ) {
11211123 return . groupRecursionCheck(
1122- . init( . absolute( num. value ) , innerLoc: num. location) )
1124+ . init( . absolute( num) , innerLoc: num. location) )
11231125 }
11241126 return . recursionCheck
11251127 }
@@ -1406,20 +1408,21 @@ extension Source {
14061408 let kind = try recordLoc { src -> AST . Reference . Kind ? in
14071409 try src. tryEating { src in
14081410 // Note this logic should match canLexNumberedReference.
1409- if src. tryEat ( " + " ) , let num = try src. lexNumber ( ) {
1410- return . relative( num. value)
1411+ if let plus = src. tryEatWithLoc ( " + " ) , let num = try src. lexNumber ( ) {
1412+ return . relative( . init ( num. value, at : num . location . union ( with : plus ) ) )
14111413 }
1412- if src. tryEat ( " - " ) , let num = try src. lexNumber ( ) {
1413- return . relative( - num. value)
1414+ if let minus = src. tryEatWithLoc ( " - " ) , let num = try src. lexNumber ( ) {
1415+ let val = num. value. map { x in - x }
1416+ return . relative( . init( val, at: num. location. union ( with: minus) ) )
14141417 }
14151418 if let num = try src. lexNumber ( ) {
1416- return . absolute( num. value )
1419+ return . absolute( num)
14171420 }
14181421 return nil
14191422 }
14201423 }
14211424 guard let kind = kind else { return nil }
1422- guard allowWholePatternRef || kind. value != . recurseWholePattern else {
1425+ guard allowWholePatternRef || ! kind. value. recursesWholePattern else {
14231426 throw ParseError . cannotReferToWholePattern
14241427 }
14251428 let recLevel = allowRecursionLevel ? try lexRecursionLevel ( ) : nil
@@ -1432,12 +1435,14 @@ extension Source {
14321435 /// RecursionLevel -> '+' <Int> | '-' <Int>
14331436 ///
14341437 private mutating func lexRecursionLevel(
1435- ) throws -> Located < Int > ? {
1436- try recordLoc { src in
1438+ ) throws -> AST . Atom . Number ? {
1439+ let value = try recordLoc { src -> Int ? in
14371440 if src. tryEat ( " + " ) { return try src. expectNumber ( ) . value }
1438- if src. tryEat ( " - " ) { return try - src. expectNumber ( ) . value }
1441+ if src. tryEat ( " - " ) { return try src. expectNumber ( ) . value. map { x in - x } }
14391442 return nil
14401443 }
1444+ guard let value = value else { return nil }
1445+ return . init( value. value, at: value. location)
14411446 }
14421447
14431448 /// Checks whether a numbered reference can be lexed.
@@ -1579,9 +1584,8 @@ extension Source {
15791584 }
15801585
15811586 // Backslash followed by a non-0 digit character is a backreference.
1582- if firstChar != " 0 " , let numAndLoc = try src. lexNumber ( ) {
1583- return . backreference( . init(
1584- . absolute( numAndLoc. value) , innerLoc: numAndLoc. location) )
1587+ if firstChar != " 0 " , let num = try src. lexNumber ( ) {
1588+ return . backreference( . init( . absolute( num) , innerLoc: num. location) )
15851589 }
15861590 return nil
15871591 }
@@ -1621,7 +1625,7 @@ extension Source {
16211625 // Whole-pattern recursion, which is equivalent to (?0).
16221626 if let loc = src. tryEatWithLoc ( " R " ) {
16231627 try src. expect ( " ) " )
1624- return . subpattern( . init( . recurseWholePattern, innerLoc: loc) )
1628+ return . subpattern( . init( . recurseWholePattern( loc ) , innerLoc: loc) )
16251629 }
16261630
16271631 // Numbered subpattern reference.
@@ -1772,11 +1776,12 @@ extension Source {
17721776 let arg = try recordLoc { src -> AST . Atom . Callout . PCRE . Argument in
17731777 // Parse '(?C' followed by a number.
17741778 if let num = try src. lexNumber ( ) {
1775- return . number( num. value )
1779+ return . number( num)
17761780 }
17771781 // '(?C)' is implicitly '(?C0)'.
17781782 if src. peek ( ) == " ) " {
1779- return . number( 0 )
1783+ let pos = src. currentPosition
1784+ return . number( . init( 0 , at: SourceLocation ( pos ..< pos) ) )
17801785 }
17811786 // Parse '(C?' followed by a set of balanced delimiters as defined by
17821787 // http://pcre.org/current/doc/html/pcre2pattern.html#SEC28
0 commit comments