@ -60,8 +60,7 @@ func (g Group) isValid() bool {
// takeZeroState takes the 0-state (if such a transition exists) for all states in the
// given slice. It returns the resulting states. If any of the resulting states is a 0-state,
// the second ret val is true.
// The third ret val is a list of all the group numbers of all the opening parentheses we crossed,
// and the fourth is a list of all the closing parentheses we passed
// If a state begins or ends a capturing group, its 'thread' is updated to contain the correct index.
func takeZeroState ( states [ ] * State , numGroups int , idx int ) ( rtv [ ] * State , isZero bool ) {
for _ , state := range states {
if len ( state . transitions [ EPSILON ] ) > 0 {
@ -169,23 +168,6 @@ func findAllMatchesHelper(start *State, str []rune, offset int, numGroups int) (
// The second value here shouldn't be used, because we should exit when the third return value is > than len(str)
return false , [ ] Group { } , offset
}
// 'Base case' - if we are at the end of the string, check if we can add a zero-length match
if offset == len ( str ) {
// Get all zero-state matches. If we can get to a zero-state without matching anything, we
// can add a zero-length match. This is all true only if the start state itself matches nothing.
// TODO - fill in capturing groups for these matches
if start . isEmpty {
to_return := newMatch ( numGroups + 1 )
if start . groupBegin {
to_return [ start . groupNum ] . startIdx = offset
}
if ok := zeroMatchPossible ( str , offset , numGroups , start ) ; ok {
to_return [ 0 ] = Group { offset , offset }
return true , to_return , offset + 1
}
}
return false , [ ] Group { } , offset + 1
}
// Hold a list of match indices for the current run. When we
// can no longer find a match, the match with the largest range is
@ -366,7 +348,7 @@ func findAllMatchesHelper(start *State, str []rune, offset int, numGroups int) (
for _ , state := range currentStates {
// Only add the match if the start index is in bounds. If the state has an assertion,
// make sure the assertion checks out.
if state . isLast && startIdx < len ( str ) {
if state . isLast && i <= len ( str ) {
if state . assert == NONE || state . checkAssertion ( str , i ) {
for j := 1 ; j < numGroups + 1 ; j ++ {
tempIndices [ j ] = state . threadGroups [ j ]