Started implementing backreferences (octal values should now be prefaced with \0)
This commit is contained in:
11
regex/nfa.go
11
regex/nfa.go
@@ -45,8 +45,10 @@ type nfaState struct {
|
||||
groupEnd bool // Whether or not the node ends a capturing group
|
||||
groupNum int // Which capturing group the node starts / ends
|
||||
// The following properties depend on the current match - I should think about resetting them for every match.
|
||||
zeroMatchFound bool // Whether or not the state has been used for a zero-length match - only relevant for zero states
|
||||
threadGroups []Group // Assuming that a state is part of a 'thread' in the matching process, this array stores the indices of capturing groups in the current thread. As matches are found for this state, its groups will be copied over.
|
||||
threadGroups []Group // Assuming that a state is part of a 'thread' in the matching process, this array stores the indices of capturing groups in the current thread. As matches are found for this state, its groups will be copied over.
|
||||
isBackreference bool // Whether or not current node is backreference
|
||||
referredGroup int // If current node is a backreference, the node that it points to
|
||||
threadBackref int // If current node is a backreference, how many characters to look forward into the referred group
|
||||
}
|
||||
|
||||
// Clones the NFA starting from the given state.
|
||||
@@ -76,7 +78,6 @@ func cloneStateHelper(stateToClone *nfaState, cloneMap map[*nfaState]*nfaState)
|
||||
isQuestion: stateToClone.isQuestion,
|
||||
isAlternation: stateToClone.isAlternation,
|
||||
assert: stateToClone.assert,
|
||||
zeroMatchFound: stateToClone.zeroMatchFound,
|
||||
allChars: stateToClone.allChars,
|
||||
except: append([]rune{}, stateToClone.except...),
|
||||
lookaroundRegex: stateToClone.lookaroundRegex,
|
||||
@@ -122,6 +123,7 @@ func resetThreadsHelper(state *nfaState, visitedMap map[*nfaState]bool) {
|
||||
}
|
||||
// Assuming it hasn't been visited
|
||||
state.threadGroups = nil
|
||||
state.threadBackref = 0
|
||||
visitedMap[state] = true
|
||||
if state.isAlternation {
|
||||
resetThreadsHelper(state.next, visitedMap)
|
||||
@@ -428,7 +430,8 @@ func (s nfaState) equals(other nfaState) bool {
|
||||
s.groupBegin == other.groupBegin &&
|
||||
s.groupEnd == other.groupEnd &&
|
||||
s.groupNum == other.groupNum &&
|
||||
slices.Equal(s.threadGroups, other.threadGroups)
|
||||
slices.Equal(s.threadGroups, other.threadGroups) &&
|
||||
s.threadBackref == other.threadBackref
|
||||
}
|
||||
|
||||
func stateExists(list []nfaState, s nfaState) bool {
|
||||
|
Reference in New Issue
Block a user