peer-at-code-parser-java/src/dev/peerat/parser/java/Value.java

145 lines
3 KiB
Java

package dev.peerat.parser.java;
import java.util.List;
import java.util.function.Function;
import dev.peerat.parser.Token;
public class Value extends JavaElement{
private Token token;
private JavaElement content;
Value(){}
public Value(Token token){
this.token = token;
}
public Value(JavaElement content){
this.content = content;
}
public Token getToken(){
return this.token;
}
public JavaElement getContent(){
return this.content;
}
@Override
public String toString(){
return "Value[token="+token+", content="+content+"]";
}
@Override
public void build(Builder builder) throws Exception{
if(token != null){
builder.append(token);
}else{
content.build(builder);
}
}
@Override
public <E extends JavaElement> E find(Function<JavaElement, Boolean> finder){
return content != null ? finder.apply(content) ? (E) content : null : null;
}
@Override
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list) {
if(content != null && finder.apply(content)) list.add((E) content);
}
public static class BiValue extends Value{
private Value left;
private String action;
private Value right;
public BiValue(Value left, String action, Value right){
this.left = left;
this.action = action;
this.right = right;
}
public Value left(){
return left;
}
public String getAction(){
return this.action;
}
public Value right(){
return right;
}
@Override
public String toString(){
return left+" "+action+" "+right;
}
@Override
public void build(Builder builder) throws Exception{
left.build(builder);
builder.append(action);
right.build(builder);
}
@Override
public <E extends JavaElement> E find(Function<JavaElement, Boolean> finder){
return finder.apply(left) ? (E) left : finder.apply(right) ? (E) right : null;
}
@Override
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list){
if(finder.apply(left)) list.add((E)left);
if(finder.apply(right)) list.add((E)right);
}
}
public static class TriValue extends Value{
private Value check;
private Value success;
private Value fail;
public TriValue(){}
public Value getChecker(){
return check;
}
public Value success(){
return success;
}
public Value fail(){
return fail;
}
@Override
public void build(Builder builder) throws Exception {
check.build(builder);
builder.append("?");
success.build(builder);
builder.append(":");
fail.build(builder);
}
@Override
public <E extends JavaElement> E find(Function<JavaElement, Boolean> finder){
return finder.apply(check) ? (E) check : finder.apply(success) ? (E) success : finder.apply(fail) ? (E) fail : null;
}
@Override
public <E extends JavaElement> void findAll(Function<JavaElement, Boolean> finder, List<E> list){
if(finder.apply(check)) list.add((E)check);
if(finder.apply(success)) list.add((E)success);
if(finder.apply(fail)) list.add((E)fail);
}
}
}