static <L> Tree<L> stripLeaves(Tree<L> tree) {
   if (tree.isLeaf()) return null;
   if (tree.isPreTerminal()) return new Tree<L>(tree.getLabel());
   List<Tree<L>> children = new ArrayList<Tree<L>>();
   for (Tree<L> child : tree.getChildren()) {
     children.add(stripLeaves(child));
   }
   return new Tree<L>(tree.getLabel(), children);
 }
 private int addConstituents(Tree<L> tree, Set<Object> set, int start) {
   if (tree.isLeaf()) {
     if (punctuationTags.contains(tree.getLabel())) return 0;
     else return 1;
   }
   int end = start;
   for (Tree<L> child : tree.getChildren()) {
     int childSpan = addConstituents(child, set, end);
     end += childSpan;
   }
   L label = tree.getLabel();
   if (!labelsToIgnore.contains(label)) {
     set.add(new LabeledConstituent<L>(label, start, end));
   }
   return end - start;
 }