checkpoint
[sbp.git] / src / edu / berkeley / sbp / misc / MetaGrammar.java
index 3420ad5..a284938 100644 (file)
@@ -7,8 +7,6 @@ import java.io.*;
 
 public class MetaGrammar extends StringWalker {
 
-    public static Object repeatTag = null;
-
     public static Union make() throws Exception { return make(MetaGrammarTree.meta, "s"); }
     public static Union make(Tree<String> tree, String nt) throws Exception {
         Meta.MetaGrammarFile mgf = new Meta().new MetaGrammarFile(tree);
@@ -51,6 +49,7 @@ public class MetaGrammar extends StringWalker {
     }
 
     public static class Meta {
+        public Object repeatTag() { return null; }
         public Sequence resolveTag(String s, String nonTerminalName, Element[] els, Object[] labels, boolean [] drops) {
             return Sequence.rewritingSequence(s, els, labels, drops);
         }
@@ -208,7 +207,7 @@ public class MetaGrammar extends StringWalker {
                 }
                 Sequence ret = null;
                 if (dropAll)     ret = Sequence.drop(els, false);
-                else if (unwrap) ret = Sequence.unwrap(els, /*repeatTag FIXME*/null, drops);
+                else if (unwrap) ret = Sequence.unwrap(els, repeatTag(), drops);
                 else if (tag!=null) {
                     ret = resolveTag(tag, bc.currentNonTerminal==null ? null : bc.currentNonTerminal.name, els, labels, drops);
                 } else {
@@ -307,11 +306,11 @@ public class MetaGrammar extends StringWalker {
                 public Element build(BuildContext bc) {
                     return !maximal
                         ? (separator==null
-                           ? Sequence.repeat(element.build(bc), zero, many, null, null)
-                           : Sequence.repeat(element.build(bc), zero, many, separator.build(bc), null))
+                           ? Sequence.repeat(element.build(bc), zero, many, null, repeatTag())
+                           : Sequence.repeat(element.build(bc), zero, many, separator.build(bc), repeatTag()))
                         : (separator==null
-                           ? Sequence.repeatMaximal(infer(element.build(bc)), zero, many, null)
-                           : Sequence.repeatMaximal(element.build(bc), zero, many, infer(separator.build(bc)), null));
+                           ? Sequence.repeatMaximal(infer(element.build(bc)), zero, many, repeatTag())
+                           : Sequence.repeatMaximal(element.build(bc), zero, many, infer(separator.build(bc)), repeatTag()));
                 }
                 public MetaRepeat(MetaClause element, boolean maximal, MetaClause separator, boolean zero, boolean many) {
                     this.separator = separator;