public Tree helper(Tree t) {
if (t == null) {
return null;
} else if (t.isLeaf()) {
return tf.newLeaf(new CategoryWordTag(t.label().value()));
} else if (t.isPreTerminal()) {
return tf.newTreeNode(new CategoryWordTag(t.label().value()), Collections.singletonList(helper(t.children()[0])));
} else {
int numKids = t.numChildren();
List<Tree> children = new ArrayList<Tree>(numKids);
for (int k = 0; k < numKids; k++) {
children.add(helper(t.children()[k]));
}
return tf.newTreeNode(new CategoryWordTag(t.label().value()), children);
}
}