}
static <T> Forest<T> singleton(Input.Location loc, Position p) {
- return create(loc, null, new Forest[] { }, false, true, p); }
+ return create(loc, null, new Forest[] { }, new Object[0], false, true, p); }
static <T> Forest<T> singleton(Input.Location loc, Forest<T> body, Position p) {
//return create(loc, null, new Forest[] { body }, false, true, p);
return body;
}
- static <T> Forest<T> leaf(Input.Location loc, T tag, Position p) { return create(loc, tag, null, false, false, p); }
- public static <T> Forest<T> create(Input.Location loc, T tag, Forest<T>[] tokens, boolean unwrap, boolean singleton, Position p) {
- return new MyBody<T>(loc, tag, tokens, unwrap, singleton, p);
+ static <T> Forest<T> leaf(Input.Location loc, T tag, Position p) { return create(loc, tag, null, null, false, false, p); }
+ public static <T> Forest<T> create(Input.Location loc, T tag, Forest<T>[] tokens, Object[] labels, boolean unwrap, boolean singleton, Position p) {
+ return new MyBody<T>(loc, tag, tokens, labels, unwrap, singleton, p);
}
// Body //////////////////////////////////////////////////////////////////////////////
if (i==tokens.length-1 && unwrap) {
tokens[i].edges(n);
} else {
- n.edge(tokens[i]);
+ n.edge(tokens[i], labels==null?null:labels[i]);
}
}
}
private final Input.Location location;
private final T tag;
private final Forest<T>[] tokens;
+ private final Object[] labels;
private final boolean unwrap;
private final boolean singleton;
private final Sequence.Position reduction;
- private MyBody(Input.Location loc, T tag, Forest<T>[] tokens, boolean unwrap, boolean singleton, Position reduction) {
+ private MyBody(Input.Location loc, T tag, Forest<T>[] tokens, Object[] labels, boolean unwrap, boolean singleton, Position reduction) {
this.location = loc;
this.tag = tag;
this.tokens = tokens==null ? emptyForestArray : new Forest[tokens.length];
this.unwrap = unwrap;
this.singleton = singleton;
this.reduction = reduction;
+ this.labels = labels;
}
public void expand(final int i, final TreeMaker<T> h) {
} else {
tokens[i].visit(new TreeMaker<T>(h.toss) {
public void start(T head, Input.Location loc) { }
- public void addTree(Tree<T> t) { toks.add(t); }
+ public void addTree(Tree<T> t, Object label) { toks.add(t); labs.add(label); }
public void finish(T head, Input.Location loc) {
int old = h.toks.size();
- h.addTree(new Tree<T>(loc, head, toks.toArray(tree_hint)));
+ h.addTree(new Tree<T>(loc, head, toks.toArray(tree_hint), labs.toArray(string_hint)), labels==null?null:labels[i]);
expand(i+1, h);
while(h.toks.size() > old) h.toks.remove(h.toks.size()-1);
+ while(h.labs.size() > old) h.labs.remove(h.labs.size()-1);
}
}, null, null);
}
GraphViz.Node n = gv.createNode(this);
n.label = "?";
n.color = "red";
- for(Forest f : hp) n.edge(f);
+ for(Forest f : hp) n.edge(f, null);
return n;
}
private static class TreeMaker2<T> extends TreeMaker<T> {
private TreeConsumer<T> tc;
public TreeMaker2(boolean toss, TreeConsumer<T> tc) { super(toss); this.tc = tc; }
- public void finish(T head, Input.Location loc) { tc.addTree(new Tree<T>(loc, head, toks.toArray(tree_hint)));; }
+ public void finish(T head, Input.Location loc) { tc.addTree(new Tree<T>(loc, head, toks.toArray(tree_hint), labs.toArray(string_hint)));; }
public void start(T head, Input.Location loc) { }
- public void addTree(Tree<T> t) { toks.add(t); }
+ public void addTree(Tree<T> t, Object label) { toks.add(t); labs.add(label); }
}
- private static abstract class TreeMaker<T> implements Invokable<Forest.Body<T>,Boolean,Integer>, TreeConsumer<T> {
+ private static abstract class TreeMaker<T> implements Invokable<Forest.Body<T>,Boolean,Integer>/*, TreeConsumer<T>*/ {
public ArrayList<Tree<T>> toks = new ArrayList<Tree<T>>();
+ public ArrayList<Object> labs = new ArrayList<Object>();
private boolean toss;
protected T head;
public TreeMaker(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 addTree(Tree<T> t);
+ public abstract void addTree(Tree<T> t, Object label);
public void invoke(Forest.Body<T> bod, Boolean o, Integer i) {
if (i==null) {
ArrayList<Tree<T>> toks = this.toks;
this.toks = new ArrayList<Tree<T>>();
+ ArrayList<Object> labs = this.labs;
+ this.labs = new ArrayList<Object>();
bod.expand(0, this);
this.toks = toks;
+ this.labs = labs;
} else {
bod.expand(i, this);
}
// Statics //////////////////////////////////////////////////////////////////////////////
private static Tree[] tree_hint = new Tree[0];
+ private static String[] string_hint = new String[0];
private static final Forest[] emptyForestArray = new Forest[0];
protected String headToString() { return null; }