Implement PCRE Matching (prefer left-branch) #2
@@ -153,7 +153,7 @@ func pruneIndices(indices []Match) []Match {
|
|||||||
|
|
||||||
func copyThread(to *nfaState, from nfaState) {
|
func copyThread(to *nfaState, from nfaState) {
|
||||||
to.threadSP = from.threadSP
|
to.threadSP = from.threadSP
|
||||||
to.threadGroups = from.threadGroups
|
to.threadGroups = append([]Group{}, from.threadGroups...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find returns the 0-group of the leftmost match of the regex in the given string.
|
// Find returns the 0-group of the leftmost match of the regex in the given string.
|
||||||
@@ -325,10 +325,33 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
|
|||||||
|
|
||||||
if currentState.groupBegin {
|
if currentState.groupBegin {
|
||||||
currentState.threadGroups[currentState.groupNum].StartIdx = idx
|
currentState.threadGroups[currentState.groupNum].StartIdx = idx
|
||||||
|
// allMatches := make([]nfaState, 0)
|
||||||
|
// for _, v := range currentState.transitions {
|
||||||
|
// dereferenced := funcMap(v, func(s *nfaState) nfaState {
|
||||||
|
// return *s
|
||||||
|
// })
|
||||||
|
// allMatches = append(allMatches, dereferenced...)
|
||||||
|
// }
|
||||||
|
// slices.Reverse(allMatches)
|
||||||
|
// for i := range allMatches {
|
||||||
|
// copyThread(&allMatches[i], currentState)
|
||||||
|
// }
|
||||||
|
// currentStates = append(currentStates, allMatches...)
|
||||||
}
|
}
|
||||||
|
|
||||||
if currentState.groupEnd {
|
if currentState.groupEnd {
|
||||||
currentState.threadGroups[currentState.groupNum].EndIdx = idx
|
currentState.threadGroups[currentState.groupNum].EndIdx = idx
|
||||||
|
// allMatches := make([]nfaState, 0)
|
||||||
|
// for _, v := range currentState.transitions {
|
||||||
|
// dereferenced := funcMap(v, func(s *nfaState) nfaState {
|
||||||
|
// return *s
|
||||||
|
// })
|
||||||
|
// allMatches = append(allMatches, dereferenced...)
|
||||||
|
// }
|
||||||
|
// slices.Reverse(allMatches)
|
||||||
|
// for i := range allMatches {
|
||||||
|
// copyThread(&allMatches[i], currentState)
|
||||||
|
// }
|
||||||
|
// currentStates = append(currentStates, allMatches...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if currentState.isKleene {
|
// if currentState.isKleene {
|
||||||
@@ -363,7 +386,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Empty state - enqueue next state, do _not_ increment the SP
|
// Empty state - enqueue next state, do _not_ increment the SP
|
||||||
if currentState.isEmpty && currentState.assert == noneAssert {
|
if currentState.isEmpty && currentState.assert == noneAssert { //&& currentState.groupBegin == false && currentState.groupEnd == false {
|
||||||
isEmptyAndNoAssertion = true
|
isEmptyAndNoAssertion = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -386,10 +409,16 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
|
|||||||
allMatches[i].threadSP += 1
|
allMatches[i].threadSP += 1
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if currentState.groupBegin {
|
||||||
|
currentStates = slices.Insert(currentStates, currentStateIdx+1, allMatches...)
|
||||||
|
} else if currentState.groupEnd {
|
||||||
|
currentStates = append(currentStates, allMatches...)
|
||||||
|
} else {
|
||||||
nextStates = append(nextStates, allMatches...)
|
nextStates = append(nextStates, allMatches...)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if currentState.isLast { // Last state reached
|
if currentState.isLast && len(nextStates) == 0 { // Last state reached
|
||||||
if foundMatch {
|
if foundMatch {
|
||||||
if currentState.assert != noneAssert {
|
if currentState.assert != noneAssert {
|
||||||
currentState.threadGroups[0].EndIdx = idx
|
currentState.threadGroups[0].EndIdx = idx
|
||||||
@@ -400,7 +429,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
|
|||||||
idx += 1
|
idx += 1
|
||||||
}
|
}
|
||||||
return true, currentState.threadGroups, idx
|
return true, currentState.threadGroups, idx
|
||||||
} else if currentState.isEmpty && currentState.assert == noneAssert {
|
} else if isEmptyAndNoAssertion {
|
||||||
currentState.threadGroups[0].EndIdx = idx
|
currentState.threadGroups[0].EndIdx = idx
|
||||||
if idx == currentState.threadGroups[0].StartIdx {
|
if idx == currentState.threadGroups[0].StartIdx {
|
||||||
idx++
|
idx++
|
||||||
@@ -410,7 +439,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
copy(currentStates, nextStates)
|
currentStates = append([]nfaState{}, nextStates...)
|
||||||
nextStates = nil
|
nextStates = nil
|
||||||
}
|
}
|
||||||
return false, []Group{}, i + 1
|
return false, []Group{}, i + 1
|
||||||
|
Reference in New Issue
Block a user