StateTree -> then in & out build
This commit is contained in:
parent
255e78f034
commit
427e3f2fc9
2 changed files with 48 additions and 3 deletions
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Add table
Reference in a new issue