X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FSequence.java;h=d274013904da23504c899ae9ab62651a2f7e1c63;hp=83d9b6f16bd3dda24d8b662c430eb71dc1ea1775;hb=21da21b94e794fa4d7c7207327764895d92ea528;hpb=f33c05adc5aa3dd324c5352cdbd6f4b55359acad diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index 83d9b6f..d274013 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -36,6 +36,8 @@ public abstract class Sequence extends Element implements Iterable { //////////////////////////////////////////////////////////////////////////////// public Element noFollow = null; + public String name = null; + public void setName(String name) { this.name = name; } public final Topology noFollow() { return noFollow==null ? null : noFollow.toAtom(); } Topology toAtom() { @@ -45,9 +47,11 @@ public abstract class Sequence extends Element implements Iterable { protected final Element[] elements; + HashSet needed; + HashSet hated; final HashSet needs; final HashSet hates; - boolean lame = false; + public boolean lame = false; final Position firstp; Position firstp() { return firstp; } @@ -56,6 +60,12 @@ public abstract class Sequence extends Element implements Iterable { protected Sequence(Element[] elements, HashSet and, HashSet not) { this.needs = and==null ? new HashSet() : and; this.hates = not==null ? new HashSet() : not; + if (this.needs != null) + for(Sequence s : this.needs) + (s.needed==null?(s.needed=new HashSet()):s.needed).add(this); + if (this.hates != null) + for(Sequence s : this.hates) + (s.hated==null?(s.hated=new HashSet()):s.hated).add(this); this.elements = elements; this.firstp = new Position(0); } @@ -66,8 +76,7 @@ public abstract class Sequence extends Element implements Iterable { Forest epsilonForm() { if (epsilonForm==null) { epsilonForm = new Forest.Ref(); - Forest fo = firstp().rewrite(null); - epsilonForm.merge(fo); + epsilonForm.merge(firstp().rewrite2(null)); } return epsilonForm; } @@ -91,11 +100,6 @@ public abstract class Sequence extends Element implements Iterable { } boolean isFirst() { return pos==0; } - boolean isRightNullable(Walk.Cache cache) { - if (isLast()) return true; - if (!element().possiblyEpsilon(cache)) return false; - return next().isRightNullable(cache); - } /** the element immediately after this Position, or null if this is the last Position */ public Element element() { return pos>=elements.length ? null : elements[pos]; } @@ -112,8 +116,11 @@ public abstract class Sequence extends Element implements Iterable { // Reduction ///////////////////////////////////////////////////////////////////////////////// final Forest rewrite(Token.Location loc) { - if (this==firstp() && eps) return epsilonForm; - eps = true; + if (this==firstp()) return epsilonForm(); + return rewrite2(loc); + } + + final Forest rewrite2(Token.Location loc) { for(int i=0; i { } Forest ret = Sequence.this.postReduce(loc, holder); for(int k=0; k { for(Position p = Sequence.this.firstp(); p != null; p = p.next()) { ret.append(' '); if (p==this) ret.append(" | "); - if (p.element()!=null) ret.append(p.element().possiblyEpsilon(null) ? "["+p.element()+"]" : p.element()); + if (p.element()!=null) ret.append(p.element()); else ret.append(' '); } ret.append("}>"); @@ -159,7 +165,7 @@ public abstract class Sequence extends Element implements Iterable { private final Object result; public Constant(Element[] e, Object result, HashSet and, HashSet not) { super(e, and, not); this.result = result; } public Forest postReduce(Token.Location loc, Forest[] args) { - return (Forest)Forest.leaf(loc, result, this); + return (Forest)Forest.leaf(loc, result); } static class Drop extends Constant { public Drop(Element[] e, HashSet and, HashSet not, boolean lame) { @@ -174,27 +180,27 @@ public abstract class Sequence extends Element implements Iterable { private final int idx; public Singleton(Element e, HashSet and, HashSet not) { this(new Element[] { e }, 0, and, not); } public Singleton(Element[] e, int idx, HashSet and, HashSet not) { super(e, and, not); this.idx = idx; } - public Forest postReduce(Token.Location loc, Forest[] args) { return (Forest)Forest.singleton(loc, args[idx], this); } + public Forest postReduce(Token.Location loc, Forest[] args) { return (Forest)Forest.singleton(loc, args[idx]); } } - static class Unwrap extends Sequence { + public static class Unwrap extends Sequence { private boolean[] drops; public Unwrap(Element[] e, HashSet and, HashSet not) { super(e, and, not); this.drops = null; } public Unwrap(Element[] e, boolean[] drops, HashSet and, HashSet not) { super(e, and, not); this.drops = drops; } public Forest postReduce(Token.Location loc, Forest[] args) { for(int i=0; i[] args2 = new Forest[count]; int j = 0; for(int i=0; i and, HashSet not) { this(tag, e, null, and, not); } @@ -209,7 +215,7 @@ public abstract class Sequence extends Element implements Iterable { int j = 0; for(int i=0; i