X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FWalk.java;h=8c6ecae17d897509e18d764dddb2346275f46135;hp=04e36aeb47f1aae6e3db58083fdeb67a80b65cd1;hb=5d18f5606c9296e6b0c5749f05fc68f358ace2f6;hpb=1a249057cbfd2180910e46672eafee3af46ae470 diff --git a/src/edu/berkeley/sbp/Walk.java b/src/edu/berkeley/sbp/Walk.java index 04e36ae..8c6ecae 100644 --- a/src/edu/berkeley/sbp/Walk.java +++ b/src/edu/berkeley/sbp/Walk.java @@ -90,7 +90,7 @@ abstract class Walk { public Topology sequence(Sequence seq) { for(Position p = seq.firstp(); p!=null && !p.isLast(); p = p.next()) { walk(p.element()); - if (!p.element().possiblyEpsilon(c)) break; + if (!c.possiblyEpsilon(p.element())) break; } return cs; } @@ -130,7 +130,7 @@ abstract class Walk { Position mp = null; for(Position pos = a.firstp(); pos != null && !pos.isLast(); pos = pos.next()) { if (matched) cs = cs.union(c.first(pos.element(), cs.empty())); - if (pos.isLast()) { matched = (matched && pos.element().possiblyEpsilon(c)); continue; } + if (pos.isLast()) { matched = (matched && c.possiblyEpsilon(pos.element())); continue; } boolean good = false; if (e instanceof Atom) { Topology top = c.atoms.get(pos.element()); @@ -175,5 +175,13 @@ abstract class Walk { public Topology first(Element e, Topology empty) { return new Walk.First(empty, this).walk(e); } + final boolean possiblyEpsilon(Element e) { + Walk.Cache cache = this; + Boolean ret = possiblyEpsilon.get(e); + if (ret != null) return ret.booleanValue(); + ret = new Walk.PossiblyEpsilon().walk(e) ? Boolean.TRUE : Boolean.FALSE; + possiblyEpsilon.put(e, ret); + return ret; + } } }