peer-at-code-parser-java/src/be/jeffcheasey88/peeratcode/parser/TokenValidator.java
2023-07-19 10:02:24 +02:00

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;
// }
//
}