From ce156c4405049ef33e35fb685f22bda32a0858ef Mon Sep 17 00:00:00 2001 From: Aadhavan Srinivasan Date: Wed, 23 Oct 2024 14:42:35 -0400 Subject: [PATCH] Fixed kleene star matching at end of string - failed test a* and ppppppppaaaaaaaa --- matching.go | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/matching.go b/matching.go index e248927..63c206a 100644 --- a/matching.go +++ b/matching.go @@ -34,6 +34,7 @@ func matchHelper(start *State, str string, indices []matchIndex, offset int) []m return indices } + foundPath := false startIdx := 0 endIdx := 0 currentStates := make([]*State, 0) @@ -47,12 +48,13 @@ func matchHelper(start *State, str string, indices []matchIndex, offset int) []m startIdx = i i++ // Advance to next character (if we aren't at a 0-state, which doesn't match anything), so that we can check for transitions. If we advance at a 0-state, we will never get a chance to match the first character } - // TODO - If start state is kleene star, try to match the next state - + startingFrom := i currentStates = append(currentStates, start) // Main loop for i < len(str) { + foundPath = false + zeroStates := make([]*State, 0) // Keep taking zero-states, until there are no more left to take zeroStates, isZero := takeZeroState(currentStates) @@ -69,16 +71,23 @@ func matchHelper(start *State, str string, indices []matchIndex, offset int) []m for _, state := range currentStates { if len(state.transitions[int(str[i])]) > 0 { tempStates = append(tempStates, state.transitions[int(str[i])]...) + foundPath = true } else { // This enables the 'greedy' behavior - last-state status is only checked if we can't match anything else if state.isLast { endIdx = i indices = append(indices, matchIndex{startIdx + offset, endIdx + offset}) } - // Recursion - match with rest of string - return matchHelper(start, str[i:], indices, offset+i) } } + + if foundPath == false { + // Recursion - match with rest of string if we have nowhere to go. If we haven't moved in the string, increment the counter by 1 to ensure we don't keep trying the same string over and over + if i == startingFrom { + i++ + } + return matchHelper(start, str[i:], indices, offset+i) + } currentStates = make([]*State, len(tempStates)) copy(currentStates, tempStates) tempStates = nil