checkpoint
authoradam <adam@megacz.com>
Fri, 14 Jul 2006 03:11:33 +0000 (23:11 -0400)
committeradam <adam@megacz.com>
Fri, 14 Jul 2006 03:11:33 +0000 (23:11 -0400)
darcs-hash:20060714031133-5007d-563e59f5b3100c26db3a7c9170d070dcd190d8c8.gz

src/edu/berkeley/sbp/meta/MetaGrammarBindings.java
src/edu/berkeley/sbp/misc/Demo.java

index 667b6a6..b381360 100644 (file)
@@ -18,7 +18,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
     public static String prefix = "";
     
     /** A grammar (a set of nonterminals) */
-    public static class GrammarNode extends HashMap<String,NonTerminalNode> implements NonTerminalSource {
+    public static class GrammarNode extends HashMap<String,NonTerminalNode> {
         public NonTerminalNode[] getNonTerminals() {
             return (NonTerminalNode[])values().toArray(new NonTerminalNode[0]);
         }
@@ -30,9 +30,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
                 this.put(nt.name, nt);
             }
         }
-        public @bind.as("Grammar") GrammarNode(Object[] nt) {
-            add(nt);
-        }
+        public @bind.as("Grammar") GrammarNode(Object[] nt) { add(nt); }
         private void add(Object[] obs) {
             for(Object o : obs) {
                 if (o==null) continue;
@@ -43,7 +41,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
                         throw new RuntimeException("duplicate definition of nonterminal \""+nt.name+"\"");
                     this.put(nt.name, nt);
                 }
-                else if (o instanceof NonTerminalSource) add(((NonTerminalSource)o).getNonTerminals());
+                else if (o instanceof GrammarNode) add(((GrammarNode)o).getNonTerminals());
             }
         }
         public String toString() {
@@ -91,8 +89,7 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
         if (as==null) as = "";
         else if ("".equals(as)) { }
         else as = as +".";
-        
-        System.err.println("#import " + fileName + " as " + as);
+
         try {
             Tree t = new CharParser(MetaGrammar.newInstance()).parse(new FileInputStream("tests/"+fileName)).expand1();
             Tree.TreeFunctor<Object,Object> red = (Tree.TreeFunctor<Object,Object>)t.head();
@@ -107,16 +104,13 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
         }
     }
 
-    public static interface NonTerminalSource {
-        public NonTerminalNode[] getNonTerminals();
-    }
-
-    public static class NonTerminalNode extends UnionNode implements NonTerminalSource {
+    public static class NonTerminalNode extends UnionNode {
         public boolean rep;
         public String  name = null;
         public String sep = null;
         public NonTerminalNode[] getNonTerminals() { return new NonTerminalNode[] { this }; }
-        public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) { this(name, sequences, false); }
+        public @bind.as("NonTerminal") NonTerminalNode(@bind.arg String name, @bind.arg Seq[][] sequences) {
+            this(name, sequences, false); }
         public NonTerminalNode(String name, Seq[][] sequences, boolean rep) { this(name, sequences, rep, null); }
         public NonTerminalNode(String name, Seq[][] sequences, boolean rep, String sep) {
             this.name = prefix + name;
@@ -355,9 +349,10 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
 
     public static @bind.as("^")   ElementNode caret(final String s) {
         final String thePrefix = prefix;
-        return new Drop(new Constant(CharRange.string(s)) {
+        return new Constant(CharRange.string(s)) {
                 public String getOwnerTag() { return thePrefix+s; }
-            });
+                public boolean drop() { return true; }
+            };
     }
 
     public static @bind.as("~")   ElementNode tilde(final ElementNode e) {
@@ -421,39 +416,43 @@ public class MetaGrammarBindings extends AnnotationGrammarBindings {
 
     }
 
+    public static abstract class ElementNode {
+        public String getLabel() { return null; }
+        public String getOwnerTag() { return null; }
+        public boolean drop() { return false; }
+        public abstract Element build(Context cx, NonTerminalNode cnt);
+    }
+
+    public static abstract class ElementNodeWrapper extends ElementNode {
+        protected ElementNode _e;
+        public ElementNodeWrapper(ElementNode e) { this._e = e; }
+        public String getLabel() { return _e.getLabel(); }
+        public String getOwnerTag() { return _e.getOwnerTag(); }
+        public boolean drop() { return _e.drop(); }
+        public Element build(Context cx, NonTerminalNode cnt) { return _e.build(cx, cnt); }
+    }
+
     public static class Constant extends ElementNode {
         Element constant;
         public Constant(Element constant) { this.constant = constant; }
         public Element build(Context cx, NonTerminalNode cnt) { return constant; }
     }
-    public abstract static class PostProcess extends ElementNode {
+
+    public abstract static class PostProcess extends ElementNodeWrapper {
         ElementNode e;
-        public PostProcess(ElementNode e) { this.e = e; }
-        public Element build(Context cx, NonTerminalNode cnt) { return postProcess(e.build(cx, cnt)); }
+        public PostProcess(ElementNode e) { super(e); }
+        public Element build(Context cx, NonTerminalNode cnt) { return postProcess(_e.build(cx, cnt)); }
         public abstract Element postProcess(Element e);
     }
-    public static abstract class ElementNode {
-        public String getLabel() { return null; }
-        public String getOwnerTag() { return null; }
-        public boolean drop() { return false; }
-        public abstract Element build(Context cx, NonTerminalNode cnt);
-    }
 
-    public static class Drop extends ElementNode {
-        public ElementNode e;
-        public Drop(ElementNode e) { this.e = e; }
-        public String getLabel() { return null; }
+    public static class Drop extends ElementNodeWrapper {
+        public Drop(ElementNode e) { super(e); }
         public boolean drop() { return true; }
-        public String getOwnerTag() { return e.getOwnerTag(); }
-        public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); }
     }
 
-    public static class Label extends ElementNode {
+    public static class Label extends ElementNodeWrapper {
         public String label;
-        public ElementNode e;
-        public Label(String label, ElementNode e) { this.e = e; this.label = label; }
+        public Label(String label, ElementNode e) { super(e); this.label = label; }
         public String getLabel() { return label; }
-        public String getOwnerTag() { return e.getOwnerTag(); }
-        public Element build(Context cx, NonTerminalNode cnt) { return e.build(cx, cnt); }
     }
 }
index e8d38ee..b118bbf 100644 (file)
@@ -30,7 +30,6 @@ public class Demo {
         public static @bind.as("/") class Divide   extends BinOp { }
         public static @bind.as("+") class Add      extends BinOp { }
         public static @bind.as("-") class Subtract extends BinOp { }
-
     }