From: adam Date: Sun, 23 Jul 2006 06:20:25 +0000 (-0400) Subject: make sure we track Input.Region for epsilon reductions (important for ambiguity-hunting) X-Git-Tag: tag_for_25-Mar~96 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=8a5250c184672495fae152e096b2e800749cd0db make sure we track Input.Region for epsilon reductions (important for ambiguity-hunting) darcs-hash:20060723062025-5007d-1a90bd90e98f2f4926b9e9def5457198b4ba4ae7.gz --- diff --git a/src/edu/berkeley/sbp/Ambiguous.java b/src/edu/berkeley/sbp/Ambiguous.java index 6138577..37a857c 100644 --- a/src/edu/berkeley/sbp/Ambiguous.java +++ b/src/edu/berkeley/sbp/Ambiguous.java @@ -20,6 +20,7 @@ public class Ambiguous extends Exception { // FIXME: print the input region that was ambiguously matched StringBuffer sb = new StringBuffer(); sb.append("unresolved ambiguity at "+ambiguity.getRegion()+"; shared subtrees are shown as \"*\" "); + //sb.append("\noffending text: "); for(Tree result : ht) { sb.append("\n possibility: "); StringBuffer sb2 = new StringBuffer(); diff --git a/src/edu/berkeley/sbp/Element.java b/src/edu/berkeley/sbp/Element.java index 7eb6a59..f7a8978 100644 --- a/src/edu/berkeley/sbp/Element.java +++ b/src/edu/berkeley/sbp/Element.java @@ -16,6 +16,6 @@ public abstract class Element implements SequenceOrElement { abstract StringBuffer toString(StringBuffer sb); /** returns the Forest resulting from matching this element against the empty string */ - Forest epsilonForm() { throw new Error("element " + this + " has no epsilon form"); } + Forest epsilonForm(Input.Region loc) { throw new Error("element " + this + " has no epsilon form"); } } diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java index ee3bfbc..43ffb10 100644 --- a/src/edu/berkeley/sbp/Forest.java +++ b/src/edu/berkeley/sbp/Forest.java @@ -21,6 +21,7 @@ public abstract class Forest implements GraphViz.ToGraphViz { public void expand(HashSet> ht) { expand(ht, new HashSet>(), null); } static Forest create(Input.Region loc, NodeType head, Forest[] children, boolean lift) { + if (loc == null) throw new Error(); return new One(loc, head, children, lift); } diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 5ede971..d4cf42f 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -327,7 +327,7 @@ class GSS { } if (n==null) return; Forest[] holder = new Forest[r.pos]; - if (r.pos==0) n.finish(r, r.zero(), n.phase()); + if (r.pos==0) n.finish(r, r.zero(n.phase().getLocation().createRegion(n.phase().getLocation())), n.phase()); else n.reduce(r, r.pos-1, n.phase(), null); } else { if (r.pos<=0) throw new Error("called wrong form of reduce()"); diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index c77ad6e..74d7101 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -27,7 +27,7 @@ public abstract class Parser { Input.Location loc = input.getLocation(); Token tok = input.next(); GSS.Phase current = gss.new Phase(null, this, null, tok, loc, input.getLocation(), null); - current.newNode(null, Forest.create(null, null, null, false), pt.start, true); + current.newNode(null, Forest.create(loc.createRegion(loc), null, null, false), pt.start, true); int count = 1; for(int idx=0;;idx++) { Input.Location oldloc = loc; diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index 5680d6c..84a2dc6 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -84,10 +84,10 @@ public abstract class Sequence implements Iterable, SequenceOrElement { // DO NOT MESS WITH THE FOLLOWING LINE!!! private Forest.Many epsilonForm = null; - Forest epsilonForm() { + Forest epsilonForm(Input.Region loc) { if (epsilonForm!=null) return epsilonForm; epsilonForm = new Forest.Many(); - epsilonForm.merge(firstp().rewrite(null, false)); + epsilonForm.merge(firstp().rewrite(loc, false)); return epsilonForm; } @@ -100,10 +100,10 @@ public abstract class Sequence implements Iterable, SequenceOrElement { class Position implements IntegerMappable { private Forest zero = null; - public Forest zero() { + public Forest zero(Input.Region reg) { if (zero != null) return zero; if (pos > 0) throw new Error(); - return zero = rewrite(null); + return zero = rewrite(reg); } @@ -135,10 +135,10 @@ public abstract class Sequence implements Iterable, SequenceOrElement { final Forest rewrite(Input.Region loc) { return rewrite(loc, true); } private final Forest rewrite(Input.Region loc, boolean epsilonCheck) { - if (epsilonCheck && this==firstp()) return epsilonForm(); + if (epsilonCheck && this==firstp()) return epsilonForm(loc); for(int i=0; i ret = Sequence.this.postReduce(loc, holder, this); diff --git a/src/edu/berkeley/sbp/Union.java b/src/edu/berkeley/sbp/Union.java index d52c6e9..f1f65b1 100644 --- a/src/edu/berkeley/sbp/Union.java +++ b/src/edu/berkeley/sbp/Union.java @@ -70,14 +70,14 @@ public class Union extends Element implements Iterable { // Epsilon Form ////////////////////////////////////////////////////////////////////////////// // FIXME - private Forest.Many epsilonForm = null; - Forest epsilonForm() { - if (epsilonForm != null) return epsilonForm; - epsilonForm = new Forest.Many(); + //private Forest.Many epsilonForm = null; + Forest epsilonForm(Input.Region loc) { + //if (epsilonForm != null) return epsilonForm; + Forest.Many epsilonForm = new Forest.Many(); for(Sequence s : this) { // FIXME FIXME FIXME if (new Walk.Cache().possiblyEpsilon(s)) - epsilonForm.merge(s.epsilonForm()); + epsilonForm.merge(s.epsilonForm(loc)); } return epsilonForm; } diff --git a/tests/java15.test b/tests/java15.test index 968eaf7..976fb75 100644 --- a/tests/java15.test +++ b/tests/java15.test @@ -7,5 +7,6 @@ public class Baz < A extends Object , Q super Foo,Bop> > { } protected abstract int bar(int c); + protected abstract int bop( ); }