X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2FParser.java;h=b2445b0675e146e302eccc727e09d41116c19f4c;hp=2344e15b96c2cb9f451c27f248edc3e04c15978f;hb=6af13e9dda011e2416e4f0ee3cc347e8e7fcafd7;hpb=ae0cef03f2e46f6ae6438f9a3e60ca36ff1a4643 diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index 2344e15..b2445b0 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -268,14 +268,24 @@ public abstract class Parser { move.addAll(y, hp); } } - for(Element y : move) { + OUTER: for(Element y : move) { HashSet h = move.getAll(y); State s = all_states.get(h) == null ? new State(h, all_states, all_elements) : all_states.get(h); // if a reduction is "lame", it should wind up in the dead_state after reducing - if (y instanceof Sequence && ((Sequence)y).lame) - ((HashMap)gotoSetNonTerminals).put(y, dead_state); - else - gotoSetNonTerminals.put(y, s); + if (y instanceof Sequence) { + for(Position p : hs) { + if (p.element() != null && (p.element() instanceof Union)) { + Union u = (Union)p.element(); + for(Sequence seq : u) + if (seq.needs.contains((Sequence)y) || seq.hates.contains((Sequence)y)) { + // FIXME: what if there are two "routes" to get to the sequence? + ((HashMap)gotoSetNonTerminals).put(y, dead_state); + continue OUTER; + } + } + } + } + gotoSetNonTerminals.put(y, s); } }