/** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
class Phase<Tok> implements Invokable<State, Forest, Phase<Tok>.Node>, IntegerMappable, GraphViz.ToGraphViz, Iterable<Phase.Node> {
/** corresponds to a positions <i>between tokens</i> the input stream; same as Tomita's U_i's */
class Phase<Tok> implements Invokable<State, Forest, Phase<Tok>.Node>, IntegerMappable, GraphViz.ToGraphViz, Iterable<Phase.Node> {
/** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
public Phase phase() { return Phase.this; }
/** which Phase this Node belongs to (node that Node is also a non-static inner class of Phase) */
public Phase phase() { return Phase.this; }
- private HashSet<Forest.Ref> resultMap = new HashSet<Forest.Ref>();
- public Iterable<Forest.Ref> results() { return resultMap; }
+ private HashSet<Forest.Many> resultMap = new HashSet<Forest.Many>();
+ public Iterable<Forest.Many> results() { return resultMap; }
public FastSet<Node> parents() { return set; }
public boolean merge(Node parent, Forest result) {
// FIXME: inefficient!
public FastSet<Node> parents() { return set; }
public boolean merge(Node parent, Forest result) {
// FIXME: inefficient!
- for(Forest result : results())
- for(Node child : ((Forest.Ref<?>)result).parents) {
+ HashSet<Forest> rr = new HashSet<Forest>();
+ for(Forest result : results()) rr.add(result);
+ for(Forest result : rr)
+ for(Node child : ((Forest.Many<?>)result).parents) {
if (only != null && child!=only) continue;
holder[pos] = result;
if (pos==0) child.finish(r, r.rewrite(new Input.Region(child.phase().getLocation(), phase().getLocation())), target);
if (only != null && child!=only) continue;
holder[pos] = result;
if (pos==0) child.finish(r, r.rewrite(new Input.Region(child.phase().getLocation(), phase().getLocation())), target);