public static final Sequence empty = new Sequence.Constant.Empty();
/** after matching the sequence, do not add anything to the output tree */
- public static Sequence drop(Element[] e, HashSet<Sequence> and, HashSet<Sequence> not, boolean lame) { return new Constant.Drop(e, and, not, lame); }
+ 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); }
}
Element[] expansion = o2;
Sequence ret = null;
- if (dropAll || lame) ret = Sequence.drop(expansion, and, not, lame);
+ if (dropAll || lame) {
+ ret = Sequence.drop(expansion, lame);
+ for(Sequence s : and) ret = ret.and(s);
+ for(Sequence s : not) ret = ret.not(s);
+ }
else if (unwrap) ret = new Sequence.Unwrap(expansion, drops, and, not);
else if (tag!=null) ret = Sequence.rewritingSequence(tag, expansion, drops, and, not);
else {
for(int i=0; i<expansion.length; i++)
if (!drops[i])
if (idx==-1) idx = i;
- else throw new Error("multiple non-dropped elements in sequence: " + Sequence.drop(expansion,null,null,false));
+ 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, and, not, false);
+ 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));