checkpoint
authoradam <adam@megacz.com>
Sat, 15 Apr 2006 09:41:56 +0000 (05:41 -0400)
committeradam <adam@megacz.com>
Sat, 15 Apr 2006 09:41:56 +0000 (05:41 -0400)
darcs-hash:20060415094156-5007d-dbb8f07d430d33213ae32bad64a60936fe5c2610.gz

src/edu/berkeley/sbp/Forest.java
src/edu/berkeley/sbp/GSS.java
src/edu/berkeley/sbp/misc/MetaGrammar.java
src/edu/berkeley/sbp/util/GraphViz.java

index 3790562..9dabf60 100644 (file)
@@ -71,7 +71,7 @@ public abstract class Forest<T> /*extends PrintableTree<Forest.MyBody<T>>*/
         public GraphViz.Node toGraphViz(GraphViz gv) {
             if (gv.hasNode(this)) return gv.createNode(this);
             GraphViz.Node n = gv.createNode(this);
-            n.label = headToString()==null?"":headToString();
+            n.label = StringUtil.escapify(headToString()==null?"":headToString(), "\r\n");
             n.directed = true;
             n.comment = reduction==null?null:reduction+"";
             edges(n);
index 02f521e..87bcf04 100644 (file)
@@ -21,6 +21,7 @@ class GSS {
     HashMapBag<Integer,Sequence>       expectedInhibit = new HashMapBag<Integer,Sequence>();
     HashMapBag<Sequence,Phase.Waiting> waiting         = new HashMapBag<Sequence,Phase.Waiting>();
     HashMapBag<Integer,Sequence>       performed       = new HashMapBag<Integer,Sequence>();
+    HashMapBag<Integer,Sequence>       lastperformed   = new HashMapBag<Integer,Sequence>();
     
     /** FIXME */
     public  Forest.Ref finalResult;
@@ -62,6 +63,8 @@ class GSS {
 
         public void reset() throws ParseFailed {
             waiting.clear();
+            lastperformed.clear();
+            lastperformed.addAll(performed);
             performed.clear();
             hash = new IntPairMap<Phase.Node>();
             singularReductions = new IntPairMap<Forest>();
@@ -101,6 +104,14 @@ class GSS {
             int pos = parent==null?0:parent.phase()==null?0:parent.phase().pos;
             Sequence owner = reduction==null ? null : reduction.owner();
             if (reduction!=null) {
+                if (owner.hates!=null) {
+                    for (Sequence s : lastperformed.getAll(pos))
+                        if (owner.hates.contains(s))
+                            return;
+                    for (Sequence s : performed.getAll(pos))
+                        if (owner.hates.contains(s))
+                            return;
+                }
                 if (inhibited.contains(pos, owner)) return;
                 if (owner.needs != null)
                     for(Sequence s : owner.needs)
@@ -108,14 +119,16 @@ class GSS {
                             waiting.add(s, new Waiting(parent, pending, state, fromEmptyReduction, reduction));
                             return;
                         }
+                /*
                 if ((owner.needed != null && owner.needed.size()>0) ||
                     (owner.hated != null && owner.hated.size()>0) ||
                     (owner.hates != null && owner.hates.size()>0))
                     performed.add(pos, owner);
+                */
             }
+            if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos);
             if (!owner.lame)
                 newNode(parent, pending, state, fromEmptyReduction);
-            if (reduction!=null) uninhibit(reduction, parent==null?0:parent.phase().pos);
             if (reduction != null) {
                 boolean redo = true;
                 while(redo) {
@@ -159,11 +172,13 @@ class GSS {
         }
 
         public void inhibit(int p, Sequence s) {
-            if (inhibited.contains(p, s)) return;
-            inhibited.add(p, s);
+            //if (inhibited.contains(p, s)) return;
+            if (performed.contains(p, s)) throw new Reset();
+            /*
             if (s.hated!=null)
                 for(Sequence s2 : s.hated)
                     uninhibit(p, s2);
+            */
             if (s.needed!=null)
                 for(Sequence s2 : s.needed)
                     if (performed.contains(p, s2))
@@ -173,6 +188,8 @@ class GSS {
 
         public void uninhibit(Position r, int p) { uninhibit(p, r.owner()); }
         public void uninhibit(int p, Sequence s) {
+            if (performed.contains(p, s)) return;
+            performed.add(p, s);
             if (s.hated != null)
                 for(Sequence seq : s.hated)
                     inhibit(p, seq);
@@ -198,8 +215,12 @@ class GSS {
                 }
                 /*
                 if (expectedInhibit.size() > 0) {
+                    System.out.println("\n!!!!");
+                    for(int i : expectedInhibit)
+                        for(Sequence es : expectedInhibit.getAll(i))
+                            System.out.println("   " + i + ": " + es);
+                    System.out.println("");
                     inhibited.removeAll(expectedInhibit);
-                    System.out.println("\n!!!!\n");
                     throw new Reset();
                 }
                 */
index 1ef7ff0..972d3a1 100644 (file)
@@ -551,6 +551,10 @@ public class MetaGrammar extends StringWalker {
 
 
 
+
+
+
+
         // DO NOT EDIT STUFF BELOW: IT IS AUTOMATICALLY GENERATED
 new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "=", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}),
         new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "psx", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "ps", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "!", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "nonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, null, new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }),
@@ -1236,3 +1240,7 @@ new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu
 
 
 
+
+
+
+
index ff8f46c..ef08fae 100644 (file)
@@ -119,7 +119,7 @@ public class GraphViz {
 
     public void dump(PrintWriter pw) {
         IdentityHashMap<Node,Node> done = new IdentityHashMap<Node,Node>();
-        pw.println("digraph G { rankdir=LR; \n");
+        pw.println("digraph G { rankdir=LR; ordering=out; \n");
         for(Group g : groups.values()) {
             pw.println("  { rank=same;\n");
             for(Node n : groups.keySet())