X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=33b3b1172464dd93588888c80c1473f49ccdaaaf;hp=a83d3ed6dd4cb2287ef53d5085912e6340e07371;hb=45d799349e635f1a99e3974e4504a43d5a7aaf33;hpb=95c87aa402977de2b96c48bd14c439b46ad49777 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index a83d3ed..33b3b11 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -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,12 @@ 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 walk(String tag, Object[] argo) { if (argo.length==0) return super.walk(tag, argo); @@ -199,7 +204,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 +239,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 +255,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 +268,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) { @@ -273,6 +279,7 @@ public class MetaGrammar extends StringWalker { if (!keeping) { for(int k=0; k