X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=b1de3b1471a0138482a79f59093609ecf411bbde;hp=963a3177b81d046f5a5589952116a18e3ff023b9;hb=6ba9ea820f9626a7504da6cf442e2cef1601914f;hpb=017b5ed533ca298fe5ae1078e2a59da1d2d95ea2 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 963a317..b1de3b1 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -103,6 +103,9 @@ public class MetaGrammar extends StringWalker { return ret; } + // hack, this doens't really work if you're nesting + HashSet keep = new HashSet(); + public Sequence sequence(Object o, boolean lame) { return new PreSequence((Element[])Reflection.lub((Object[])o), null).buildSequence(null, lame, false); } @@ -132,8 +135,9 @@ public class MetaGrammar extends StringWalker { carets.put(ret, s); dropAll.add(ret); return ret; - } - else if ("psx".equals(head)) return ((PreSequence)walk(tree, 0)).buildSequence(); + } 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[][])walk(tree, 1), false, false); else if ("=".equals(head)) return nonTerminal(string(tree.child(0)), (Sequence[][])walk(tree, 1), false, false); @@ -167,6 +171,11 @@ public class MetaGrammar extends StringWalker { else return super.walk(tree); } + static class Keep { + final Object o; + public Keep(Object o) { this.o = o; } + } + public String convertLabel(String label) { return label; } public Object walk(String tag, Object[] argo) { @@ -251,10 +260,12 @@ public class MetaGrammar extends StringWalker { HashSet set = new HashSet(); Element[] o2 = o==null ? new Element[0] : new Element[o.length]; int nonDrop = 0; + int keeping = -1; if (o != null) { int j = 0; for(int i=0; i