StateTree -> then in & out build

This commit is contained in:
jeffcheasey88 2023-07-16 18:01:21 +02:00
parent 255e78f034
commit 427e3f2fc9
2 changed files with 48 additions and 3 deletions

View file

@ -1,6 +1,9 @@
package be.jeffcheasey88.peeratcode.parser.state; package be.jeffcheasey88.peeratcode.parser.state;
import java.util.ArrayList;
import java.util.List;
import java.util.function.BiFunction; import java.util.function.BiFunction;
import java.util.function.Function;
import be.jeffcheasey88.peeratcode.parser.Bag; import be.jeffcheasey88.peeratcode.parser.Bag;
import be.jeffcheasey88.peeratcode.parser.TokenValidator; import be.jeffcheasey88.peeratcode.parser.TokenValidator;
@ -8,18 +11,60 @@ import be.jeffcheasey88.peeratcode.parser.TokenValidator;
public class BuilderStateTree<E, B> extends StateTree<B>{ public class BuilderStateTree<E, B> extends StateTree<B>{
private BiFunction<E, Bag, B> builder; private BiFunction<E, Bag, B> builder;
private List<StateTree<E>> childs;
public BuilderStateTree(BiFunction<E, Bag, B> builder){ public BuilderStateTree(BiFunction<E, Bag, B> builder){
super(); super();
this.builder = builder; this.builder = builder;
this.childs = new ArrayList<>();
} }
B build(TokenValidator validator, E element){ B build(TokenValidator validator, E element){
B build = this.builder.apply(element, validator.getBag()); B build = this.builder.apply(element, validator.getBag());
validator.setBag(new Bag()); validator.setBag(new Bag());
super.internalSeed(validator, build); BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
if(builded != null) builded.build(validator, build);
BuilderStateTree<E, ?> buildedNoChilds = internalSeedNoChilds(validator, element);
if(buildedNoChilds != null) buildedNoChilds.build(validator, element);
return build; return build;
} }
BuilderStateTree<E, ?> internalSeedNoChilds(TokenValidator validator, E element){
for(StateTree<E> child : this.childs){
TokenValidator branch = validator.branch();
if(child.checker == null){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
return builded;
}
continue;
}
if(child.checker.apply(branch)){
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
if(builded != null){
validator.merge(branch);
return builded;
}
}
}
return null;
}
public <T extends StateTree<E>> StateTree<E> thenNoChild(StateTree<E> child){
childs.add(child);
return child;
}
public <T extends StateTree<E>> StateTree<E> thenNoChild(Function<TokenValidator, Boolean> checker){
StateTree<E> state = new StateTree<>();
state.checker = checker;
this.childs.add(state);
return state;
}
} }

View file

@ -23,7 +23,7 @@ public class StateTree<E>{
public void seed(Tokenizer tokenizer, E container){ public void seed(Tokenizer tokenizer, E container){
TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0])); TokenValidator validator = new TokenValidator(tokenizer.getTokens().toArray(new Token[0]));
while(validator.hasNext()) { while(validator.hasNext()){
System.out.println("seed"); System.out.println("seed");
BuilderStateTree<E, ?> build = internalSeed(validator, container); BuilderStateTree<E, ?> build = internalSeed(validator, container);
System.out.println("Validate "+validator.MAX_VALIDATE+"/"+tokenizer.getTokens().size()+" tokens !"); System.out.println("Validate "+validator.MAX_VALIDATE+"/"+tokenizer.getTokens().size()+" tokens !");
@ -72,7 +72,7 @@ public class StateTree<E>{
return this; return this;
} }
public <B> StateTree<B> end(BiFunction<E, Bag, B> builder){ public <B> BuilderStateTree<E, B> end(BiFunction<E, Bag, B> builder){
BuilderStateTree<E, B> builderState = new BuilderStateTree<>(builder); BuilderStateTree<E, B> builderState = new BuilderStateTree<>(builder);
this.builder = builderState; this.builder = builderState;
return builderState; return builderState;