Started working on converting to PCRE matching rules (prefer left branch of alternation)

remotes/origin/implementPCREMatchingRules
Aadhavan Srinivasan 1 month ago
parent ad0f7d0178
commit bc32e0cb76

@ -2,6 +2,7 @@ package regex
import ( import (
"fmt" "fmt"
"slices"
"sort" "sort"
) )
@ -320,7 +321,7 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
} }
} }
currentStates, _ = uniqueAppend(currentStates, tempStates...) currentStates = slices.Concat(currentStates, tempStates)
tempStates = nil tempStates = nil
// Take any transitions corresponding to current character // Take any transitions corresponding to current character
@ -329,11 +330,15 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
lastStateInList := false // Whether or not a last state was in our list of states lastStateInList := false // Whether or not a last state was in our list of states
var lastStatePtr *nfaState = nil // Pointer to the last-state, if it was found var lastStatePtr *nfaState = nil // Pointer to the last-state, if it was found
lastLookaroundInList := false // Whether or not a last state (that is a lookaround) was in our list of states lastLookaroundInList := false // Whether or not a last state (that is a lookaround) was in our list of states
for _, state := range currentStates { for numStatesMatched == 0 && lastStateInList == false {
if len(currentStates) == 0 {
break
}
state, _ := pop(&currentStates)
matches, numMatches := state.matchesFor(str, i) matches, numMatches := state.matchesFor(str, i)
if numMatches > 0 { if numMatches > 0 {
numStatesMatched++ numStatesMatched++
tempStates = append(tempStates, matches...) tempStates = append([]*nfaState(nil), matches...)
foundPath = true foundPath = true
for _, m := range matches { for _, m := range matches {
if m.threadGroups == nil { if m.threadGroups == nil {
@ -383,12 +388,17 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
lastStateInList = true lastStateInList = true
} }
} }
if lastStateInList { // A last-state was in the list of states. add the matchIndex to our MatchIndex list if lastStateInList && numStatesMatched == 0 { // A last-state was in the list of states. add the matchIndex to our MatchIndex list
for j := 1; j < numGroups+1; j++ { for j := 1; j < numGroups+1; j++ {
tempIndices[j] = lastStatePtr.threadGroups[j] tempIndices[j] = lastStatePtr.threadGroups[j]
} }
endIdx = i endIdx = i
tempIndices[0] = Group{startIdx, endIdx} tempIndices[0] = Group{startIdx, endIdx}
if tempIndices[0].StartIdx == tempIndices[0].EndIdx {
return true, tempIndices, tempIndices[0].EndIdx + 1
} else {
return true, tempIndices, tempIndices[0].EndIdx
}
} }
// Check if we can find a zero-length match // Check if we can find a zero-length match

Loading…
Cancel
Save