From: adam Date: Thu, 20 Jul 2006 08:30:39 +0000 (-0400) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~114 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=ae0cef03f2e46f6ae6438f9a3e60ca36ff1a4643;hp=24112db237318c030b4d4f457d90c34fd69d652b checkpoint darcs-hash:20060720083039-5007d-c8431d4203e487b2fcd671c8f858d09aa875af36.gz --- diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 1a8ef11..816c086 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -133,8 +133,7 @@ class GSS { } } } - if (!owner.lame) - newNode(parent, pending, state, fromEmptyReduction); + newNode(parent, pending, state, fromEmptyReduction); if (reduction != null) { boolean redo = true; while(redo) { diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index d4d5415..2344e15 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -94,7 +94,10 @@ public abstract class Parser { } /** the start state */ - public final State start; + public final State start; + + /** the state from which no reductions can be done */ + private final State dead_state; /** used to generate unique values for State.idx */ private int master_state_idx = 0; @@ -117,6 +120,8 @@ public abstract class Parser { cache.ys.addAll(e, new Walk.YieldSet(e, cache).walk()); HashSet hp = new HashSet(); reachable(start0, hp); + + this.dead_state = new State(new HashSet(), all_states, all_elements); this.start = new State(hp, all_states, all_elements); // for each state, fill in the corresponding "row" of the parse table @@ -174,15 +179,15 @@ public abstract class Parser { // Interface Methods ////////////////////////////////////////////////////////////////////////////// - boolean isAccepting() { return accept; } - public Iterator iterator() { return hs.iterator(); } + boolean isAccepting() { return accept; } + public Iterator iterator() { return hs.iterator(); } - boolean canShift(Tok t) { return oshifts.contains(t); } + boolean canShift(Tok t) { return oshifts!=null && oshifts.contains(t); } void invokeShifts(Tok t, Invokable,B,C> irbc, B b, C c) { oshifts.invoke(t, irbc, b, c); } - boolean canReduce(Tok t) { return t==null ? eofReductions.size()>0 : oreductions.contains(t); } + boolean canReduce(Tok t) { return oreductions != null && (t==null ? eofReductions.size()>0 : oreductions.contains(t)); } void invokeReductions(Tok t, Invokable irbc, B b, C c) { if (t==null) for(Position r : eofReductions) irbc.invoke(r, b, c); else oreductions.invoke(t, irbc, b, c); @@ -252,6 +257,7 @@ public abstract class Parser { // "yields" [in one or more step] is used instead of "produces" [in exactly one step] // to avoid having to iteratively construct our set of States as shown in most // expositions of the algorithm (ie "keep doing XYZ until things stop changing"). + HashMapBag move = new HashMapBag(); for(Position p : hs) { Element e = p.element(); @@ -265,7 +271,11 @@ public abstract class Parser { 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); - gotoSetNonTerminals.put(y, s); + // 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); } } diff --git a/src/edu/berkeley/sbp/Walk.java b/src/edu/berkeley/sbp/Walk.java index 496edd6..b58dbc5 100644 --- a/src/edu/berkeley/sbp/Walk.java +++ b/src/edu/berkeley/sbp/Walk.java @@ -39,6 +39,7 @@ abstract class Walk { T ret = bottom(e); for(Sequence s : (Union)e) { ret = union((Union)e, ret, walk(s)); + // FIXME for(Sequence ss : s.needs()) ret = union((Union)e, ret, walk(ss)); for(Sequence ss : s.hates()) ret = union((Union)e, ret, walk(ss));