checkpoint
authoradam <adam@megacz.com>
Thu, 20 Jul 2006 08:30:39 +0000 (04:30 -0400)
committeradam <adam@megacz.com>
Thu, 20 Jul 2006 08:30:39 +0000 (04:30 -0400)
darcs-hash:20060720083039-5007d-c8431d4203e487b2fcd671c8f858d09aa875af36.gz

src/edu/berkeley/sbp/GSS.java
src/edu/berkeley/sbp/Parser.java
src/edu/berkeley/sbp/Walk.java

index 1a8ef11..816c086 100644 (file)
@@ -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) {
index d4d5415..2344e15 100644 (file)
@@ -94,7 +94,10 @@ public abstract class Parser<Tok, Result> {
         }
 
         /** the start state */
-        public final State<Tok>   start;
+        public  final State<Tok>   start;
+
+        /** the state from which no reductions can be done */
+        private final State<Tok>   dead_state;
 
         /** used to generate unique values for State.idx */
         private int master_state_idx = 0;
@@ -117,6 +120,8 @@ public abstract class Parser<Tok, Result> {
                 cache.ys.addAll(e, new Walk.YieldSet(e, cache).walk());
             HashSet<Position> hp = new HashSet<Position>();
             reachable(start0, hp);
+
+            this.dead_state = new State<Tok>(new HashSet<Position>(), all_states, all_elements);
             this.start = new State<Tok>(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<Tok, Result> {
 
             // Interface Methods //////////////////////////////////////////////////////////////////////////////
 
-            boolean             isAccepting()               { return accept; }
-            public Iterator<Position>  iterator()                  { return hs.iterator(); }
+            boolean             isAccepting()           { return accept; }
+            public Iterator<Position>  iterator()       { return hs.iterator(); }
 
-            boolean             canShift(Tok t)           { return oshifts.contains(t); }
+            boolean             canShift(Tok t)         { return oshifts!=null && oshifts.contains(t); }
             <B,C> void          invokeShifts(Tok t, Invokable<State<Tok>,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)); }
             <B,C> void          invokeReductions(Tok t, Invokable<Position,B,C> 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<Tok, Result> {
                 //         "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<Element,Position> move = new HashMapBag<Element,Position>();
                 for(Position p : hs) {
                     Element e = p.element();
@@ -265,7 +271,11 @@ public abstract class Parser<Tok, Result> {
                 for(Element y : move) {
                     HashSet<Position> h = move.getAll(y);
                     State<Tok> s = all_states.get(h) == null ? new State<Tok>(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);
                 }
             }
 
index 496edd6..b58dbc5 100644 (file)
@@ -39,6 +39,7 @@ abstract class Walk<T> {
             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));