package dev.peerat.parser.visitor; import java.util.function.Predicate; import dev.peerat.parser.Token; import dev.peerat.parser.TokenType; public class TokenVisitor extends Visitor{ private Predicate token; private Predicate name; private Predicate type; private Predicate line; private Predicate character; private boolean propagate; public TokenVisitor(boolean propagate){ this.propagate = propagate; } @Override public boolean canVisit(Class type){ return type.isAssignableFrom(Token.class); } @Override public boolean canPropagate(){ return this.propagate; } public TokenVisitor named(Predicate predicate){ this.name = predicate; return this; } public TokenVisitor type(Predicate predicate){ this.type = predicate; return this; } public TokenVisitor line(Predicate predicate){ this.line = predicate; return this; } public TokenVisitor character(Predicate predicate){ this.character = predicate; return this; } public TokenVisitor validate(Predicate predicate){ this.token = predicate; return this; } @Override public VisitorBag visit(Token element){ VisitorBag bag = new VisitorBag(); if(this.token != null && !this.token.test(element)) return bag; if(this.name != null && !this.name.test(element.getValue())) return bag; if(this.type != null && !this.type.test(element.getType())) return bag; if(this.line != null && !this.line.test(element.getLineNumber())) return bag; if(this.character != null && !this.character.test(element.getCharacterNumber())) return bag; bag.compute(element); return bag; } }