From 628b3a8eaafdbe8507e841076051bff42aadf5ee Mon Sep 17 00:00:00 2001 From: adam Date: Mon, 29 May 2006 17:31:05 -0400 Subject: [PATCH] tentative checkpoint darcs-hash:20060529213105-5007d-39fbb5d1817f5b5c197129b92e9d62f5a113ff7a.gz --- src/edu/berkeley/sbp/Forest.java | 1 + src/edu/berkeley/sbp/GSS.java | 77 +++++++++++++++--------- src/edu/berkeley/sbp/misc/MetaGrammarTree.java | 12 ++++ src/edu/berkeley/sbp/misc/RegressionTests.java | 2 +- tests/regression.tc | 23 ------- 5 files changed, 63 insertions(+), 52 deletions(-) diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java index 3790562..1b92a76 100644 --- a/src/edu/berkeley/sbp/Forest.java +++ b/src/edu/berkeley/sbp/Forest.java @@ -159,6 +159,7 @@ public abstract class Forest /*extends PrintableTree>*/ * viewed, it becomes immutable */ static class Ref extends Forest { + public HashSet parents = new HashSet(); public boolean ambiguous() { if (hp.size()==0) return false; if (hp.size()==1) return hp.iterator().next().ambiguous(); diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 80fbd5c..11904d8 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -299,18 +299,30 @@ class GSS { /** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */ public Phase phase() { return Phase.this; } - //private Forest pending() { return !Phase.this.closed ? holder : holder.resolve(); } - private HashMap resultMap = new HashMap(); + //private HashMap resultMap = new HashMap(); + + private HashSet resultMap = new HashSet(); public void merge(Node parent, Forest result) { - //holder.merge(result); + for(Forest.Ref f : results()) { + if (f.parents.contains(parent) && f.parents.size()==1) { + f.merge(result); + return; + } + } + Forest.Ref f = new Forest.Ref(); + f.parents.add(parent); + f.merge(result); + resultMap.add(f); + set.add(parent, true); + /* Forest.Ref f = (Forest.Ref)resultMap.get(parent); if (f==null) { f = new Forest.Ref(); resultMap.put(parent, f); } f.merge(result); set.add(parent, true); + */ } - //public Iterable childrenFor(Forest result) { return resultMap.getAll(result); } - public Iterable results() { return resultMap.values(); } - private Forest pending(Node n) { + public Iterable results() { return resultMap; } + //private Forest pending(Node n) { //return !Phase.this.closed ? holder : holder.resolve(); /* for(Forest f : resultMap) @@ -318,8 +330,10 @@ class GSS { return f; return null; */ + /* return resultMap.get(n); } + */ public FastSet parents() { return set; } public void performReductions() { @@ -344,12 +358,12 @@ class GSS { if (n==null) return; Forest[] holder = new Forest[r.pos]; if (r.pos==0) n.finish(r, r.zero(), n.phase(), holder); - else n.reduce(r, r.pos-1, n.phase(), holder, null, n.pending(n)); + else n.reduce(r, r.pos-1, n.phase(), holder, null, null); } else { Forest[] holder = new Forest[r.pos]; if (r.pos<=0) throw new Error("called wrong form of reduce()"); int pos = r.pos-1; - n.reduce(r, pos, n.phase(), holder, n2, n.pending(n)); + n.reduce(r, pos, n.phase(), holder, n2, null); } } @@ -371,16 +385,20 @@ class GSS { // since the same reduction can appear in more than one state. if (only != null) { - holder[pos] = pending(only); - System.arraycopy(holder, 0, r.holder, 0, holder.length); - for(int i=0; i)result).parents) { + if (child!=only) continue; + pending = holder[pos] = result; + System.arraycopy(holder, 0, r.holder, 0, holder.length); + for(int i=0; i)result).parents) + child.finish(r, rex, target, holder); } } } else { if (only != null) { - holder[pos] = pending(only); - only.reduce(r, pos-1, target, holder, null, only.pending(only)); + for(Forest result : results()) + for(Node child : ((Forest.Ref)result).parents) { + if (child!=only) continue; + holder[pos] = result; + only.reduce(r, pos-1, target, holder, null, null); + } } else { - for(Node child : this.parents()) { - holder[pos] = pending(child); - child.reduce(r, pos-1, target, holder, null, child.pending(child)); - } + for(Forest result : results()) + for(Node child : ((Forest.Ref)result).parents) { + holder[pos] = result; + child.reduce(r, pos-1, target, holder, null, null); + } } } holder[pos] = old; diff --git a/src/edu/berkeley/sbp/misc/MetaGrammarTree.java b/src/edu/berkeley/sbp/misc/MetaGrammarTree.java index 60d0da8..4c4888b 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammarTree.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammarTree.java @@ -60,6 +60,12 @@ public class MetaGrammarTree { + + + + + + // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "G", new edu.berkeley.sbp.Tree[] { }), new edu.berkeley.sbp.Tree(null, "r", new edu.berkeley.sbp.Tree[] { }), @@ -596,3 +602,9 @@ new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu + + + + + + diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java index 533cb89..196382c 100644 --- a/src/edu/berkeley/sbp/misc/RegressionTests.java +++ b/src/edu/berkeley/sbp/misc/RegressionTests.java @@ -96,7 +96,7 @@ public class RegressionTests { Forest res = null; ParseFailed pfe = null; CharParser parser = new CharParser(grammar); - parser.helpgc = false; + //parser.helpgc = false; try { res = tib ? /*new CharParser(grammar).parse(new Tib(input))*/ null diff --git a/tests/regression.tc b/tests/regression.tc index 1c47dc4..025f56e 100644 --- a/tests/regression.tc +++ b/tests/regression.tc @@ -390,26 +390,3 @@ testcase { x = [123] } -testcase { - input "if (bar!) baz!;"; - output "IfThen:{id:{x:{b x:{a r}}} id:{x:{b x:{a z}}}}"; - - s = Expr ";" - Expr = IfThen - | IfThenElse - | id:: id "!" - id = [a-z] | x:: [a-z] id - IfThen = IfThen:: - "if" "(" Expr ")" - Expr - /ws - IfThenElse = IfThenElse:: - "if" "(" Expr ")" - NotIfThenExpr - "else" - Expr - /ws - NotIfThenExpr = (Expr & [a-z]+) - SpaceIfThen = (~[])*// !IfThen - ws = [\n ]** -} \ No newline at end of file -- 1.7.10.4