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 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 action, BiConsumer 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 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 action, BiConsumer 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; // } // }