GrammarAST.BacktickNode
authoradam <adam@megacz.com>
Sun, 27 May 2007 23:31:52 +0000 (19:31 -0400)
committeradam <adam@megacz.com>
Sun, 27 May 2007 23:31:52 +0000 (19:31 -0400)
darcs-hash:20070527233152-5007d-77792ad5b79da0ee4ee3efecd8c4d45443c1438e.gz

src/edu/berkeley/sbp/meta/GrammarAST.java
src/edu/berkeley/sbp/meta/MetaGrammar.java

index 05c7b39..297886b 100644 (file)
@@ -21,7 +21,7 @@ public class GrammarAST {
      *  parsing with this Union should be provided to <tt>buildFromAST</tt>
      */
     public static Union getMetaGrammar() {
-        return MetaGrammar.newInstance();
+        return buildFromAST(MetaGrammar.meta, "s", new File[0]);
     }
 
     /**
@@ -107,7 +107,7 @@ public class GrammarAST {
 
         if (head.equals("!"))   return new DropNode(walkElement(t.child(0)));
         if (head.equals("^"))   return new LiteralNode(walkString(t.child(0)), true);
-        if (head.equals("`"))   return walkElement(t.child(0)).lifted();
+        if (head.equals("`"))   return new BacktickNode(walkElement(t.child(0)));
         if (head.equals("Quoted")) return stringifyChildren(t);
         if (head.equals("Literal")) return new LiteralNode(walkString(t.child(0)));
         if (head.equals("->")) return walkSeq(t.child(0)).follow(walkElement(t.child(1)));
@@ -154,7 +154,7 @@ public class GrammarAST {
                 try {
                     String newPrefix = t.size()<2 ? "" : (walkString(t.child(1))+".");
                     FileInputStream fis = new FileInputStream(file);
-                    Tree tr = new CharParser(MetaGrammar.newInstance()).parse(fis).expand1();
+                    Tree tr = new CharParser(getMetaGrammar()).parse(fis).expand1();
                     return (GrammarNode)new GrammarAST(includes, newPrefix).walk(tr);
                 } catch (Exception e) {
                     throw new RuntimeException("while parsing " + file, e);
@@ -207,10 +207,9 @@ public class GrammarAST {
         }
     }
 
+    /** a node in the AST which is resolved into an Element */
     private abstract class ElementNode {
-        public boolean lifted = false;
-        public Seq ownerSeq = null;
-        public ElementNode lifted() { this.lifted = true; return this; }
+        public boolean isLifted() { return false; }
         public boolean drop(Context cx) { return false; }
         public Atom toAtom(Context cx) { throw new Error("can't convert a " + this.getClass().getName() + " to an atom: " + this); }
         public abstract Element build(Context cx, NonTerminalNode cnt, boolean dropall);
@@ -314,7 +313,6 @@ public class GrammarAST {
             for(int i=0; i<elements.length; i++) {
                 if (elements[i]==null)
                     throw new RuntimeException();
-                elements[i].ownerSeq = this;
             }
             // FIXME: this whole mechanism is sketchy
             if (check)
@@ -392,7 +390,7 @@ public class GrammarAST {
                 throw new RuntimeException("multiple non-dropped elements in sequence: " + Sequence.create("", els));
             boolean[] lifts = new boolean[elements.length];
             for(int i=0; i<elements.length; i++)
-                lifts[i] = elements[i].lifted;
+                lifts[i] = elements[i].isLifted();
             if (!multiNonDrop) {
                 if (idx == -1) 
                     ret = tag==null
@@ -504,6 +502,11 @@ public class GrammarAST {
         public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return _e.build(cx, cnt, dropall); }
     }
 
+    private class BacktickNode extends ElementNodeWrapper {
+        public BacktickNode(ElementNode e) { super(e); }
+        public boolean isLifted() { return true; }
+    }
+
     private class TildeNode extends ElementNodeWrapper {
         public TildeNode(ElementNode e) { super(e); }
         public Atom toAtom(Context cx) { return (Atom)((Topology<Character>)_e.toAtom(cx).complement()); }
index aadf9ec..cb138be 100644 (file)
@@ -12,11 +12,6 @@ import java.io.*;
 
 class MetaGrammar {
 
-    /** create a grammar corresponding to the SBP metagrammar (<tt>meta.g</tt>) */
-    public static Union newInstance() {
-        return GrammarAST.buildFromAST(MetaGrammar.meta, "s", new File[0]);
-    }
-
     /** Used to rebuild MetaGrammar.java, and not for much else */
     public static void main(String[] args) throws Exception {
         if (args.length != 2) {
@@ -178,6 +173,8 @@ class MetaGrammar {
 
 
 
+
+
         // 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, "NonTerminal", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "s", new edu.berkeley.sbp.Tree[] { })}),
         new edu.berkeley.sbp.Tree(null, "RHS", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "|", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Elements", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "NonTerminalReference", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "Word", new edu.berkeley.sbp.Tree[] { new edu.berkeley.sbp.Tree(null, "w", new edu.berkeley.sbp.Tree[] { }),
@@ -951,3 +948,5 @@ new edu.berkeley.sbp.Tree(null, "Grammar", new edu.berkeley.sbp.Tree[] { new edu
 
 
 
+
+