package scotch.compiler.parser;
import static java.util.stream.Collectors.joining;
import java.util.List;
import com.google.common.collect.ImmutableList;
import lombok.EqualsAndHashCode;
public abstract class Tree {
public static Tree leaf(String value) {
return new Leaf(value);
}
public static Tree node(String name, List<Tree> children) {
return new Node(name, children);
}
public static String tree(String name, List<Tree> children) {
return new Node(name, children).toString();
}
private Tree() {
// intentionally empty
}
@Override
public abstract boolean equals(Object o);
@Override
public abstract int hashCode();
@Override
public abstract String toString();
@EqualsAndHashCode(callSuper = false)
public static class Leaf extends Tree {
private final String value;
private Leaf(String value) {
this.value = value;
}
@Override
public String toString() {
return value;
}
}
@EqualsAndHashCode(callSuper = false)
public static class Node extends Tree {
private final String name;
private final List<Tree> children;
private Node(String name, List<Tree> children) {
this.name = name;
this.children = ImmutableList.copyOf(children);
}
@Override
public String toString() {
return "(" + name + " " + children.stream().map(Object::toString).collect(joining(" ")) + ")";
}
}
}