X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FForest.java;h=8ed6eb503342eb8ba6763d7739c552df4dfe36e3;hp=8587dcb0cc680ba9539133eac5c2472dc0e049af;hb=842f3c9b981b35721bb50d49e85c11085b2040a3;hpb=96a2822a729e563a64173f22dc184bc972a200ef diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java index 8587dcb..8ed6eb5 100644 --- a/src/edu/berkeley/sbp/Forest.java +++ b/src/edu/berkeley/sbp/Forest.java @@ -32,7 +32,7 @@ public abstract class Forest { protected static class Body { - private final Token.Location location; + private final Token.Location location; private final T tag; private final Forest[] tokens; private final Sequence creator; @@ -44,6 +44,7 @@ public abstract class Forest { this.tag = tag; this.tokens = tokens==null ? emptyForestArray : new Forest[tokens.length]; if (tokens != null) System.arraycopy(tokens, 0, this.tokens, 0, tokens.length); + if (tokens != null) for(int i=0; i { private boolean kcache = false; private boolean keep = false; public boolean keep() { + return true; + /* if (kcache) return keep; kcache = true; for(Forest token : tokens) if (!token.valid()) return keep = false; return keep = creator==null || (creator.needs.size()==0 && creator.hates.size()==0); + */ } public boolean keep(Iterable> h) { if (keep()) return true; @@ -103,20 +107,26 @@ public abstract class Forest { return needs <= -1 * creator.needs.size(); } - + private boolean rep = false; public String toString() { - StringBuffer ret = new StringBuffer(); - for(int i=0; i 0) { - ret.append(q); - ret.append(" "); + if (rep) return "***"; + try { + rep = true; + StringBuffer ret = new StringBuffer(); + for(int i=0; i 0) { + ret.append(q); + ret.append(" "); + } } + String tail = ret.toString().trim(); + String head = (tag!=null && !tag.toString().equals("")) ? (tail.length() > 0 ? tag+":" : tag+"") : ""; + if (tail.length() > 0) tail = "{" + tail + "}"; + return head + tail; + } finally { + rep = false; } - String tail = ret.toString().trim(); - String head = (tag!=null && !tag.toString().equals("")) ? (tail.length() > 0 ? tag+":" : tag+"") : ""; - if (tail.length() > 0) tail = "{" + tail + "}"; - return head + tail; } } @@ -138,13 +148,14 @@ public abstract class Forest { public boolean valid = false; public Ref() { } public void merge(Forest p) { + //if (p==null) throw new Error("bad evil bad!"); if (res != null) throw new Error("already resolved!"); if (p==null) throw new Error(); - if (p!=this) hp.add(p); + if (p!=this) hp.add(p, true); } public Iterator> iterator() { return ((IterableForest)resolve()).iterator(); } public HashSet> expand(boolean toss) { return resolve().expand(toss); } - public boolean valid() { resolve(); return valid; } + public boolean valid() { return true; /*if (valid) return true; resolve(); return valid;*/ } public String toString() { return resolve().toString(); } public Forest resolve() { if (hp==null) return res; @@ -152,21 +163,28 @@ public abstract class Forest { FastSet nh = new FastSet(); for(Forest p : hp) for(Body b : (IterableForest)p) { - if (b.keep() && (b.creator==null || !b.creator.lame)) { valid = true; b.addTo(nh); } - else results = new HashSet(); + if (b.keep() && (b.creator==null || !b.creator.lame)) { + valid = true; + b.addTo(nh); + } else { + results = new HashSet(); + } } if (results != null) { - for(Forest p : hp) for(Body b : (IterableForest)p) results.add(b); + for(Forest p : hp) + for(Body b : (IterableForest)p) + results.add(b); for(Body b : results) { if (b.keep() && (b.creator==null || !b.creator.lame)) continue; - if (!b.keep(results)) continue; if (b.creator!=null && b.creator.lame) continue; + if (!b.keep(results)) continue; valid = true; b.addTo(nh); } } hp = null; - return res = new MultiForest(nh, valid); + res = new MultiForest(nh, valid); + return res; } } @@ -175,7 +193,7 @@ public abstract class Forest { private static class MultiForest extends IterableForest { private final FastSet> results; private boolean valid; - public boolean valid() { return valid; } + public boolean valid() { /*return valid;*/ return true; } private MultiForest(FastSet> results, boolean valid) { this.results = results; this.valid = valid; } public MultiForest(Token.Location loc, T tag, Forest[] tokens, Sequence creator, boolean unwrap, boolean singleton) { this.results = new FastSet>(new Body(loc, tag, tokens, creator, unwrap, singleton)); @@ -197,6 +215,11 @@ public abstract class Forest { public String toString() { if (toString != null) return toString; StringBuffer ret = new StringBuffer(); + if (results.size()==1) { + for(Forest.Body r : results) + ret.append(r); + return toString = ret.toString(); + } ret.append(" r : results) {