@@ -80,6 +80,9 @@ extension AST {
8080
8181 // (?i), (?i-m), ...
8282 case changeMatchingOptions( MatchingOptionSequence )
83+
84+ // An invalid atom created by a parse error.
85+ case invalid
8386 }
8487 }
8588}
@@ -104,6 +107,7 @@ extension AST.Atom {
104107 case . any: return nil
105108 case . startOfLine: return nil
106109 case . endOfLine: return nil
110+ case . invalid: return nil
107111 }
108112 }
109113
@@ -113,6 +117,18 @@ extension AST.Atom {
113117}
114118
115119extension AST . Atom {
120+ public struct Number : Hashable {
121+ /// The value, which may be `nil` in an invalid AST, e.g the parser expected
122+ /// a number at a given location, or the parsed number overflowed.
123+ public var value : Int ?
124+ public var location : SourceLocation
125+
126+ public init ( _ value: Int ? , at location: SourceLocation ) {
127+ self . value = value
128+ self . location = location
129+ }
130+ }
131+
116132 public struct Scalar : Hashable {
117133 public var value : UnicodeScalar
118134 public var location : SourceLocation
@@ -453,6 +469,9 @@ extension AST.Atom.CharacterProperty {
453469 /// Some special properties implemented by Java.
454470 case javaSpecial( JavaSpecial )
455471
472+ /// An invalid property that has been diagnosed by the parser.
473+ case invalid( key: String ? , value: String )
474+
456475 public enum MapKind : Hashable {
457476 case lowercase
458477 case uppercase
@@ -558,7 +577,7 @@ extension AST.Atom {
558577 /// A PCRE callout written `(?C...)`
559578 public struct PCRE : Hashable {
560579 public enum Argument : Hashable {
561- case number( Int )
580+ case number( AST . Atom . Number )
562581 case string( String )
563582 }
564583 public var arg : AST . Located < Argument >
@@ -789,7 +808,7 @@ extension AST.Atom {
789808
790809 case . scalarSequence, . property, . any, . startOfLine, . endOfLine,
791810 . backreference, . subpattern, . callout, . backtrackingDirective,
792- . changeMatchingOptions:
811+ . changeMatchingOptions, . invalid :
793812 return nil
794813 }
795814 }
@@ -803,6 +822,10 @@ extension AST.Atom {
803822 // \cx, \C-x, \M-x, \M-\C-x, \N{...}
804823 case . keyboardControl, . keyboardMeta, . keyboardMetaControl, . namedCharacter:
805824 return true
825+ case . scalarSequence:
826+ // Unsupported for now (and we will diagnose as such), but treat it as a
827+ // valid range operand for better recovery.
828+ return true
806829 default :
807830 return false
808831 }
@@ -837,7 +860,7 @@ extension AST.Atom {
837860
838861 case . property, . escaped, . any, . startOfLine, . endOfLine,
839862 . backreference, . subpattern, . namedCharacter, . callout,
840- . backtrackingDirective, . changeMatchingOptions:
863+ . backtrackingDirective, . changeMatchingOptions, . invalid :
841864 return nil
842865 }
843866 }
0 commit comments