X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FForest.java;h=b9c4fcc9ef40d1726c75f761f27b58e1d99824d0;hb=142b31e063c97d2d6dc141a9e687d49b7f2ab826;hp=e74d81eda484d97caaec05bacf7c52f5b94dad39;hpb=743754674298bb8a3303bdffd3b5c5cc0de1b158;p=sbp.git diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java index e74d81e..b9c4fcc 100644 --- a/src/edu/berkeley/sbp/Forest.java +++ b/src/edu/berkeley/sbp/Forest.java @@ -7,7 +7,11 @@ import java.util.*; import java.lang.reflect.*; /** an efficient representation of a collection of trees (Tomita's shared packed parse forest) */ -public abstract class Forest /*extends PrintableTree>*/ implements Visitable> { +public abstract class Forest /*extends PrintableTree>*/ implements Visitable>, IntegerMappable, GraphViz.ToGraphViz { + + private static int master_idx = 0; + private final int idx = master_idx++; + public int toInt() { return idx; } /** assume that this forest contains exactly one tree and return it; otherwise throw an exception */ public final Tree expand1() throws Ambiguous, ParseFailed { @@ -20,7 +24,6 @@ public abstract class Forest /*extends PrintableTree>*/ impl /** expand this forest into a set of trees */ public HashSet> expand(boolean toss) { - //if (toss) scan(); final HashSetTreeConsumer ret = new HashSetTreeConsumer(); visit(new TreeMaker2(toss, ret), null, null); if (toss && ret.size() > 1) throw new InnerAmbiguous(this); @@ -42,21 +45,41 @@ public abstract class Forest /*extends PrintableTree>*/ impl static Forest singleton(Input.Location loc, Position p) { return create(loc, null, new Forest[] { }, false, true, p); } static Forest singleton(Input.Location loc, Forest body, Position p) { - return create(loc, null, new Forest[] { body }, false, true, p); } + //return create(loc, null, new Forest[] { body }, false, true, p); + return body; + } static Forest leaf(Input.Location loc, T tag, Position p) { return create(loc, tag, null, false, false, p); } - public static Forest create(Input.Location loc, T tag, Forest[] tokens, boolean unwrap, boolean singleton, Position p) { return new MyBody(loc, tag, tokens, unwrap, singleton, p); } - // Body ////////////////////////////////////////////////////////////////////////////// - protected static interface Body { + protected static interface Body extends GraphViz.ToGraphViz { void expand(int i, TreeMaker h); } - + public abstract void edges(GraphViz.Node n); protected static class MyBody extends Forest implements Body /* extends PrintableTree> implements */ { + public boolean isTransparent() { return false; } + public boolean isHidden() { return false; } + public GraphViz.Node toGraphViz(GraphViz gv) { + if (gv.hasNode(this)) return gv.createNode(this); + GraphViz.Node n = gv.createNode(this); + n.label = headToString()==null?"":headToString(); + n.directed = true; + edges(n); + return n; + } + public void edges(GraphViz.Node n) { + for(int i=0; i void visit(Invokable,B,C> ivbc, B b, C c) { ivbc.invoke(this, b, c); } @@ -107,7 +130,7 @@ public abstract class Forest /*extends PrintableTree>*/ impl } } - protected String headToString() { return null; } + protected String headToString() { return tag==null?null:tag.toString(); } protected String headToJava() { return null; } protected String left() { return "{"; } protected String right() { return "}"; } @@ -125,7 +148,26 @@ public abstract class Forest /*extends PrintableTree>*/ impl static class Ref extends Forest { private FastSet> hp = new FastSet>(); public Ref() { } + public int toInt() { + if (hp.size()==1) return hp.iterator().next().toInt(); + return super.toInt(); + } public void merge(Forest p) { if (p!=this) hp.add(p, true); } + + 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 GraphViz.Node toGraphViz(GraphViz gv) { + 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); + n.label = "?"; + n.color = "red"; + for(Forest f : hp) n.edge(f); + return n; + } + public void visit(Invokable,B,C> ivbc, B b, C c) { if (hp==null) return; for(Forest f : hp)