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(" ")) + ")"; } } }