X-Git-Url: http://git.megacz.com/?p=sbp.git;a=blobdiff_plain;f=src%2Fedu%2Fberkeley%2Fsbp%2Fmisc%2FMetaGrammar.java;h=ab359c619396447ac72e7e355fb3b79ea692f493;hp=f1ae308b359349f28e5a391897c0a598a516bab7;hb=eeba855277aa8280f844757b18b681bbea68b174;hpb=c1519a9645e80f123c485a15931b193a22140184 diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index f1ae308..ab359c6 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -15,7 +15,6 @@ public class MetaGrammar extends ReflectiveWalker { return ret.toString(); } - // FIXME private static HashSet dropAll = new HashSet(); // Statics ////////////////////////////////////////////////////////////////////////////// @@ -52,15 +51,14 @@ public class MetaGrammar extends ReflectiveWalker { // MetaGrammar ////////////////////////////////////////////////////////////////////////////// - public PreSequence _amp_(PreSequence p, Object[] o) { return p.and(new PreSequence(o, null).buildSequence(null, true, false, true)); } - public PreSequence _amp__tilde_(PreSequence p, Object[] o) { return p.not(new PreSequence(o, null).buildSequence(null, true, false, true)); } + public PreSequence _amp_(PreSequence p, Object[] o) { return p.and(new PreSequence(o, null).buildSequence(null, true, false)); } + public PreSequence _amp__tilde_(PreSequence p, Object[] o) { return p.not(new PreSequence(o, null).buildSequence(null, true, false)); } public Element epsilon(Object o, Object b) { return Union.epsilon; } public Object _leftparen__rightparen_(Object o) { return Union.epsilon; } public Element _rightparen_(Object e) { return SELF; } public Union nonTerminal(String s) { return nonTerminal(s, null, false, false); } public Union _colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, false); } public Union _bang__colon__colon__equals_(String s, PreSequence[][] p) { return nonTerminal(s, p, false, true); } - public Union _colon__colon__equals_(boolean q, String s, PreSequence[][] p) { return nonTerminal(s, p, false, q); } public Object _leftparen_(PreSequence[][] p) { return nonTerminal("anon"+(anon++), p, false, false); } public Union nonTerminal(String str, PreSequence[][] s, boolean synthetic, boolean dropAll) { Union n = str.equals(startSymbol) ? g : nt.get(str); @@ -73,7 +71,7 @@ public class MetaGrammar extends ReflectiveWalker { HashSet temp = new HashSet(); for(PreSequence pre : s[i]) { pre.not.addAll(seqs); - Sequence seq = pre.buildSequence(n, false, dropAll, false); + Sequence seq = pre.buildSequence(n, false, dropAll); temp.add(seq); n.add(seq); } @@ -110,9 +108,11 @@ public class MetaGrammar extends ReflectiveWalker { if (o2==null) o2 = new Object[0]; Object[] o3 = new Object[o1.length + o2.length + 1]; System.arraycopy(o1, 0, o3, 0, o1.length); - o3[o1.length] = new MyLift(s); + o3[o1.length] = string(s); System.arraycopy(o2, 0, o3, o1.length+1, o2.length); - return new PreSequence(o3); + PreSequence ret = new PreSequence(o3, s); + ret.drops[o1.length] = o3.length>1; + return ret; } public PreSequence _slash_(PreSequence p, Object sep) { return p.sparse(sep); } @@ -143,11 +143,6 @@ public class MetaGrammar extends ReflectiveWalker { return set(ret); } - public class MyLift { - public final String s; - public MyLift(String s) { this.s = s; } - } - public class PreSequence { public final HashSet and = new HashSet(); public final HashSet not = new HashSet(); @@ -198,8 +193,8 @@ public class MetaGrammar extends ReflectiveWalker { u.add(buildSequence(u)); return u; } - public Sequence buildSequence(Union u) { return buildSequence(u, false, false, false); } - public Sequence buildSequence(Union u, boolean lame, boolean dropAll, boolean keeper) { + public Sequence buildSequence(Union u) { return buildSequence(u, false, false); } + public Sequence buildSequence(Union u, boolean lame, boolean dropAll) { for(Sequence s : and) u.add(s); for(Sequence s : not) u.add(s); HashSet set = new HashSet(); @@ -210,7 +205,6 @@ public class MetaGrammar extends ReflectiveWalker { for(int i=0; i1; } else o2[j] = (Element)oi; if (MetaGrammar.dropAll.contains(o2[j])) drops[j] = true; @@ -220,9 +214,10 @@ public class MetaGrammar extends ReflectiveWalker { } } Element[] expansion = o2; - Sequence ret = dropAll || lame || keeper ? Sequence.drop(expansion, and, not, lame) : null; - if (ret==null && tag!=null) ret = Sequence.rewritingSequence(tag, expansion, drops, and, not); - if (ret==null) { + Sequence ret = null; + if (dropAll || lame) ret = Sequence.drop(expansion, and, not, lame); + else if (tag!=null) ret = Sequence.rewritingSequence(tag, expansion, drops, and, not); + else { int idx = -1; for(int i=0; i