From: adam Date: Thu, 13 Jul 2006 09:08:46 +0000 (-0400) Subject: checkpoint X-Git-Tag: tag_for_25-Mar~164 X-Git-Url: http://git.megacz.com/?p=sbp.git;a=commitdiff_plain;h=c8a17fdd2e149fe5feecd96c71b7f2cab286ab96 checkpoint darcs-hash:20060713090846-5007d-29c31d94e929cead6018306da206dfdd2d6040f7.gz --- diff --git a/src/edu/berkeley/sbp/Forest.java b/src/edu/berkeley/sbp/Forest.java index cadf343..b00f069 100644 --- a/src/edu/berkeley/sbp/Forest.java +++ b/src/edu/berkeley/sbp/Forest.java @@ -77,11 +77,11 @@ public abstract class Forest /*extends PrintableTree>*/ public InnerAmbiguous(Forest f) { this.f = f; } } - static Forest singleton(Input.Location loc, Position p) { + static Forest singleton(Input.Region loc, Position p) { return create(loc, null, new Forest[] { }, false, true, p); } - static Forest singleton(Input.Location loc, Forest body, Position p) { return body; } - static Forest leaf(Input.Location loc, T tag, Position p) { return create(loc, tag, null, false, false, p); } - public static Forest create(Input.Location loc, T tag, Forest[] tokens, boolean unwrap, boolean singleton, Position p) { + static Forest singleton(Input.Region loc, Forest body, Position p) { return body; } + static Forest leaf(Input.Region loc, T tag, Position p) { return create(loc, tag, null, false, false, p); } + public static Forest create(Input.Region loc, T tag, Forest[] tokens, boolean unwrap, boolean singleton, Position p) { return new MyBody(loc, tag, tokens, unwrap, singleton, p); } // Body ////////////////////////////////////////////////////////////////////////////// @@ -121,14 +121,14 @@ public abstract class Forest /*extends PrintableTree>*/ ivbc.invoke(this, b, c); } - private final Input.Location location; + private final Input.Region location; private final T tag; private final Forest[] tokens; private final boolean unwrap; private final boolean singleton; private final Sequence.Position reduction; - private MyBody(Input.Location loc, T tag, Forest[] tokens, boolean unwrap, boolean singleton, Position reduction) { + private MyBody(Input.Region loc, T tag, Forest[] tokens, boolean unwrap, boolean singleton, Position reduction) { this.location = loc; this.tag = tag; this.tokens = tokens==null ? emptyForestArray : new Forest[tokens.length]; @@ -143,7 +143,7 @@ public abstract class Forest /*extends PrintableTree>*/ } private void gather(TaskList tl, HashSet>[] ht, HashSet> target, Tree[] trees, int i) { if (i==ht.length) { - target.add(new Tree(null, tag, trees)); + target.add(new Tree(location, tag, trees)); return; } for(Tree tree : ht[i]) { @@ -153,7 +153,7 @@ public abstract class Forest /*extends PrintableTree>*/ System.arraycopy(trees, 0, trees2, 0, trees.length-1); for(int j=0; j(null, tag, trees2)); + target.add(new Tree(location, tag, trees2)); } else { trees[i] = tree; gather(tl, ht, target, trees, i+1); @@ -190,9 +190,9 @@ public abstract class Forest /*extends PrintableTree>*/ } else { tokens[i].visit(new TreeBuilder(h.toss) { - public void start(T head, Input.Location loc) { } + public void start(T head, Input.Region loc) { } public void addTree(Tree t) { toks.add(t); } - public void finish(T head, Input.Location loc) { + public void finish(T head, Input.Region loc) { int old = h.toks.size(); h.addTree(new Tree(loc, head, toks.toArray(tree_hint))); expand(i+1, h); diff --git a/src/edu/berkeley/sbp/GSS.java b/src/edu/berkeley/sbp/GSS.java index 7af8b07..9c4b62b 100644 --- a/src/edu/berkeley/sbp/GSS.java +++ b/src/edu/berkeley/sbp/GSS.java @@ -342,7 +342,7 @@ public class GSS { for(Node child : ((Forest.Ref)result).parents) { if (only != null && child!=only) continue; holder[pos] = result; - if (pos==0) child.finish(r, r.rewrite(phase().getLocation()), target); + if (pos==0) child.finish(r, r.rewrite(new Input.Region(child.phase().getLocation(), phase().getLocation())), target); else child.reduce(r, pos-1, target, null); } diff --git a/src/edu/berkeley/sbp/Input.java b/src/edu/berkeley/sbp/Input.java index 846fd9a..407d843 100644 --- a/src/edu/berkeley/sbp/Input.java +++ b/src/edu/berkeley/sbp/Input.java @@ -23,6 +23,7 @@ public interface Input { public static class Region /* implements Topology> */ { public final Loc start; public final Loc end; + public String toString() { return start+"-"+end; } public Region(Loc a, Loc b) { switch(a.compareTo(b)) { case -1: diff --git a/src/edu/berkeley/sbp/Parser.java b/src/edu/berkeley/sbp/Parser.java index c5ebd7e..0d14563 100644 --- a/src/edu/berkeley/sbp/Parser.java +++ b/src/edu/berkeley/sbp/Parser.java @@ -15,7 +15,7 @@ public abstract class Parser { protected Parser(Table pt) { this.pt = pt; } /** implement this method to create the output forest corresponding to a lone shifted input token */ - public abstract Forest shiftToken(Tok t, Input.Location loc); + public abstract Forest shiftToken(Input.Location oldloc, Tok t, Input.Location newloc); public boolean helpgc = true; @@ -29,9 +29,10 @@ public abstract class Parser { current.newNode(null, Forest.leaf(null, null, null), pt.start, true); int count = 1; for(int idx=0;;idx++) { + Input.Location oldloc = loc; loc = input.getLocation(); current.reduce(); - Forest forest = current.token==null ? null : shiftToken((Tok)current.token, loc); + Forest forest = current.token==null ? null : shiftToken(oldloc, (Tok)current.token, loc); GSS.Phase next = gss.new Phase(current, this, current, input.next(), loc, forest); if (!helpgc) { FileOutputStream fos = new FileOutputStream("out-"+idx+".dot"); diff --git a/src/edu/berkeley/sbp/Sequence.java b/src/edu/berkeley/sbp/Sequence.java index 61a18e8..0ac3500 100644 --- a/src/edu/berkeley/sbp/Sequence.java +++ b/src/edu/berkeley/sbp/Sequence.java @@ -85,7 +85,7 @@ public abstract class Sequence extends Element implements Iterable { return epsilonForm; } - protected abstract Forest postReduce(Input.Location loc, Forest[] args, Position p); + protected abstract Forest postReduce(Input.Region loc, Forest[] args, Position p); // Position ////////////////////////////////////////////////////////////////////////////// @@ -127,8 +127,8 @@ public abstract class Sequence extends Element implements Iterable { // Position ///////////////////////////////////////////////////////////////////////////////// - final Forest rewrite(Input.Location loc) { return rewrite(loc, true); } - private final Forest rewrite(Input.Location loc, boolean epsilonCheck) { + final Forest rewrite(Input.Region loc) { return rewrite(loc, true); } + private final Forest rewrite(Input.Region loc, boolean epsilonCheck) { if (epsilonCheck && this==firstp()) return epsilonForm(); for(int i=0; i { private final Object result; public Constant(Element[] e, Object result) { super(e); this.result = result; } Sequence _clone() { return new Constant(elements, result); } - public Forest postReduce(Input.Location loc, Forest[] args, Position p) { + public Forest postReduce(Input.Region loc, Forest[] args, Position p) { return (Forest)Forest.leaf(loc, result, p); } static class Drop extends Constant { @@ -199,7 +199,7 @@ public abstract class Sequence extends Element implements Iterable { private final int idx; public Singleton(Element e) { this(new Element[] { e }, 0); } public Singleton(Element[] e, int idx) { super(e); this.idx = idx; } - public Forest postReduce(Input.Location loc, Forest[] args, Position p) { return (Forest)Forest.singleton(loc, args[idx], p); } + public Forest postReduce(Input.Region loc, Forest[] args, Position p) { return (Forest)Forest.singleton(loc, args[idx], p); } Sequence _clone() { return new Singleton(elements,idx); } } @@ -210,7 +210,7 @@ public abstract class Sequence extends Element implements Iterable { public Unwrap(Element[] e, Object tag) { super(e); this.drops = null; this.tag = tag; } public Unwrap(Element[] e, Object tag, boolean[] drops) { super(e); this.drops = drops; this.tag = tag; } Sequence _clone() { return new Unwrap(elements, drops); } - public Forest postReduce(Input.Location loc, Forest[] args, Position p) { + public Forest postReduce(Input.Region loc, Forest[] args, Position p) { for(int i=0; i { this.drops = drops == null ? new boolean[e.length] : drops; for(int i=0; i Forest postReduce(Input.Location loc, Forest[] args, Position p) { + public Forest postReduce(Input.Region loc, Forest[] args, Position p) { Forest[] args2 = new Forest[count]; int j = 0; for(int i=0; i final T head; Tree[] children; - final Input.Location location; + final Input.Region location; public T head() { return head; } public int numChildren() { return children.length; } @@ -22,10 +22,10 @@ public class Tree public Iterator> iterator() { return new ArrayIterator(children); } public Tree child(int i) { return children[i]; } - public Input.Location getLocation() { return location; } + public Input.Region getRegion() { return location; } - public Tree(Input.Location loc, T head) { this(loc, head, null); } - public Tree(Input.Location loc, T head, Tree[] children) { + public Tree(Input.Region loc, T head) { this(loc, head, null); } + public Tree(Input.Region loc, T head, Tree[] children) { this.location = loc; this.head = head; @@ -36,13 +36,14 @@ public class Tree protected String headToString() { return head==null?null:head.toString(); } protected String headToJava() { + // FIXME if (head==null) return null; if (head instanceof ToJava) { StringBuffer sb = new StringBuffer(); ((ToJava)head).toJava(sb); return sb.toString(); } - return head==null?"null":("\""+StringUtil.toJavaString(head.toString())+"\""); + return (head==null?"null":("\""+StringUtil.toJavaString(head.toString())+"\"")); } protected String left() { return "{"; } protected String right() { return "}"; } @@ -59,7 +60,7 @@ public class Tree public boolean isTransparent() { return false; } public boolean isHidden() { return false; } - public static interface TreeFunctor extends Functor>, R> { + public static interface TreeFunctor extends Functor, R> { } public static class ArrayBuildingTreeFunctor implements TreeFunctor, ToJava { @@ -67,11 +68,11 @@ public class Tree public void toJava(StringBuffer sb) { sb.append("new Tree.ArrayBuildingTreeFunctor()"); } public String toString() { return ""; } - public T[] invoke(Iterable> t) { + public T[] invoke(Tree t) { ArrayList ret = new ArrayList(); for(Tree tc : t) { if (tc.head() != null && tc.head() instanceof Functor) - ret.add(((Functor,Object>)tc.head()).invoke(tc.children())); + ret.add(((Functor,Object>)tc.head()).invoke(tc)); else if (tc.numChildren() == 0) ret.add(tc.head()); else { diff --git a/src/edu/berkeley/sbp/bind/Bindable.java b/src/edu/berkeley/sbp/bind/Bindable.java index 0e2da13..4a10187 100644 --- a/src/edu/berkeley/sbp/bind/Bindable.java +++ b/src/edu/berkeley/sbp/bind/Bindable.java @@ -20,6 +20,7 @@ public abstract class Bindable implements ToJava { public abstract Annotation[][] getArgAnnotations(); public abstract String[] getArgNames(); + public abstract Class[] getArgTypes(); public static Bindable create(Object o) { if (o instanceof Class) return new BindableClass((Class)o); @@ -37,6 +38,7 @@ public abstract class Bindable implements ToJava { public Object impose(Object[] fields) { return Reflection.impose(_method, fields); } public Annotation[][] getArgAnnotations() { return _method.getParameterAnnotations(); } public String[] getArgNames() { return new String[_method.getParameterTypes().length]; } + public Class[] getArgTypes() { return _method.getParameterTypes(); } public void toJava(StringBuffer sb) { sb.append("Bindable.create("); sb.append(_method.getDeclaringClass().getName().replace('$','.')); @@ -57,6 +59,7 @@ public abstract class Bindable implements ToJava { public Object impose(Object[] fields) { return Reflection.impose(_constructor, fields); } public Annotation[][] getArgAnnotations() { return _constructor.getParameterAnnotations(); } public String[] getArgNames() { return new String[_constructor.getParameterTypes().length]; } + public Class[] getArgTypes() { return _constructor.getParameterTypes(); } public void toJava(StringBuffer sb) { sb.append("Bindable.create("); sb.append(_constructor.getDeclaringClass().getName().replace('$','.')); @@ -87,6 +90,13 @@ public abstract class Bindable implements ToJava { ret[i] = fields[i].getName(); return ret; } + public Class[] getArgTypes() { + Field[] fields = _class.getFields(); + Class[] ret = new Class[fields.length]; + for(int i=0; i { public CharParser(Union u) { super(u, new CharTopology()); } - public Forest shiftToken(Character ct, Location loc) { - return Forest.create(loc, ct.toString(), null, false, false, null); + public Forest shiftToken(Location oldloc, Character ct, Location newloc) { + return Forest.create(new Input.Region(oldloc, newloc), ct.toString(), null, false, false, null); } } diff --git a/src/edu/berkeley/sbp/meta/MetaGrammar.java b/src/edu/berkeley/sbp/meta/MetaGrammar.java index acda011..78c4b72 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammar.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammar.java @@ -75,16 +75,17 @@ public class MetaGrammar { public static class Target { public int[] buildSequence(Production p) { Annotation[][] annotations = _bindable.getArgAnnotations(); + Class[] types = _bindable.getArgTypes(); String[] names = _bindable.getArgNames(); - String name = _bindable.getSimpleName(); - int len = annotations.length; - int ofs = 0; + String name = _bindable.getSimpleName(); + int len = annotations.length; + int ofs = 0; bind.arg[] argtags = new bind.arg[len]; for(int i=0; i0 && types[0]==Input.Region.class; + for(int i=0; i> t) { + public Object invoke(Tree t) { if (_israw) return _bindable.impose(new Object[] { t }); ArrayList ret = new ArrayList(); for(Tree tc : t) { if (tc.head() != null && tc.head() instanceof Functor) - ret.add(((Tree.TreeFunctor)tc.head()).invoke(tc.children())); + ret.add(((Tree.TreeFunctor)tc.head()).invoke(tc)); else if (tc.numChildren() == 0) ret.add(tc.head()); else { @@ -200,8 +207,14 @@ public class MetaGrammar { Object[] o = (Object[])ret.toArray(new Object[0]); int max = 0; for(int i=0; i 0 && + _bindable.getArgTypes()[0]==Input.Region.class) + max++; Object[] o2 = new Object[max+1]; for(int i=0; i 0 && + _bindable.getArgTypes()[0]==Input.Region.class) + o2[0] = t.getRegion(); return _bindable.impose(o2); } } @@ -211,7 +224,7 @@ public class MetaGrammar { public static Union make(Tree t, String s) { return make(t, s, new AnnotationGrammarBindingResolver(MetaGrammarBindings.class)); } public static Union make(Tree t, String s, GrammarBindingResolver rm) { Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t.children()); + MetaGrammarBindings.GrammarNode g = (MetaGrammarBindings.GrammarNode)red.invoke(t); return g.build(s, rm); } diff --git a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java index b70ddb8..1d5eeb7 100644 --- a/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java +++ b/src/edu/berkeley/sbp/meta/MetaGrammarBindings.java @@ -366,7 +366,7 @@ public class MetaGrammarBindings { public Context(Tree t, GrammarBindingResolver rm) { this.rm = rm; Tree.TreeFunctor red = (Tree.TreeFunctor)t.head(); - this.grammar = (GrammarNode)red.invoke(t.children()); + this.grammar = (GrammarNode)red.invoke(t); } public Union peek(String name) { return map.get(name); } public void put(String name, Union u) { map.put(name, u); } diff --git a/src/edu/berkeley/sbp/misc/Cartesian.java b/src/edu/berkeley/sbp/misc/Cartesian.java index 6627fbf..676a4cf 100644 --- a/src/edu/berkeley/sbp/misc/Cartesian.java +++ b/src/edu/berkeley/sbp/misc/Cartesian.java @@ -51,7 +51,7 @@ public class Cartesian { public int getRow() { return row; } public Location(int col, int row) { this.row = row; this.col = col; } public int compareTo(Input.Location loc) throws ClassCastException { - if (!(loc instanceof Cartesian)) throw new ClassCastException(); + if (!(loc instanceof Cartesian.Location)) throw new ClassCastException(loc.getClass().getName()); Location c = (Location)loc; if (row < c.row) return -1; if (row > c.row) return 1; diff --git a/src/edu/berkeley/sbp/misc/Demo.java b/src/edu/berkeley/sbp/misc/Demo.java index 0bafd76..566e05d 100644 --- a/src/edu/berkeley/sbp/misc/Demo.java +++ b/src/edu/berkeley/sbp/misc/Demo.java @@ -48,7 +48,7 @@ public class Demo { // below is ugly voodoo which will go away very soon. ignore it. Tree.TreeFunctor tf = (Tree.TreeFunctor)tree.head(); - Math.Expr e = (Math.Expr)tf.invoke(tree.children()); + Math.Expr e = (Math.Expr)tf.invoke(tree); // above is ugly voodoo which will go away very soon. ignore it. System.out.println("done!"); diff --git a/src/edu/berkeley/sbp/misc/RegressionTests.java b/src/edu/berkeley/sbp/misc/RegressionTests.java index c91a369..e4aa179 100644 --- a/src/edu/berkeley/sbp/misc/RegressionTests.java +++ b/src/edu/berkeley/sbp/misc/RegressionTests.java @@ -62,7 +62,7 @@ public class RegressionTests { System.err.println("expanding..."); Tree t = r2.expand1(); - TestCase[] expanded = (TestCase[])((Functor)t.head()).invoke(t.children()); + TestCase[] expanded = (TestCase[])((Functor)t.head()).invoke(t); System.err.println("executing..."); for(TestCase tc : expanded) { tc.execute(); diff --git a/src/edu/berkeley/sbp/util/TreeBuilder.java b/src/edu/berkeley/sbp/util/TreeBuilder.java index fbdd107..9fae34f 100644 --- a/src/edu/berkeley/sbp/util/TreeBuilder.java +++ b/src/edu/berkeley/sbp/util/TreeBuilder.java @@ -7,8 +7,8 @@ public abstract class TreeBuilder implements Invokable,Boolean public boolean toss; protected T head; public TreeBuilder(boolean toss) { this.toss = toss; } - public abstract void start(T head, Input.Location loc); - public abstract void finish(T head, Input.Location loc); + public abstract void start(T head, Input.Region loc); + public abstract void finish(T head, Input.Region loc); public abstract void addTree(Tree t); public void invoke(Forest.Body bod, Boolean o, Integer i) { if (i==null) {