From: adam Date: Sun, 22 Jan 2006 08:06:41 +0000 (-0500) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~343 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=3cecf04045858842a95aaba3e32d086a8d7f88aa checkpoint darcs-hash:20060122080641-5007d-ada17d447bd9b9646a22b3e6f105d262fafb2765.gz --- diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 51c8d1a..7fe8afa 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -102,6 +102,9 @@ public class MetaGrammar extends StringWalker { return ret; } + public Sequence sequence(Object o, boolean lame) { + return new PreSequence((Element[])Reflection.lub((Object[])o), null).buildSequence(null, lame, false); + } public Object walk(Tree tree) { String head = tree.head(); if (tree.numChildren()==0) return super.walk(tree); @@ -117,10 +120,8 @@ public class MetaGrammar extends StringWalker { 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)) { Element e = (Element)walk(tree.child(0)); dropAll.add(e); return e; } - else if ("&".equals(head)) - return ((Sequence)walk(tree,0)).and(new PreSequence((Element[])Reflection.lub((Object[])walk(tree, 1)), null).buildSequence(null, true, false)); - else if ("&~".equals(head)) - return ((Sequence)walk(tree,0)).not(new PreSequence((Element[])Reflection.lub((Object[])walk(tree, 1)), null).buildSequence(null, true, false)); + else if ("&".equals(head)) return ((Sequence)walk(tree,0)).and(sequence(walk(tree, 1), true)); + else if ("&~".equals(head)) return ((Sequence)walk(tree,0)).not(sequence(walk(tree, 1), true)); else if ("epsilon".equals(head)) return Union.epsilon; else if ("()".equals(head)) return Union.epsilon; else if (")".equals(head)) return SELF; @@ -137,8 +138,7 @@ public class MetaGrammar extends StringWalker { else if ("psy".equals(head)) return (PreSequence)walk(tree, 0); else if ("->".equals(head)) { PreSequence p = (PreSequence)walk(tree, 0); p.noFollow = (Element)walk(tree, 1); return p; } else if ("/".equals(head)) return ((PreSequence)walk(tree, 0)).sparse((Element)walk(tree, 1)); - else if ("~".equals(head)) - return new Hack(new Atom.Invert(new Atom.Infer((Element)walk(tree, 0)))); + else if ("~".equals(head)) return new Hack(new Atom.Invert(new Atom.Infer((Element)walk(tree, 0)))); else if ("ps".equals(head)) return new PreSequence((Element[])walk(tree, 0)); else if ("qprod".equals(head)) { String s = string(tree.child(0)); diff --git a/src/edu/berkeley/sbp/util/VisitableMap.java b/src/edu/berkeley/sbp/util/VisitableMap.java index ab41a81..df6a1a1 100644 --- a/src/edu/berkeley/sbp/util/VisitableMap.java +++ b/src/edu/berkeley/sbp/util/VisitableMap.java @@ -1,7 +1,13 @@ package edu.berkeley.sbp.util; import java.util.*; +/** a Map that knows how to apply an Invokable to all its elements */ public interface VisitableMap { + + /** invokes ivbc on each element of this map, passing constant arguments b and c */ public void invoke(K k, Invokable ivbc, B b, C c); + + /** returns true iff this map contains some value v for key k */ public boolean contains(K k); + }