- public abstract <B,C> void visit(Invokable<Forest.Body<T>,B,C> ivbc, B b, C c);
- 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 start(T head, Input.Location loc) { }
- public void addTree(Tree<T> t) { toks.add(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>>();
- 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 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>>();
- bod.expand(0, this);
- this.toks = toks;
- } else {
- bod.expand(i, this);
- }
+ // GraphViz, ToInt //////////////////////////////////////////////////////////////////////////////
+
+ public int toInt() {
+ if (hp.size()==1) return hp.iterator().next().toInt();
+ return super.toInt();
+ }
+ public boolean isTransparent() { return hp.size()==1; }
+ public boolean isHidden() { return hp.size()==0; }
+ public void edges(GraphViz.Node n) {
+ if (hp.size()==1) { hp.iterator().next().edges(n); return; }
+ for(Forest f : hp) f.edges(n);
+ }
+ public GraphViz.Node toGraphViz(GraphViz gv) {
+ //if (hp.size()==0) return null;
+ if (hp.size()==1) return hp.iterator().next().toGraphViz(gv);
+ if (gv.hasNode(this)) return gv.createNode(this);
+ GraphViz.Node n = gv.createNode(this);
+ n.label = "?";
+ n.color = "red";
+ for(Forest f : hp) n.edge(f, null);
+ return n;