add some commenting to GrammarAST
[sbp.git] / src / edu / berkeley / sbp / meta / GrammarAST.java
index 046c3ac..e039b37 100644 (file)
@@ -137,6 +137,7 @@ public class GrammarAST {
         }
         if (head.equals("\"\"")) return "";
         if (head.equals("\n"))   return "\n";
+        if (head.equals("\t"))   return "\t";
         if (head.equals("\r"))   return "\r";
         if (head.equals("SubGrammar")) return GrammarAST.buildFromAST(t.child(0), "s", resolver);
         if (head.equals("NonTerminal"))
@@ -220,10 +221,18 @@ public class GrammarAST {
         public abstract Element build(Context cx, NonTerminalNode cnt, boolean dropall);
     }
 
+    /** a union, produced by a ( .. | .. | .. ) construct */
     private class UnionNode extends ElementNode {
+
+        /** each component of a union is a sequence */
         public Seq[][] sequences;
-        public String  sep = null;
+
+        /** if the union is a NonTerminal specified as Foo*=..., this is true */
         public boolean rep;
+
+        /** if the union is a NonTerminal specified as Foo* /ws=..., then this is "ws" */
+        public String  sep = null;
+
         public UnionNode(Seq seq) { this(new Seq[][] { new Seq[] { seq } }); }
         public UnionNode(Seq[][] sequences) { this(sequences, false, null); }
         public UnionNode(Seq[][] sequences, boolean rep, String sep) {
@@ -283,6 +292,7 @@ public class GrammarAST {
         }
     }
 
+    /** a NonTerminal is always a union at the top level */
     private class NonTerminalNode extends UnionNode {
         public boolean alwaysDrop;
         public String  name = null;
@@ -295,21 +305,27 @@ public class GrammarAST {
         public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return cx.get(name); }
     }
 
+    /** a sequence */
     private class Seq {
+        /** elements of the sequence */
+        ElementNode[] elements;
+        /** follow-set, if explicit */
+        ElementNode follow;
+        /** tag to add when building the AST */
+        String tag = null;
+        /** positive conjuncts */
+        HashSet<Seq> and = new HashSet<Seq>();
+        /** negative conjuncts */
+        HashSet<Seq> not = new HashSet<Seq>();
         public boolean alwaysDrop = false;
         public boolean isDropped(Context cx) {
             if (alwaysDrop) return true;
             if (tag!=null) return false;
             for(int i=0; i<elements.length; i++)
-                if (!elements[i].isDropped(cx))
+                if (!elements[i].isDropped(cx) || ((elements[i] instanceof LiteralNode) && ((LiteralNode)elements[i]).caret))
                     return false;
             return true;
         }
-        HashSet<Seq> and = new HashSet<Seq>();
-        HashSet<Seq> not = new HashSet<Seq>();
-        ElementNode[] elements;
-        ElementNode follow;
-        String tag = null;
         public Seq(ElementNode e) { this(new ElementNode[] { e }); }
         public Seq(ElementNode[] elements) { this(elements, true); }
         public Seq(ElementNode[] el, boolean check) {
@@ -412,6 +428,7 @@ public class GrammarAST {
         }
     }
 
+    /** reference to a NonTerminal by name */
     private class ReferenceNode extends ElementNode {
         public String nonTerminal;
         public boolean parenthesized;
@@ -439,6 +456,7 @@ public class GrammarAST {
         }
     }
 
+    /** a literal string */
     private class LiteralNode extends ElementNode {
         private String string;
         private final String thePrefix = prefix;
@@ -460,6 +478,7 @@ public class GrammarAST {
         public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return CharAtom.string(string); }
     }
 
+    /** an atom (usually a character class) */
     private class AtomNode extends ElementNode {
         char[][] ranges;
         public AtomNode() { this(new char[0][]); }
@@ -473,6 +492,7 @@ public class GrammarAST {
         }
     }
 
+    /** a repetition */
     private class RepeatNode extends ElementNode {
         public ElementNode e, sep;
         public final boolean zero, many, max;
@@ -499,6 +519,7 @@ public class GrammarAST {
         }
     }
 
+    /** helper class for syntactic constructs that wrap another construct */
     private abstract class ElementNodeWrapper extends ElementNode {
         protected ElementNode _e;
         public ElementNodeWrapper(ElementNode e) { this._e = e; }
@@ -507,11 +528,13 @@ public class GrammarAST {
         public Element build(Context cx, NonTerminalNode cnt, boolean dropall) { return _e.build(cx, cnt, dropall); }
     }
 
+    /** a backtick node indicating that, when building the AST, the node's children should be inserted here */
     private class BacktickNode extends ElementNodeWrapper {
         public BacktickNode(ElementNode e) { super(e); }
         public boolean isLifted() { return true; }
     }
 
+    /** negation */
     private class TildeNode extends ElementNodeWrapper {
         public TildeNode(ElementNode e) { super(e); }
         public Atom toAtom(Context cx) { return (Atom)((Topology<Character>)_e.toAtom(cx).complement()); }