44 lines
1.1 KiB
Java
44 lines
1.1 KiB
Java
package dev.peerat.parser.state;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.List;
|
|
|
|
import dev.peerat.parser.TokenValidator;
|
|
|
|
public class InitialStateTree<E> extends StateTree<E>{
|
|
|
|
private List<StateTree<E>> multiple;
|
|
|
|
public InitialStateTree(){
|
|
super();
|
|
|
|
this.multiple = new ArrayList<>();
|
|
}
|
|
|
|
@Override
|
|
BuilderStateTree<E, ?> internalSeed(TokenValidator validator, E element){
|
|
BuilderStateTree<E, ?> builded;
|
|
for(StateTree<E> state : this.multiple){
|
|
TokenValidator branch;
|
|
if(state.checker == null){
|
|
while((builded = state.internalSeed((branch = validator.branch()), element)) != null){
|
|
validator.merge(branch);
|
|
builded.build(validator, element);
|
|
}
|
|
}else{
|
|
while(state.checker.test((branch = validator.branch()))){
|
|
builded = state.internalSeed(branch, element);
|
|
if(builded == null) break;
|
|
validator.merge(branch);
|
|
builded.build(validator, element);
|
|
}
|
|
}
|
|
}
|
|
return super.internalSeed(validator, element);
|
|
}
|
|
|
|
public <T extends StateTree<E>> StateTree<E> multiple(StateTree<E> child){
|
|
this.multiple.add(child);
|
|
return child;
|
|
}
|
|
}
|