160 lines
3.5 KiB
Java
160 lines
3.5 KiB
Java
package be.jeffcheasey88.peeratcode.parser;
|
|
|
|
import java.util.function.BiConsumer;
|
|
import java.util.function.Function;
|
|
|
|
public class TokenValidator{
|
|
|
|
public static int MAX_VALIDATE = 0;
|
|
public static int TOKENS = 0;
|
|
|
|
private Token[] elements;
|
|
private int index;
|
|
private int validated;
|
|
|
|
private Bag bag;
|
|
|
|
private TokenValidator(Bag bag){
|
|
this.bag = bag;
|
|
}
|
|
|
|
public TokenValidator(Token[] elements){
|
|
this.elements = elements;
|
|
this.bag = new Bag();
|
|
}
|
|
|
|
public boolean hasNext(){
|
|
return validated < elements.length;
|
|
}
|
|
|
|
public boolean validate(Function<Token, Boolean> action){
|
|
if(validated >= this.elements.length) return false;
|
|
if(action.apply(this.elements[validated])){
|
|
if(validated+1 > MAX_VALIDATE){
|
|
MAX_VALIDATE = validated+1;
|
|
TOKENS = elements.length;
|
|
}
|
|
this.validated++;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public boolean validate(Function<Token, Boolean> action, BiConsumer<Bag, Token> filler){
|
|
if(validate(action)){
|
|
filler.accept(bag, elements[validated-1]);
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
public TokenValidator branch(){
|
|
TokenValidator branch = new TokenValidator(bag);
|
|
branch.elements = this.elements;
|
|
branch.index = Math.max(0, this.validated-1);
|
|
branch.validated = this.validated;
|
|
return branch;
|
|
}
|
|
|
|
public void merge(TokenValidator branch){
|
|
this.index = branch.index;
|
|
this.validated = branch.validated;
|
|
this.bag = branch.bag;
|
|
}
|
|
|
|
public void setBag(Bag bag){
|
|
this.bag = bag;
|
|
}
|
|
|
|
public Bag getBag(){
|
|
return this.bag;
|
|
}
|
|
|
|
// private Token[] elements;
|
|
// private int index;
|
|
// private int validated;
|
|
//
|
|
// private Bag bag;
|
|
//
|
|
// public TokenValidator(Token[] tokens){
|
|
// this.elements = tokens;
|
|
// this.validated = -1;
|
|
// this.bag = new Bag();
|
|
// }
|
|
//
|
|
// @Override
|
|
// public boolean hasNext(){
|
|
// return index < elements.length;
|
|
// }
|
|
//
|
|
// @Override
|
|
// public Token next(){
|
|
// return elements[index++];
|
|
// }
|
|
//
|
|
// public boolean validate(Function<Token, Boolean> action){
|
|
// if(index >= this.elements.length) return false;
|
|
// if(action.apply(this.elements[index])){
|
|
// System.out.println("validate "+elements[index]);
|
|
// this.validated = index;
|
|
// next();
|
|
// return true;
|
|
// }
|
|
// return false;
|
|
// }
|
|
//
|
|
// public boolean validate(Function<Token, Boolean> action, BiConsumer<Bag, Token> filler){
|
|
// if(validate(action)){
|
|
// filler.accept(bag, elements[index-1]);
|
|
// return true;
|
|
// }
|
|
// return false;
|
|
// }
|
|
//
|
|
// public void rollbackValidate(){
|
|
// this.index = validated+1;
|
|
// }
|
|
//
|
|
// public TokenValidator pullValidated(){
|
|
// Token[] validated = new Token[this.validated+1];
|
|
// System.arraycopy(this.elements, 0, validated, 0, validated.length);
|
|
// TokenValidator tk = new TokenValidator(validated);
|
|
// tk.bag = bag;
|
|
// return tk;
|
|
// }
|
|
//
|
|
// public void pushValidated(){
|
|
// Token[] validated = new Token[this.elements.length-(this.validated+1)];
|
|
// System.arraycopy(this.elements, this.validated+1, validated, 0, validated.length);
|
|
// this.elements = validated;
|
|
// this.index = 0;
|
|
// this.validated = -1;
|
|
// }
|
|
//
|
|
// public TokenValidator branch(){
|
|
// pushValidated();
|
|
// TokenValidator branch = new TokenValidator(this.elements);
|
|
// branch.bag = this.bag;
|
|
// return branch;
|
|
// }
|
|
//
|
|
// public void merge(TokenValidator branch){
|
|
// branch.pushValidated();
|
|
// this.elements = branch.elements;
|
|
// this.index = 0;
|
|
// this.validated = -1;
|
|
// }
|
|
//
|
|
// public Token[] toArray(){
|
|
// return this.elements;
|
|
// }
|
|
//
|
|
// public void setBag(Bag bag){
|
|
// this.bag = bag;
|
|
// }
|
|
//
|
|
// public Bag getBag(){
|
|
// return this.bag;
|
|
// }
|
|
//
|
|
}
|