import java.lang.reflect.*;
/** an efficient representation of a collection of trees (Tomita's shared packed parse forest) */
-public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/ implements Visitable<Forest.Body<T>>, IntegerMappable, GraphViz.ToGraphViz {
+public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/
+ implements Visitable<Forest.Body<T>>,
+ IntegerMappable,
+ GraphViz.ToGraphViz {
private static int master_idx = 0;
private final int idx = master_idx++;
public InnerAmbiguous(Forest<?> f) { this.f = f; }
}
- public static interface TreeConsumer<T> {
+ static interface TreeConsumer<T> {
public void addTree(Tree<T> t);
}
- public static class HashSetTreeConsumer<T> extends HashSet<Tree<T>> implements TreeConsumer<T> {
- public void addTree(Tree<T> t) { super.add(t); }
+ static class HashSetTreeConsumer<T> extends HashSet<Tree<T>> implements TreeConsumer<T> {
+ public void addTree(Tree<T> t) {
+ super.add(t);
+ }
}
static <T> Forest<T> singleton(Input.Location loc, Position p) {
void expand(int i, TreeMaker<T> h);
}
public abstract void edges(GraphViz.Node n);
+ public boolean ambiguous() { return false; }
protected static class MyBody<T> extends Forest<T> implements Body<T> /* extends PrintableTree<Forest<T>> implements */ {
public boolean isTransparent() { return false; }
GraphViz.Node n = gv.createNode(this);
n.label = headToString()==null?"":headToString();
n.directed = true;
+ n.comment = reduction==null?null:reduction+"";
edges(n);
return n;
}
if (edges) return;
edges = true;
for(int i=0; i<tokens.length; i++) {
- if (i==tokens.length-1 && unwrap) {
+ if (i==tokens.length-1 && unwrap && !tokens[i].ambiguous()) {
tokens[i].edges(n);
} else {
n.edge(tokens[i], labels==null?null:labels[i]);
* viewed, it becomes immutable
*/
static class Ref<T> extends Forest<T> {
+ public boolean ambiguous() {
+ if (hp.size()==0) return false;
+ if (hp.size()==1) return hp.iterator().next().ambiguous();
+ return true;
+ }
private FastSet<Forest<T>> hp = new FastSet<Forest<T>>();
public Ref() { }
public int toInt() {
public boolean isTransparent() { return hp.size()==1; }
public boolean isHidden() { return hp.size()==0; }
- public void edges(GraphViz.Node n) { for(Forest f : hp) f.edges(n); }
+ public void edges(GraphViz.Node n) {
+ if (hp.size()==1) { hp.iterator().next().edges(n); return; }
+ for(Forest f : hp) f.edges(n);
+ }
public GraphViz.Node toGraphViz(GraphViz gv) {
- if (hp.size()==0) return null;
+ //if (hp.size()==0) return null;
if (hp.size()==1) return hp.iterator().next().toGraphViz(gv);
if (gv.hasNode(this)) return gv.createNode(this);
GraphViz.Node n = gv.createNode(this);