More work towards implementing PCRE matching

implementPCREMatchingRules
Aadhavan Srinivasan 1 month ago
parent e0253dfaf3
commit 3ce611d121

@ -314,13 +314,36 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
currentState.threadGroups = newMatch(numGroups + 1) currentState.threadGroups = newMatch(numGroups + 1)
currentState.threadGroups[0].StartIdx = idx currentState.threadGroups[0].StartIdx = idx
} }
if currentState.groupBegin { if currentState.groupBegin {
currentState.threadGroups[currentState.groupNum].StartIdx = idx currentState.threadGroups[currentState.groupNum].StartIdx = idx
} else if currentState.groupEnd { }
if currentState.groupEnd {
currentState.threadGroups[currentState.groupNum].EndIdx = idx currentState.threadGroups[currentState.groupNum].EndIdx = idx
} else if currentState.isKleene { }
// Append the
} else if currentState.isAlternation { // if currentState.isKleene {
// // Append the next-state (after the kleene), then append the kleene state
// allMatches := make([]*nfaState, 0)
// for _, v := range currentState.transitions {
// allMatches = append(allMatches, v...)
// }
// slices.Reverse(allMatches)
// for _, m := range allMatches {
// m.threadGroups = currentState.threadGroups
// m.threadSP = idx
// }
// currentStates = append(currentStates, allMatches...)
//
// // kleeneState := currentState.kleeneState
// // kleeneState.threadGroups = currentState.threadGroups
// // kleeneState.threadSP = currentState.threadSP
// // currentStates = append(currentStates, kleeneState)
// continue
// }
if currentState.isAlternation {
rightState := currentState.rightState rightState := currentState.rightState
rightState.threadGroups = currentState.threadGroups rightState.threadGroups = currentState.threadGroups
rightState.threadSP = currentState.threadSP rightState.threadSP = currentState.threadSP
@ -330,7 +353,22 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
leftState.threadSP = currentState.threadSP leftState.threadSP = currentState.threadSP
currentStates = append(currentStates, currentState.leftState) currentStates = append(currentStates, currentState.leftState)
continue continue
} else if currentState.contentContains(str, idx) { }
if currentState.isEmpty && currentState.assert == noneAssert {
allMatches := make([]*nfaState, 0)
for _, v := range currentState.transitions {
allMatches = append(allMatches, v...)
}
slices.Reverse(allMatches)
for _, m := range allMatches {
m.threadGroups = currentState.threadGroups
m.threadSP = idx
}
currentStates = append(currentStates, allMatches...)
}
if currentState.contentContains(str, idx) {
foundMatch = true foundMatch = true
allMatches := make([]*nfaState, 0) allMatches := make([]*nfaState, 0)
for _, v := range currentState.transitions { for _, v := range currentState.transitions {
@ -348,9 +386,17 @@ func findAllSubmatchHelper(start *nfaState, str []rune, offset int, numGroups in
currentStates = append(currentStates, allMatches...) currentStates = append(currentStates, allMatches...)
} }
if currentState.isLast && foundMatch { // Last state reached if currentState.isLast { // Last state reached
if foundMatch {
currentState.threadGroups[0].EndIdx = idx + 1 currentState.threadGroups[0].EndIdx = idx + 1
return true, currentState.threadGroups, idx + 1 return true, currentState.threadGroups, idx + 1
} else if currentState.isEmpty && currentState.assert == noneAssert {
currentState.threadGroups[0].EndIdx = idx
if idx == currentState.threadGroups[0].StartIdx {
idx++
}
return true, currentState.threadGroups, idx
}
} }
} }

Loading…
Cancel
Save