From: adam Date: Thu, 22 Dec 2005 01:38:10 +0000 (-0500) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~502 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=2c399ca4d7e658266c974f43f26e5a55944f9042 checkpoint darcs-hash:20051222013810-5007d-45177dc302d6ce693aa4986d87788ae788103d33.gz --- diff --git a/src/edu/berkeley/sbp/misc/MetaGrammar.java b/src/edu/berkeley/sbp/misc/MetaGrammar.java index 5eeb4a5..d631e8a 100644 --- a/src/edu/berkeley/sbp/misc/MetaGrammar.java +++ b/src/edu/berkeley/sbp/misc/MetaGrammar.java @@ -51,15 +51,6 @@ public class MetaGrammar extends ReflectiveWalker { // MetaGrammar ////////////////////////////////////////////////////////////////////////////// - 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 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); if (n == null) nt.put(str, n = new Union(str, synthetic)); @@ -111,6 +102,13 @@ public class MetaGrammar extends ReflectiveWalker { } public PreSequence _slash_(PreSequence p, Object sep) { return p.sparse(sep); } + public String string(Tree tree) { + String ret = ""; + if (tree.head()!=null) ret += tree.head(); + for(Tree t : tree.children()) ret += string(t); + return ret; + } + public Object walk(Tree tree) { String head = tree.head(); if (tree.numChildren()==0) return super.walk(tree); @@ -124,6 +122,15 @@ public class MetaGrammar extends ReflectiveWalker { else if ("**".equals(head)) return Repeat.maximal(Repeat.many0((Element)walk(tree.child(0)))); else if ("++".equals(head)) return Repeat.maximal(Repeat.many1((Element)walk(tree.child(0)))); else if ("?".equals(head)) return Repeat.maybe((Element)walk(tree.child(0))); + else if ("&".equals(head)) return ((PreSequence)walk(tree,0)).and(new PreSequence((Element[])Reflection.lub((Object[])walk(tree, 1)), null).buildSequence(null, true, false)); + else if ("&~".equals(head)) return ((PreSequence)walk(tree,0)).not(new PreSequence((Element[])Reflection.lub((Object[])walk(tree, 1)), null).buildSequence(null, true, false)); + else if ("epsilon".equals(head)) return Union.epsilon; + else if ("()".equals(head)) return Union.epsilon; + else if (")".equals(head)) return SELF; + else if ("nonTerminal".equals(head)) return nonTerminal(string(tree.child(0)), null, false, false); + else if ("::=".equals(head)) return nonTerminal(string(tree.child(0)), (PreSequence[][])walk(tree, 1), false, false); + else if ("!::=".equals(head)) return nonTerminal(string(tree.child(0)), (PreSequence[][])walk(tree, 1), false, true); + else if ("(".equals(head)) return nonTerminal("anon"+(anon++), (PreSequence[][])walk(tree, 0), false, false); else return super.walk(tree); } diff --git a/src/edu/berkeley/sbp/misc/TreeWalker.java b/src/edu/berkeley/sbp/misc/TreeWalker.java index 74f3f07..f8a4496 100644 --- a/src/edu/berkeley/sbp/misc/TreeWalker.java +++ b/src/edu/berkeley/sbp/misc/TreeWalker.java @@ -10,6 +10,9 @@ import edu.berkeley.sbp.*; public abstract class TreeWalker { public abstract Object walk(T head, Object[] args); + public Object walk(Tree tree, int idx) { + return walk(tree.child(idx)); + } public void walkChildren(Tree tree) { for(Tree child : tree.children()) walk(child); }