Change kleene() to an alternation-style construct

implementPCREMatchingRules
Aadhavan Srinivasan 1 month ago
parent 753e973d82
commit e0253dfaf3

@ -116,7 +116,6 @@ func cloneStateHelper(stateToClone *nfaState, cloneMap map[*nfaState]*nfaState)
clone.rightState = clone clone.rightState = clone
} }
clone.rightState = cloneStateHelper(stateToClone.rightState, cloneMap) clone.rightState = cloneStateHelper(stateToClone.rightState, cloneMap)
return clone return clone
} }
@ -326,12 +325,16 @@ func kleene(s1 nfaState) (*nfaState, error) {
return nil, fmt.Errorf("previous token is not quantifiable") return nil, fmt.Errorf("previous token is not quantifiable")
} }
toReturn := &nfaState{} emptyState := zeroLengthMatchState()
toReturn.transitions = make(map[int][]*nfaState) emptyState.assert = noneAssert
toReturn.content = newContents(epsilon) toReturn := alternate(&s1, &emptyState)
// toReturn := &nfaState{}
// toReturn.transitions = make(map[int][]*nfaState)
// toReturn.content = newContents(epsilon)
toReturn.isEmpty = true toReturn.isEmpty = true
toReturn.isKleene = true toReturn.isKleene = true
toReturn.output = append(toReturn.output, toReturn) toReturn.output = []*nfaState{&emptyState}
for i := range s1.output { for i := range s1.output {
for _, c := range toReturn.content { for _, c := range toReturn.content {
s1.output[i].transitions[c], _ = uniqueAppend(s1.output[i].transitions[c], toReturn) s1.output[i].transitions[c], _ = uniqueAppend(s1.output[i].transitions[c], toReturn)
@ -340,6 +343,7 @@ func kleene(s1 nfaState) (*nfaState, error) {
for _, c := range s1.content { for _, c := range s1.content {
toReturn.transitions[c], _ = uniqueAppend(toReturn.transitions[c], &s1) toReturn.transitions[c], _ = uniqueAppend(toReturn.transitions[c], &s1)
} }
//toReturn.kleeneState = &s1
return toReturn, nil return toReturn, nil
} }
@ -374,7 +378,6 @@ func question(s1 *nfaState) *nfaState { // Use the fact that ab? == a(b|)
s2.content = newContents(epsilon) s2.content = newContents(epsilon)
s2.output = append(s2.output, s2) s2.output = append(s2.output, s2)
s2.isEmpty = true s2.isEmpty = true
s2.isAlternation = true
s3 := alternate(s1, s2) s3 := alternate(s1, s2)
return s3 return s3
} }

Loading…
Cancel
Save