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);
private static Element set(Range.Set r) { return CharRange.set(r); }
private static Element string(String s) { return CharRange.string(s); }
- private static Atom infer(Element e) { return infer((Topology<Character>)Atom.toAtom(e)); }
- private static Atom infer(Topology<Character> t) { return new CharRange(new CharTopology(t)); }
+ /*private*/ static Atom infer(Element e) { return infer((Topology<Character>)Atom.toAtom(e)); }
+ /*private*/ static Atom infer(Topology<Character> t) { return new CharRange(new CharTopology(t)); }
private MetaGrammar() { }
}
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);
}
}
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);
+ System.err.println("resolvetag " + tag + " => " + ret);
} else {
int idx = -1;
for(int i=0; i<els.length; i++)
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;