71 lines
1.7 KiB
Java
71 lines
1.7 KiB
Java
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<Token>{
|
|
|
|
private Predicate<Token> token;
|
|
private Predicate<String> name;
|
|
private Predicate<TokenType> type;
|
|
private Predicate<Integer> line;
|
|
private Predicate<Integer> 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<String> predicate){
|
|
this.name = predicate;
|
|
return this;
|
|
}
|
|
|
|
public TokenVisitor type(Predicate<TokenType> predicate){
|
|
this.type = predicate;
|
|
return this;
|
|
}
|
|
|
|
public TokenVisitor line(Predicate<Integer> predicate){
|
|
this.line = predicate;
|
|
return this;
|
|
}
|
|
|
|
public TokenVisitor character(Predicate<Integer> predicate){
|
|
this.character = predicate;
|
|
return this;
|
|
}
|
|
|
|
public TokenVisitor validate(Predicate<Token> 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;
|
|
}
|
|
|
|
}
|