@startuml
'https://plantuml.com/class-diagram

interface Visitor {
    void visit(Element e);
}

interface Element {
    int getLevel();
    Element getParent();
    boolean isLeaf();
    String getLiteral();
    void accept(Visitor visitor, Traversal traversal);
}

interface GroupElement<T extends Element> extends Element {}

abstract class TraversalElement implements Element {}

class AttrElement extends TraversalElement {}

class LogicGroup extends TraversalElement implements GroupElement {}

enum Traversal {
    NONE, DEEP, BREADTH;
}

interface CompilationRule {
   GroupElement<?> treeifyBin(List<RuleAttr> ruleItems);
   List<RuleAttr> expand(GroupElement<?> tree);
}

Traversal *-- Element : use
Element *-- Visitor : use
Element *-- CompilationRule : use

@enduml