Skip to content

Commit e46ee1e

Browse files
authored
Merge pull request #108 from hamishknight/all-the-patter
2 parents e9ccfdc + eb0f44f commit e46ee1e

File tree

7 files changed

+353
-180
lines changed

7 files changed

+353
-180
lines changed

Sources/_MatchingEngine/Regex/AST/Atom.swift

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -382,34 +382,43 @@ extension AST.Atom.CharacterProperty {
382382
}
383383
}
384384

385+
extension AST.Atom {
386+
public struct Reference: Hashable {
387+
@frozen
388+
public enum Kind: Hashable {
389+
// \n \gn \g{n} \g<n> \g'n' (?n) (?(n)...
390+
// Oniguruma: \k<n>, \k'n'
391+
case absolute(Int)
392+
393+
// \g{-n} \g<+n> \g'+n' \g<-n> \g'-n' (?+n) (?-n)
394+
// (?(+n)... (?(-n)...
395+
// Oniguruma: \k<-n> \k<+n> \k'-n' \k'+n'
396+
case relative(Int)
397+
398+
// \k<name> \k'name' \g{name} \k{name} (?P=name)
399+
// \g<name> \g'name' (?&name) (?P>name)
400+
// (?(<name>)... (?('name')... (?(name)...
401+
case named(String)
402+
403+
/// (?R), (?(R)..., which are equivalent to (?0), (?(0)...
404+
static var recurseWholePattern: Kind { .absolute(0) }
405+
}
406+
public var kind: Kind
385407

386-
// TODO: I haven't thought through this a bunch; this seems like
387-
// a sensible type to have and break down this way. But it could
388-
// easily get folded in with the kind of reference
389-
@frozen
390-
public enum Reference: Hashable {
391-
// \n \gn \g{n} \g<n> \g'n' (?n) (?(n)...
392-
// Oniguruma: \k<n>, \k'n'
393-
case absolute(Int)
394-
395-
// \g{-n} \g<+n> \g'+n' \g<-n> \g'-n' (?+n) (?-n)
396-
// (?(+n)... (?(-n)...
397-
// Oniguruma: \k<-n> \k<+n> \k'-n' \k'+n'
398-
case relative(Int)
399-
400-
// \k<name> \k'name' \g{name} \k{name} (?P=name)
401-
// \g<name> \g'name' (?&name) (?P>name)
402-
// (?(<name>)... (?('name')... (?(name)...
403-
case named(String)
404-
405-
// TODO: I'm not sure the below goes here
406-
//
407-
// ?(R) (?(R)...
408-
case recurseWholePattern
409-
}
410-
408+
/// The location of the inner numeric or textual reference, e.g the location
409+
/// of '-2' in '\g{-2}'.
410+
public var innerLoc: SourceLocation
411411

412+
public init(_ kind: Kind, innerLoc: SourceLocation) {
413+
self.kind = kind
414+
self.innerLoc = innerLoc
415+
}
412416

417+
/// Whether this is a reference that recurses the whole pattern, rather than
418+
/// a group.
419+
public var recursesWholePattern: Bool { kind == .recurseWholePattern }
420+
}
421+
}
413422

414423
extension AST.Atom {
415424
/// Anchors and other built-in zero-width assertions

Sources/_MatchingEngine/Regex/Parse/Diagnostics.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,13 @@ enum ParseError: Error, Hashable {
3030

3131
case expectedASCII(Character)
3232

33+
case expectedNonEmptyContents
34+
35+
case unknownGroupKind(String)
36+
37+
case invalidMatchingOption(Character)
38+
case cannotRemoveMatchingOptionsAfterCaret
39+
3340
case expectedCustomCharacterClassMembers
3441
case invalidCharacterClassRangeOperand
3542

@@ -61,6 +68,14 @@ extension ParseError: CustomStringConvertible {
6168
return "unexpected end of input"
6269
case let .misc(s):
6370
return s
71+
case .expectedNonEmptyContents:
72+
return "expected non-empty contents"
73+
case let .unknownGroupKind(str):
74+
return "unknown group kind '(\(str)'"
75+
case let .invalidMatchingOption(c):
76+
return "invalid matching option '\(c)'"
77+
case .cannotRemoveMatchingOptionsAfterCaret:
78+
return "cannot remove matching options with '^' specifier"
6479
case let .expectedASCII(c):
6580
return "expected ASCII for '\(c)'"
6681
case .expectedCustomCharacterClassMembers:

0 commit comments

Comments
 (0)