diff options
Diffstat (limited to 'main/subexstate.go')
| -rw-r--r-- | main/subexstate.go | 32 | 
1 files changed, 17 insertions, 15 deletions
| diff --git a/main/subexstate.go b/main/subexstate.go index cc697f0..00b9e75 100644 --- a/main/subexstate.go +++ b/main/subexstate.go @@ -21,25 +21,25 @@ func (state SubexGroupState) accepting(store Store) []string {  }  type SubexStoreState struct { -	match RegexState +	match SubexState  	slot rune  	next SubexState -	input string +	toStore string  } -func (state SubexStoreState) eat(store Store, char rune) []SubexBranch { -	var nextStates []SubexBranch -	if state.match.accepting() { -		store[state.slot] = state.input -		nextStates = state.next.eat(store, char) +func (state SubexStoreState) eat(store Store, char rune) (nextStates []SubexBranch) { +	acceptedOutputs := state.match.accepting(store) +	for _, acceptedOutput := range acceptedOutputs { +		nextStore := store.withValue(state.slot, state.toStore + acceptedOutput) +		nextStates = append(nextStates, state.next.eat(nextStore.clone(), char)...)  	} -	nextRegexStates := state.match.eat(char) -	for _, regexState := range nextRegexStates { +	nextMatchStates := state.match.eat(store.clone(), char) +	for _, matchState := range nextMatchStates {  		nextStates = append(nextStates, SubexBranch {  			state: SubexStoreState { -				match: regexState, +				match: matchState.state,  				slot: state.slot,  				next: state.next, -				input: state.input + string(char), +				toStore: state.toStore + matchState.output,  			},  			output: "",  			store: store.clone(), @@ -47,11 +47,13 @@ func (state SubexStoreState) eat(store Store, char rune) []SubexBranch {  	}  	return nextStates  } -func (state SubexStoreState) accepting(store Store) []string { -	if state.match.accepting() { -		return state.next.accepting(store) +func (state SubexStoreState) accepting(store Store) (outputs []string) { +	acceptedOutputs := state.match.accepting(store) +	for _, acceptedOutput := range acceptedOutputs { +		nextStore := store.withValue(state.slot, state.toStore + acceptedOutput) +		outputs = append(outputs, state.next.accepting(nextStore)...)  	} -	return nil +	return outputs  }  type SubexOutputState struct { | 
