X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=c96d2ff86e419f36f718c585a8edd30ba7e2c0ec;hb=b366a301b090a285c372f4fd77ab7472440f7d30;hp=92c05dec866b91efae40ffc3c82875ade83fa4d8;hpb=0ab024f487647f99eb000345c29c2f8e9b52a200;p=sbp.git diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 92c05de..c96d2ff 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -115,14 +115,14 @@ public class MetaGrammar extends StringWalker { if ("\\n".equals(head)) return new Character('\n'); else if ("\\r".equals(head)) return new Character('\r'); else if ("grammar".equals(head)) { for(Tree t : tree.children()) walk(t); return this; } - else if ("*".equals(head)) return Repeat.many0((Element)walk(tree.child(0))); - else if ("+".equals(head)) return Repeat.many1((Element)walk(tree.child(0))); - else if ("+/".equals(head)) return Repeat.many1((Element)walk(tree.child(0)), (Element)walk(tree.child(1))); - else if ("*/".equals(head)) return Repeat.many0((Element)walk(tree.child(0)), (Element)walk(tree.child(1))); - else if ("++/".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)), (Element)walk(tree.child(1))); - else if ("**".equals(head)) return Repeat.maximal0((Element)walk(tree.child(0))); - else if ("++".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0))); - else if ("?".equals(head)) return Repeat.maybe((Element)walk(tree.child(0))); + else if ("*".equals(head)) return Repeat.many0((Element)walk(tree.child(0)), repeatTag()); + else if ("+".equals(head)) return Repeat.many1((Element)walk(tree.child(0)), repeatTag()); + else if ("+/".equals(head)) return Repeat.many1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("*/".equals(head)) return Repeat.many0((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("++/".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)), (Element)walk(tree.child(1)), repeatTag()); + else if ("**".equals(head)) return Repeat.maximal0((Element)walk(tree.child(0)), repeatTag()); + else if ("++".equals(head)) return Repeat.maximal1((Element)walk(tree.child(0)), repeatTag()); + else if ("?".equals(head)) return Repeat.maybe((Element)walk(tree.child(0)), repeatTag()); else if ("!".equals(head)) { Element e = (Element)walk(tree.child(0)); dropAll.add(e); return e; } else if ("&".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true)); else if ("and".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true)); @@ -136,8 +136,10 @@ public class MetaGrammar extends StringWalker { carets.put(ret, s); dropAll.add(ret); return ret; + /* } else if ("^^".equals(head)) { return new Keep(walk(tree,0)); + */ } else if ("psx".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence(); else if ("nonTerminal".equals(head)) return getNonTerminal(string(tree.child(0))); else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])Reflection.lub(walk(tree, 1)), false, false); @@ -155,10 +157,12 @@ public class MetaGrammar extends StringWalker { else if ("ps".equals(head)) return new PreSequence((Object[])walk(tree,0), null); else if (":".equals(head)) { String s = string(tree.child(0)); - return new Keep("_".equals(s)?walk(tree,1):new PreSequence(new Object[] { walk(tree, 1) }, convertLabel(s)).buildUnion()); + return new Keep(s,walk(tree,1)); } else if ("::".equals(head)) { PreSequence p = (PreSequence)walk(tree, 1); - p.tag = convertLabel(string(tree.child(0))); + String s = string(tree.child(0)); + if (s.equals("[]")) p.unwrap = true; + else p.tag = convertLabel(s); return p; } else if ("=>".equals(head)) { @@ -176,11 +180,13 @@ public class MetaGrammar extends StringWalker { } static class Keep { - final Object o; - public Keep(Object o) { this.o = o; } + public final String label; + public final Object o; + public Keep(String label, Object o) { this.label = label; this.o = o; } } - public String convertLabel(String label) { return label; } + public Object convertLabel(String label) { return label; } + public Object repeatTag() { return null; } public Object walk(String tag, Object[] argo) { if (argo.length==0) return super.walk(tag, argo); @@ -199,7 +205,7 @@ public class MetaGrammar extends StringWalker { public Element noFollow = null; public final HashSet and = new HashSet(); public final HashSet not = new HashSet(); - public /*final*/ String tag; + public /*final*/ Object tag; public final Object[] o; public PreSequence sparse(Object e) { @@ -234,8 +240,8 @@ public class MetaGrammar extends StringWalker { boolean[] drops = null; public PreSequence(Object o) { this(new Object[] { o }, null); } public PreSequence(Object[] o) { this(o, null); } - public PreSequence(Object[] o, String tag) { this(o, tag, null); } - public PreSequence(Object[] o, String tag, boolean[] drops) { + public PreSequence(Object[] o, Object tag) { this(o, tag, null); } + public PreSequence(Object[] o, Object tag, boolean[] drops) { this.o = o; this.tag = tag; this.drops = drops==null ? new boolean[o.length] : drops; @@ -250,7 +256,7 @@ public class MetaGrammar extends StringWalker { public boolean unwrap = false; public Sequence buildSequence() { return buildSequence(null, false, false); } public Sequence buildSequence(Union u) { return buildSequence(u, false, false); } - public Sequence buildSequence(Union u, boolean lame, String tag) { + public Sequence buildSequence(Union u, boolean lame, Object tag) { this.tag = tag; return buildSequence(u, lame, false); } @@ -263,6 +269,7 @@ public class MetaGrammar extends StringWalker { } HashSet set = new HashSet(); Element[] o2 = o==null ? new Element[0] : new Element[o.length]; + Object[] labels = new Object[drops.length]; int nonDrop = 0; boolean keeping = false; if (o != null) { @@ -270,9 +277,11 @@ public class MetaGrammar extends StringWalker { for(int i=0; i