package edu.berkeley.nlp.syntax; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class SpanTree<L>{ int start, end; L label; List<SpanTree<L>> children; // inheritance should take care of that but i am too stupid... slav public List<SpanTree<L>> getChildren() { return children; } public boolean isLeaf() { return getChildren().isEmpty(); } public boolean isPreTerminal() { return getChildren().size() == 1 && getChildren().get(0).isLeaf(); } public void setChildren(List<SpanTree<L>> c) { this.children= c; } public SpanTree(L label) { this.label = label; this.children = Collections.emptyList(); this.start = this.end = -1; } public L getLabel() { return label; } public int getEnd() { return end; } public void setEnd(int end) { this.end = end; } public int getStart() { return start; } public void setStart(int start) { this.start = start; } /*public SpanTree(L label, List<SpanTree<L>> children, int start, int end) { super(label, children); // TODO Auto-generated constructor stub this.start = start; this.end = end; } */ public void setSpans(){ List<L> yield = new ArrayList<L>(); setSpansHelper(this, yield); } public void setSpansHelper(SpanTree<L> tree, List<L> yield){ if (tree.isLeaf()) { int pos = yield.size(); yield.add(tree.getLabel()); tree.setStart(pos); tree.setEnd(pos+1); return; } List<SpanTree<L>> children = tree.getChildren(); for (SpanTree<L> child : children){ setSpansHelper(child, yield); } SpanTree<L> child1 = children.get(0); SpanTree<L> child2 = children.get(children.size()-1); tree.setStart(child1.getStart()); tree.setEnd(child2.getEnd()); } }