Add multiple multiple & reduce trace
This commit is contained in:
parent
e81a509f48
commit
39a20c42a0
1 changed files with 25 additions and 31 deletions
|
@ -13,13 +13,14 @@ 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;
|
private List<StateTree<E>> childs;
|
||||||
private StateTree<E> multiple;
|
private List<StateTree<E>> multiple;
|
||||||
|
|
||||||
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<>();
|
this.childs = new ArrayList<>();
|
||||||
|
this.multiple = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
B build(TokenValidator validator, E element){
|
B build(TokenValidator validator, E element){
|
||||||
|
@ -29,50 +30,43 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
|
BuilderStateTree<B, ?> builded = super.internalSeed(validator, build);
|
||||||
if(builded != null) builded.build(validator, build);
|
if(builded != null) builded.build(validator, build);
|
||||||
|
|
||||||
internalSeedNoChilds(validator, element);
|
BuilderStateTree<E, ?> sub_builded;
|
||||||
|
|
||||||
return build;
|
for(StateTree<E> state : this.multiple){
|
||||||
}
|
|
||||||
|
|
||||||
void internalSeedNoChilds(TokenValidator validator, E element){
|
|
||||||
if(multiple != null){
|
|
||||||
TokenValidator branch = validator.branch();
|
TokenValidator branch = validator.branch();
|
||||||
if(multiple.checker == null){
|
if(state.checker == null){
|
||||||
BuilderStateTree<E, ?> builded;
|
while((sub_builded = state.internalSeed(branch, element)) != null){
|
||||||
while((builded = multiple.internalSeed(branch, element)) != null){
|
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
builded.build(validator, element);
|
sub_builded.build(validator, element);
|
||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
while(multiple.checker.apply(branch)){
|
while(state.checker.apply(branch)){
|
||||||
BuilderStateTree<E, ?> builded = multiple.internalSeed(branch, element);
|
sub_builded = state.internalSeed(branch, element);
|
||||||
if(builded != null){
|
if(sub_builded == null) break;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
builded.build(validator, element);
|
sub_builded.build(validator, element);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for(StateTree<E> child : this.childs){
|
for(StateTree<E> child : this.childs){
|
||||||
TokenValidator branch = validator.branch();
|
TokenValidator branch = validator.branch();
|
||||||
if(child.checker == null){
|
if(child.checker == null){
|
||||||
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
|
sub_builded = child.internalSeed(branch, element);
|
||||||
if(builded != null){
|
if(sub_builded == null) continue;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
builded.build(validator, element);
|
sub_builded.build(validator, element);
|
||||||
return;
|
break;
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
if(child.checker.apply(branch)){
|
if(child.checker.apply(branch)){
|
||||||
BuilderStateTree<E, ?> builded = child.internalSeed(branch, element);
|
sub_builded = child.internalSeed(branch, element);
|
||||||
if(builded != null){
|
if(sub_builded == null) continue;
|
||||||
validator.merge(branch);
|
validator.merge(branch);
|
||||||
builded.build(validator, element);
|
sub_builded.build(validator, element);
|
||||||
return;
|
break;
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return build;
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends StateTree<E>> StateTree<E> thenNoChild(StateTree<E> child){
|
public <T extends StateTree<E>> StateTree<E> thenNoChild(StateTree<E> child){
|
||||||
|
@ -88,7 +82,7 @@ public class BuilderStateTree<E, B> extends StateTree<B>{
|
||||||
}
|
}
|
||||||
|
|
||||||
public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){
|
public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){
|
||||||
this.multiple = child;
|
this.multiple.add(child);
|
||||||
return child;
|
return child;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue