tentative checkpoint
authoradam <adam@megacz.com>
Tue, 30 May 2006 03:25:47 +0000 (23:25 -0400)
committeradam <adam@megacz.com>
Tue, 30 May 2006 03:25:47 +0000 (23:25 -0400)
darcs-hash:20060530032547-5007d-f271300cc6e31228efae40926763898e8cd186fe.gz

Makefile
src/edu/berkeley/sbp/GSS.java
src/edu/berkeley/sbp/Sequence.java
src/edu/berkeley/sbp/misc/MetaGrammarTree.java
tests/ifthen.tc [new file with mode: 0644]

index 4ce382c..45bddeb 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -53,6 +53,12 @@ loop: edu.berkeley.sbp.jar
                tests/testcase.g \
                tests/loop.tc
 
+ifthen: edu.berkeley.sbp.jar
+       $(java) -cp $< edu.berkeley.sbp.misc.RegressionTests \
+               tests/meta.g \
+               tests/testcase.g \
+               tests/ifthen.tc
+
 boot: edu.berkeley.sbp.jar
        cd src; \
        $(java) -cp ../$< \
index 9b091a7..3df0c21 100644 (file)
@@ -148,7 +148,6 @@ class GSS {
         }
 
         private boolean newNode2(Node p, Node parent, Forest pending, State state, boolean fromEmptyReduction) {
-            //if (p.parents().contains(parent)) return true;
             if (p.merge(parent, pending)) return true;
             p.parents().add(parent, true);
             if (p!=parent && !fromEmptyReduction && reducing) p.performReductions(parent);
@@ -273,22 +272,7 @@ class GSS {
         final class Node implements Invokable<Position, Node, Node>, IntegerMappable, GraphViz.ToGraphViz {
             public FastSet<Node> set = new FastSet<Node>();
 
-        public GraphViz.Node toGraphViz(GraphViz gv) {
-            if (gv.hasNode(this)) return gv.createNode(this);
-            GraphViz.Node n = gv.createNode(this);
-            n.label = ""+state.toStringx();
-            n.shape = "rectangle";
-            n.fill = "green";
-            //GraphViz.Node f = pending().toGraphViz(gv);
-            //n.add(f);
-            for(Forest result : results()) n.edge(result, "");
-            for(Node parent : parents()) n.edge(parent, "");
-            ((GraphViz.Group)phase().toGraphViz(gv)).add(n);
-            return n;
-        }
-        public boolean isTransparent() { return false; }
-        public boolean isHidden() { return false; }
-
+           
             private boolean allqueued = false;
 
             /** what state this node is in */
@@ -346,6 +330,7 @@ class GSS {
             }
 
             public void reduce(Position r, int pos, Phase target, Forest[] holder, Node only) {
+                holder = r.holder;
                 Forest old = holder[pos];
 
                 for(Forest result : results())
@@ -353,7 +338,7 @@ class GSS {
                         if (only != null && child!=only) continue;
                         holder[pos] = result;
                         if (pos==0) {
-                            System.arraycopy(holder, 0, r.holder, 0, holder.length);
+                            //System.arraycopy(holder, 0, r.holder, 0, holder.length);
                             for(int i=0; i<r.pos; i++) if (r.holder[i]==null) throw new Error("realbad");
                             child.finish(r, r.rewrite(phase().getLocation()), target, holder);
                         } else {
@@ -381,6 +366,23 @@ class GSS {
             }
             public int toInt() { return idx; }
             private final int idx = node_idx++;
+
+            // GraphViz //////////////////////////////////////////////////////////////////////////////
+
+            public GraphViz.Node toGraphViz(GraphViz gv) {
+                if (gv.hasNode(this)) return gv.createNode(this);
+                GraphViz.Node n = gv.createNode(this);
+                n.label = ""+state.toStringx();
+                n.shape = "rectangle";
+                n.fill = "green";
+                for(Forest result : results()) n.edge(result, "");
+                for(Node parent : parents()) n.edge(parent, "");
+                ((GraphViz.Group)phase().toGraphViz(gv)).add(n);
+                return n;
+            }
+            public boolean isTransparent() { return false; }
+            public boolean isHidden() { return false; }
+
         }
         private int node_idx = 0;
 
index b8e4263..e09ff72 100644 (file)
@@ -136,7 +136,7 @@ public abstract class Sequence extends Element implements Iterable<Element> {
                 if (holder[i]==null) throw new Error("bad " + i);
             }
             Forest<T> ret = Sequence.this.postReduce(loc, holder, this);
-            for(int k=0; k<pos; k++) holder[k] = null; // to help GC
+            //for(int k=0; k<pos; k++) holder[k] = null; // to help GC
             return ret;
         }
 
index 6191299..6fe8332 100644 (file)
@@ -74,6 +74,7 @@ public class MetaGrammarTree {
 
 
 
+
         // 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, "G", new edu.berkeley.sbp.Tree[] { }),
         new edu.berkeley.sbp.Tree(null, "r", new edu.berkeley.sbp.Tree[] { }),
@@ -624,3 +625,4 @@ new edu.berkeley.sbp.Tree(null, "grammar", new edu.berkeley.sbp.Tree[] { new edu
 
 
 
+
diff --git a/tests/ifthen.tc b/tests/ifthen.tc
new file mode 100644 (file)
index 0000000..dbb613d
--- /dev/null
@@ -0,0 +1,14 @@
+testcase {
+  input "if (foo) if (bar) baz else bop";
+  output "IfThen:{Identifier:{{f o o}} IfThenElse:{IfThen:{Identifier:{{b a r}} Identifier:{{b a z}}} Identifier:{{b o p}}}}";
+
+  s             = Expr
+
+  Expr          =              IfThen
+                | IfThenElse:: IfThen "else" Expr /ws &~ IfThen
+                | Identifier:: [a-z]++ 
+  IfThen        = IfThen:: "if" "(" Expr ")" Expr             /ws
+
+  ws            = [\n ]**
+
+}