public static Sequence drop(Element[] e, boolean lame) { return new Constant.Drop(e, null, null, lame); }
/** after matching the sequence, insert a constant into the output tree */
- public static Sequence constant(Element[] e, Object o, HashSet<Sequence> and, HashSet<Sequence> not) { return new Constant(e, o, and, not); }
+ public static Sequence constant(Element[] e, Object o) { return new Constant(e, o, null, null); }
/** after matching the sequence, place the result of the <tt>idx</tt>th match in the output tree */
- public static Sequence singleton(Element[] e, int idx, HashSet<Sequence> and, HashSet<Sequence> not) { return new Singleton(e, idx, and, not); }
+ public static Sequence singleton(Element[] e, int idx) { return new Singleton(e, idx, null, null); }
/**
* after matching the sequence, create the specified output tree
protected final Element[] elements;
- HashSet<Sequence> needed;
- HashSet<Sequence> hated;
- final HashSet<Sequence> needs;
- final HashSet<Sequence> hates;
+ final HashSet<Sequence> needed = new HashSet<Sequence>();
+ final HashSet<Sequence> hated = new HashSet<Sequence>();
+ final HashSet<Sequence> needs = new HashSet<Sequence>();
+ final HashSet<Sequence> hates = new HashSet<Sequence>();
public boolean lame = false;
final Position firstp;
public Iterator<Element> iterator() { return new ArrayIterator<Element>(elements); }
protected Sequence(Element[] elements, HashSet<Sequence> and, HashSet<Sequence> not) {
- this.needs = and==null ? new HashSet<Sequence>() : and;
- this.hates = not==null ? new HashSet<Sequence>() : not;
- if (this.needs != null)
- for(Sequence s : this.needs)
- (s.needed==null?(s.needed=new HashSet<Sequence>()):s.needed).add(this);
- if (this.hates != null)
- for(Sequence s : this.hates)
- (s.hated==null?(s.hated=new HashSet<Sequence>()):s.hated).add(this);
+ if (and!=null) for(Sequence s : and) { needs.add(s); s.needed.add(this); }
+ if (not!=null) for(Sequence s : not) { hates.add(s); s.hated.add(this); }
this.elements = elements;
this.firstp = new Position(0);
}
if (!drops[i])
if (idx==-1) idx = i;
else throw new Error("multiple non-dropped elements in sequence: " + Sequence.drop(expansion,false));
- if (idx != -1) ret = Sequence.singleton(expansion, idx, and, not);
- else {
- ret = Sequence.drop(expansion, false);
- for(Sequence s : and) ret = ret.and(s);
- for(Sequence s : not) ret = ret.not(s);
- }
+ if (idx != -1) ret = Sequence.singleton(expansion, idx);
+ else ret = Sequence.drop(expansion, false);
+ for(Sequence s : and) ret = ret.and(s);
+ for(Sequence s : not) ret = ret.not(s);
}
set.add(ret);
if (this.noFollow != null) ret.noFollow = new Atom.Invert(new Atom.Infer(this.noFollow));